良许Linux教程网 干货合集 modbus的一些踩坑笔记

modbus的一些踩坑笔记

最近与第三方设备进行通信时使用了modbus协议。在此对使用过程中的问题和注意事项进行总结和分享,旨在避免大家遇到相同问题时陷入困境。需要说明的是,本文不会对modbus协议进行系统的解说,而是重点描述使用过程中的问题和注意事项,以基于RS485的modbus-RTU为例进行说明。

1、字节序问题

modbus协议采用大端字节序进行报文传输,这一点非常重要。如果字节序不正确,会导致无法解析和组合多字节数据。

大端字节序表示高字节优先发送。例如,对于一个word大小的数据0x1234,在打包成一帧modbus协议数据时,规定数据域中先发送0x12,然后发送0x34。其他多字节数据类型和CRC16校验的传输顺序也是相同的。

在总线上,发送方和接收方都必须遵循大端字节序的发送格式。

2、单播与广播

在modbus总线上采用单播和广播的方式进行通信,同一总线上一般都只有一个主机、多个从机;在同一时间内一个主机可以通过地址区分与想要的从机通信,这边是单播方式;同时modbus总线也可以一个主机以广播的方式与多个从机进行通信。

平时我们也称这种通信方式为主从通信(Maser/Slave),主机发送请求消息,当从机接收到正确消息后响应请求返回给主机;同时主机也可以直接发消息修改从机的数据,实现主从数据的双向读写。

3、与PLC通信协议

具体与什么设备通信,只是不同的设备所支持的功能码不同,或相关的叫法和习惯不同,具体需要根据相应的设备来进行区分了,但都符合modbus协议标准。

在跟PLC进行通信的时候其给过来的协议会指明相应的PLC地址而此地址与实际发送modbus报文数据帧中的寄存器等地址并不是一致的。

如上图所示PLC工程师一般都会以PLC地址为基础给出协议,而很多其他软件工程师对接的时候,以为PLC地址(也叫PLC的存储地址)便是modbus报文数据帧中的寄存器地址,其实两者并不相等。

像西门子的PLC地址其每个功能码所对应的modbus报文地址都是从0开始,即从0x0000~0xFFFF;所以你可以把PLC地址看成是一种绝对地址,而modbus报文地址仅仅只是在该功能码下的一个相对地址。

如采用03H功能码读取PLC存储地址是40002的寄存器,而此时modbus报文中的寄存器地址为01。

image-20230726231239417
image-20230726231239417

3、线圈和寄存器的理解

由于早期PLC对于一些布尔量均是用于控制一些继电器或者接触器等等,这些器件主要是通过线圈来进行吸合与弹开,后面叫法也就沿用下来了,同时线圈分配输入线圈和输出线圈,跟我们平时MCU的IO引脚的电平读写有点类似。

而对于一些非bool类型的数据均采用寄存器的概念来继续传输,相信这样便可以对PLC中的这些名字进一步理解了。

4、RS485终端电阻

对于较长距离的RS485通信,采用线型连接并增加终端120Ω匹配电阻来降低干扰增加总线通信的稳定性,如下图所示:

image-20230726231242257
image-20230726231242257

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部