基于RS485通信的Modbus通信协议

2023-05-16

 通信可以分为两个方面:

硬件层:RS485解决的是数据传输问题,也就是说如何将一个“0”或“1”传输到另外一端。(保证了数据可以转移到另一端)

软件层:modbus是在硬件基础上的传输协议,解决的是数据传输的含义或意义。

MCU要想实现RS485通信,必须借助电平转换芯片。 因为MCU是TTL电平信号,RS485是差分信号,如何将单端信号转换成差分信号就需要电平转换芯片。

TTL电平在传输信号特性逻辑“0”对应的电气信号为0V,逻辑“1”对应的电气信号为5V。

RS485通常有两根差分信号线,A和B,RS485的电平特性规定逻辑“0”指的是信号B的电压>A的电压,逻辑“1”指的是信号A的电压>信号B的电压。

TTL电平转换为RS485差分信号之后,抗干扰能力得到一定的增强,传输距离得到了很大的提高。

要想实现两个MCU能进行RS485通信,二者必须都有一个电平转换芯片。

MCU二者连接一般使用的是双绞线,在信号传输过程中,在一根线上出现的干扰一般也会在另一根线上出现,二者基本可以抵消,所以抗干扰能力大大增强。

结合所描述的内容,也就是说RS485通信实际上是硬件层的一个通信标准,它解决了TTL中的0和1如何通过485芯片转成差分信号之后,然后再传输到另一端的过程。

(两线制)差分信号线不可能同时传输数据,是一种半双工的通信,如果是四线制RS485,也可以是全双工通信,同时通信方式也和选择的接口芯片有关系。

下图是485其中的一种芯片电路:

RE和DE是控制传输方向的, RO信号的输出,DI信号的输入。和UART的唯一区别就是需要控制方向。

通信协议主要是为了不同厂商能够遵循相同的通信约定进行相互连接,工业上有一个标准叫做modbus通信协议,接下来可以了解一下:

基于RS485的modbus通信协议的一个硬件环境:一般遵循的是主从通信,一般来讲系统中会有一个主机,如果我们借助RS485通信,在用二线制的半双工的通信时,它支持一主多从的通信方式,也就是说,主机上有两根信号线,在信号线上可以挂多个从机。

 硬件层借助RS485,软件层借助Modbus协议。

注意:

(1)在整个总线系统通信过程只有一台设备是主机,主从通信方式。

(2)系统中的从机不可以主动的向主机发送数据。

(3)系统上电之后,主机和从机所有的设备都应该处于监听总线的状态,也就是接收状态。

(4)如果想要发送数据实现通信,都必须由主机主动发起通信(任何一次的通信或数据交换)。

RS485并没有总线仲裁机制,只支持主从通信,在这个过程中,并没有优先级的设定。RS485支持问答机制:主机询问(轮询),从机应答。

主机要发送数据的时候需要注意:主机首先转换为发送模式,发送完之后立即转为接收模式,等待接收从机的应答。(模式切换借助芯片中的RE和DE引脚)

主机的寻址帧一般有两种传输方式,RTU(16进制方式)、ASCII。

modbus通信报文或数据包格式:地址码+功能码+数据区+校验码(CRC)

通信地址:1-127(不同的设备有不同的地址)指定地址0的指令是广播指令,所有收到指令的设备都会运行,不过不回应指令。

 通过Modbus poll和Modbus slave实现主从机的通信,设备ID为1,选用03功能码(读单个寄存器)实现下面的功能。软件链接:

链接:https://pan.baidu.com/s/1tvIJXZsEYJFsvk8yX6W5RA?pwd=d4w7 
提取码:d4w7 

 从图中可以分析理解03功能码(从从机读单个或多个数据):

 那么主机发送从机接收是如何识别这一包数据的呢?

我们靠的是时间间隔,规定了一包数据和一包数据最大的时间间隔为3.5个字符时间,假如是9600波特率,一个字符是10bit,3.5字符是35bit,计算出最大时间间隔W为:(3.5*10)/9600=3.6ms;一个包不同字符之间最大间隔时间不能超过1.5个字符时间。

寄存器地址只是为了统一变量的数据,具体变量可以自定义。

06功能码:写单个寄存器(向从机写数据)地址码(8bit)+功能码(8bit)+寄存器地址(16bit)+数据(19bit)+CRC(16bit)

16功能码 :写多个寄存器地址(向从机写多个数据)

