吃透Modbus通信,让工业设备数据传输效率提升,让工业设备数据传输效率提升

2025-12-14

吃透Modbus通信,让工业设备数据传输效率提升50%(1)


     RS485不是通信协议,而是一种接口标准,它还有2个兄弟:RS232和RS422。

图片

     485接口正确的接线方法是手拉手菊花链式接法,如果通信距离较远(比如超过100米),应该在网络的起始端和末尾端各并接一个120Ω的电阻,以减少信号在两端的反射。正常来说,超过100米,就要考虑增加终端电阻,超过1000米,就要考虑增加RS485总线中继器。

图片

    一条RS485总线上可以挂载多少个RS485设备?具体的数量由RS485转换器的负载能力决定,正常来说,RS485芯片的负载能力有三个级别,这三个级别依次可以挂载32台、128台和256台。通常,我们使用的RS485转换器负载能力是32台。

     ModbusRTU是应用层一种通信协议,RS485是物理层的一种接口标准。我们常说的ModbusRTU通信,通常是指基于RS485,但是ModbusRTU协议也可以基于RS232/RS422,甚至可以基于以太网TCP/UDP。同时,RS485也不是ModbusRTU的专属,任何协议都可以基于RS485传输,至于能不能实现一主多从,要看协议层面有没有设计设备地址。一主多从的实现有两个条件,**是物理层支持,第二是应用层支持,两者缺一不可。比如,我们物理层使用RS232,即使应用层使用ModbusRTU协议,也无法实现一主多从。(RS232是一发一收工作模式)

图片

      通信速度主要受到两个因素的影响:数据量大小和硬件层的速度。数据量大小指的是需要传输的数据多少,而硬件层的速度则跟通信设备和网络基础息息相关。硬件层的速度与波特率及通信距离都有关系,因为一主多从轮询机制必然会带来通信效率的降低。

      通信协议有三种类型:一种是标准协议,比如Modbus协议等。一种是品牌协议,比如西门子S7、三菱MC协议等。还有一种是自定义协议。ModbusRTU的通用报文格式如下:

图片

【1】从站地址:这个报文发送给谁或来自于谁。

【2】功能码:要干什么,读/写/线圈/寄存器。

图片

【3】数据部分:配合功能码提供对应的参数。

【4】校验部分:保证报文的正确性和完整性。

                    读取输出线圈

图片

【1】从站地址:0x01表示读取1号从站的数据。
【2】功能码:0x01表示读取的是输出线圈存储区。
【3】起始地址:十六进制0x00 0x13对应十进制为19,表示从19号线圈开始读取,这个19对应的Modbus地址为00020。 (注:Modbus地址是“偏移+1”的编号规则,十六进制0x13(十进制19)是线圈的“实际偏移地址”,Modbus地址需在偏移基础上加1,即19+1=20,对应线圈地址00020(线圈地址通常以000xx格式表示)。
a. 地址类型区分:Modbus中线圈(离散输出)的地址范围默认以“00001”为起始(而非0),这里的“00001”对应实际偏移地址0(十六进制0x00)。
b. 换算逻辑:实际偏移地址(十进制N)→ Modbus线圈地址 = N + 1。这里N=19(0x13),所以19+1=20,格式化为5位就是00020。)

【4】线圈数量:十六进制0x00 0x1B对应十进制的27,表示读取线圈数量为27。
【5】CRC校验:0x8D 0x4C是对前面所有数据进行CRC校验后的结果。
      主站发送这段报文是想要读取1号从站输出线圈存储区,Modbus地址从 00020-00046,共27个线圈的状态值。当1号从站收到这段报文后,知道了主站的意图,便会响应,响应报文如下:

图片
【1】从站地址:0x01表示由1号从站响应的报文。

【2】功能码:0x01表示响应的是0x01功能码报文。
【3】字节计数:0x04表示返回的数据共有4个字节。
【4】字节1至字节4:返回的具体数据分别为0xCD、0x6B、0xB2、0x05,这4个字节对 应32个线圈值,前面的27个线圈值即对应00020-00046的值。
【5】CRC校验:0x00 0x02是对前面所有数据进行CRC校验后的结果。主站收到响应报文便获取到了自己要的数据,具体对应关系如下:
0xCD=1100 1101 对应 00027-00020
0x6B=0110 1011 对应 00035-00028
0xB2=1011 0010 对应 00043-00036
0x05=0000 0101 对应 00051-00044
解释:将字节   0xCD(11001101)   转换为 Modbus 地址,核心是先明确 Modbus 地址类型(位地址/寄存器地址),再按“字节与地址的映射规则”换算——Modbus 无通用“字节直接转地址”标准,关键看设备定义的“起始基准+地址类型”。
最常见场景:转换为 Modbus 位地址(离散输入/线圈,1 位=1 个地址)
Modbus 中 1 字节=8 个二进制位,每个位对应 1 个“位地址”(如离散输入 1xxx 区、线圈 0xxx 区),换算分 3 步:
a. 确定字节的“基础地址”
假设设备定义:该字节对应的 起始位地址基准 为 N(需查设备手册,比如常见基准 20、100 等),且 1 字节占 8 个连续位地址。
b. 按位分配地址
字节   0xCD=11001101   包含 8 位(位 0~位 7),对应地址为:
位 0→N、位 1→N+1、位 2→N+2、位 3→N+3、位 4→N+4、位 5→N+5、位 6→N+6、位 7→N+7
例:若 N=20,则 8 个位地址为 20~27(即你之前看到的“00020-00027”,逆序写为 27-20 是标注习惯)。
c. 补充地址区前缀
离散输入(只读)加前缀 1→10020~10027;线圈(可读写)加前缀 0→00020~00027(设备常省略前缀,直接写 00020~00027)
。】
     至此,就完成了一次Modbus通信交互。



阅读3
分享
写评论...