李sir_Blog

博客园 首页 联系 订阅 管理

Modbus通讯

Modbus总从模式,半双工通讯:

(1) 至少且只有一个主机,其他的都是从机

(2) 不管任何时候,从机都不能主动向主机发送数据

(3) 主机具有访问从机的权限,从机不可以主动访问从机,任何一次数据交换,都要由主机发起

(4)不管是主机还是从机,系统一旦上电,都要把自己置于接收状态(或者称为监听状态)
Modbus地址:
按照输入线圈(0),输出线圈(1),输入寄存器(4),输出寄存器(3),分别0,1,4,3三个起始标志,一般按照后面的区间可以有6位,比如到199999,但是一般数量比较小,所以有些是到5位比如19999,对于协议来说,只表达相对地址,但是对于文档来说要表示绝对地址

Modbus功能码:

按照读输入线圈,读输出线圈,读输入寄存器,读输出寄存器,功能码分别是01,02,03,04,再根据,写线圈,写寄存器,功能码分别是05,06,再扩展,写多线圈,和写多寄存器,分别为:0F,10(就是从05变成15,06变成16)

 

1、Modbus ASCII
在ASCII(AmericanStandard Code for Information Interchange)传输模式下,消息帧以英文冒号(“:”,ASCII3A Hex)开始,以回车和换号(CRLF,ASCII 0D and 0A Hex)符号结束,允许的传输的字符集为十六进制的09和AF;网络中的从设备监视传输通路上是否有英文冒号(“:”),如果有的话,就对消息帧进行解码,查看消息中的地址是否与自己的地址相同,如果相同的话,就接收其中的数据;如果不同的话,则不予理会。

在ASCII模式下,每个8位的字节被拆分成两个ASCII字符进行发送,比如十六进制数0xAF ,会被分解成ASCII字符“A”和“F”进行发送,发送的字符量比RTU增加一倍。ASCII模式的好处是允许两个字符之间间隔的时间长达1s而不引发通信故障,该模式采用纵向冗余校验(Longitudinal Redundancy Check ,LRC)) 的方法来检验错误.

起始位: 冒号“ : ”(0x3A)
结束符: 回车(0D)和换行(0A)
数据表示:将一个字节的十六进制拆分成了两个字节的字符表示
例如:0x12表示成 字符 “1“”2”
功能码等和rtu相同

完整协议例如
3A 30 31 30 36 30 30 30 31 30 30 31 37 B0 FD 0D 0A
把数据 0x0017(十进制23) 写入 1号从机地址 0x0001数据地址

2、Modbus RTU
在RTU(RemoteTerminal Unit)模式下,每个字节可以传输两个十六进制字符,比如十六进制数0xAF,直接以十六进制0xAF(二进制:10101111)进行发送,因此它的发送密度比ASCII模式高一倍;RTU模式采用循环冗余校验(CRC)

以03功能码为例,介绍一条具体的数据格式,主机的命令格式为:

01 03 00 04 00 02 85 CA,从机回复的数据格式为:

01 03 04 00 00 00 00 FA 33。如下图所示。

 

 

 

3、Modbus TCP
modbus TCP和modbus RTU基本相同,但是也存在一些区别

a.从机地址变得不再重要,多数情况下忽略。从某种意义上说从机地址被IP地址取代

b.CRC校验变得不再重要,甚至可以忽略。由于TCP数据包中已经存在校验,为了不重复造轮子,modbus TCP干脆取消了CRC校验。

TCP 模式是为了让Modbus 数据顺利在以太网上传输产生的,使用TCP502 端口。该协议物理层,数据链路层,网络层,传输层都是基于TCP 协议,只在应用层,将Modbus 协议修改后封装进去; 接收端将该TCP 数据包拆封后,重新获得原始Modbus 帧,然后按照Modbus 协议规范进行解析,并将返回的数据包重新封装进TCP 协议中,返回到发送端。与串行链路传输的数据格式不同,TCP 模式去除了附加地址和校验,增加了报文头

ModbusTCP的数据帧可分为两部分:MBAP+PDU。

主站为client端,主动建立连接;从站为server端,等待连接。

1.报文头MBAP

MBAP为报文头,长度为7字节,组成如下:

事务处理标识 协议标识 长度 单元标识符
2字节 2字节 2字节 1字节
事务处理标识 :可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
协议标识符 :00 00表示ModbusTCP协议。
长度 :表示接下来的数据长度,单位为字节。
单元标识符 :可以理解为设备地址。

2.帧结构PDU

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

例子:

发送:01 c8 00 00 00 06 01 03 00 14 00 0a

序列号:01 c8 ,协议标识符:00 00 ,长度:00 06 ,单元标识符/服务器地址:01,功能码:03,寄存器地址:00 14 ,读取几位数据:00 0a。

接收:01 c8 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 03 00 00

 序列号:01 c8 ,协议标识符:00 00 ,长度:00 17 ,单元标识符/服务器地址:01 ,功能码:03,数据长度:14 ,数据:就是后面的在第6位和第9位有数据。

下一条数据序,列号就会加一,变为01 c9。

posted on 2022-08-11 10:33  李sir  阅读(724)  评论(0编辑  收藏  举报