如果对这篇博客有任何问题,可以评论区留言哈😘。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于RS485通信的Modbus通信协议 的相关文章

  • CRC-16 / MODBUS 校验计算方法

    CRC 16 MODBUS xff1a 1 xff09 CRC寄存器初始值为 FFFF xff1b 即16个字节全为1 xff1b 2 xff09 CRC 16 MODBUS的多项式A001H 1010 0000 0000 0001B H
  • DSP28335 高速modbus代码实现

    程序特点 不使用while循环速度尽可能快速除去程序运行时间 xff0c 没有多余等待时间优化CRC校验方式 头文件modbus h span class token macro property span class token dire
  • sockjs-web实时通信协议

    sockjs web实时通信应用解决方案 socksjs 客户端和服务器端api尽可能简洁 尽量靠近websocket api 支持服务端扩展和负载均衡技术 传输层应该全面支持跨域通信 如果受到代理服务器的限制 传输层能优雅地从一种方式回退
  • FreeModbus 移植笔记- 1-认识FreeModbus

    FreeModbus 移植笔记 目录 1 FreeMODBUS介绍 2 FreeMODBUS官网及源码下载地址 3 移植之前的准备 3 1 FreeModbus V1 6 3 2 Modbus 3 3 Modbus Registers 3
  • Modbus CRC和LRC算法研究及代码实现

    一 CRC 循环冗余校验 1 CRC16实现流程 XOR 异或 N 字节的信息位 POLY CRC16 多项式计算 1010 0000 0000 0001 生成多项式 1 x2 x15 x16 在CRC16中 发送的第一个字节位低字节 2
  • 值得收藏 Modbus RTU 协议详解

    值得收藏 Modbus RTU 协议详解 目录 值得收藏 Modbus RTU 协议详解 Modbus是什么 Modbus分类 Modbus通讯过程 Modbus RTU协议数据帧结构 功能码01 读线圈状态 功能码02 读离散量输入 功能
  • 集线器、交换机和路由器(图解)

    一 物理层 使用 MAC 解决设备的身份证问题 1 通信的原始时代 很久很久之前 你不与任何其他电脑相连接 孤苦伶仃 直到有一天 你希望与另一台电脑 B 建立通信 于是你们各开了一个网口 用一根网线连接了起来 用一根网线连接起来怎么就能 通
  • modbus之crc16计算代码

    这边提供两种方式 第1种是查表法方式 速度会快一点 但是需要多占用一些空间 第二种是纯计算方式 速度相对第一种会慢一点 但是比较省空间 代码如下 static const uint16 t crc table 0X0000 0XC0C1 0
  • ModbusTcp和ModbusRtu

    ModbusTcp和ModbusRtu 自己实现的modbusTCP主从站和RTU主从站 纯C语言实现 未调用第三方库 工程下载链接 modbusTcp主从站和RTU主从站 1 何为Modbus通信协议 1 1 Modbus基本介绍 Mod
  • C# Modbus Rtu实现

    Modbus Rtu的实现与Modbus Tcp的实现类似 C ModBus Tcp的学习及Master的实现 我们还是需要借用一个开源库NModbus4 在vs中 打开NuGet管理器 安装NModbus4 具体实现 具体实现与之前的Mo
  • HTTPS 原理详解

    转自 https baijiahao baidu com s id 1570143475599137 wfr spider for pc 前言 HTTPS 全称 HyperText Transfer Protocol over Secure
  • 【Modbus】 RTU CRC校验码计算方法

    Modbus是美国Modicon公司 即现在的Schneider Electric公司 于1979年开发的一种通信协议 其目的是采用一根双绞线实现多个设备之间的通信 Modbus 协议采用问答式的通信方式 具有简单 硬件便宜 通用性强 使用
  • Modbus RTU 工业通讯技术实现

    Modbus 是一个工业上常用的通讯协议 一种通讯约定 ModBus 协议是应用层报文传输协议 OSI 模型第7层 它定义了一个与通信层无关的协议数据单元 PDU 即PDU 功能码 数据域 ModBus 协议能够应用在不同类型的总线或网络
  • Tcp建立连接为什么需要三次握手

    前言 众所周知tcp传输层协议在建立连接的时候需要三次才能建立起一个真正的可靠连接 可是为什么是三次呢 不可以是两次 四次等等呢 可以自己思考一番 带着疑问可以看下文 三次握手 在 计算机网络 一书中其中有提到 三次握手的目的是 为了防止已
  • 计算机网络中的通信子网主要有哪些功能?

    计算机网络中的通信子网主要具有以下功能 负责全网的数据通信 通信子网通过使用各种通信协议和传输控制功能 能够确保数据从一台主机安全 准确地传输到另一台主机 这包括数据的封装 解封装 传输控制 差错控制等过程 完成各种网络数据的处理 转换和交
  • CRC-CCITT 到 CRC16 Modbus 实施

    我在使用 PHP 生成 modbus CRC16 代码时遇到很多麻烦 我在互联网上找到了很多不同的代码 但我尝试过它们 但由于某种原因我没有得到正确的结果 我找到了用于生成 CRC16 CCITT 的 PHP 代码 我已经将查找表更改为mo
  • 需要 modbus Java 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要带有源代码的简单 modbus Java 库 我在谷歌上找到了 但有 jar 文件 并且没有强大的
  • 计算 Modbus RTU CRC 16

    我正在实现一个软件 可以通过串行方式读取和写入 Modbus RTU 协议中的数据 为此 我需要计算字节字符串末尾的两个 CRC 字节 但我无法执行此操作 在网上搜索 我发现两个函数似乎可以正确计算 CRC WORD CRC16 const
  • 从 Android 向 PLC 发送布尔值

    我能够与 PLC 建立连接以从中读取数据 现在有一个问题 那就是我必须编写一种方法来修改PLC中的数据 为了实现这一点 我必须向 PLC 发送两个值 一个 int 值和一个 boolean 值 我通过 net wimpi modbus 包中
  • pymodbus TcpClient超时

    我遇到 pymodbus TcpClient 超时问题 import logging from pymodbus client sync import ModbusTcpClient logging basicConfig log logg

随机推荐