MODBUS协议分为三类:MODBUS-RTU、MDOBUS-TCP、MODBUS-ASCLL三种,本文主要讲解解析MODBUS_RTU协议。
MODBUS-RTU工作模式
MODBUS-RTU有两种工作模式,广播模式和单播模式。
广播模式:在广播模式下,所有从站必须执行主站指令,且无需应答返回。
单播模式:在单播模式中,一个MODBUS事务处理包含两个报文,一个来自主节点的请求命令,一个来自从站(子节点)的应答返回。
单播模式的工作过程是由主节点发送请求命令后进入等待应答状态,只有特定的从站(子节点)应答后,主节点才可以进行下一事务处理。而且同一时刻,主节点只会发起一个MODBUS事务处理,并且主节点在等待响应时会同步启动响应超时机制,避免主节点***处于等待应答状态。
不管何时,从站(子节点)都不会主动发送数据,而且从站(子节点)直接也不会相互通讯。
MODBUS-RTU协议分为地址域、协议数据单元(PDU)、CRC差错校验三部分,其中协议数据单元(PDU)包含功能码和数据部分。
MODBUS-RTU报文
地址域部分:
地址域部分由一个字节组成,理论上可以有256个不同的地址,但实际上有的字节不能被当作子节点单独地址使用,协议中规范了地址0为广播地址,地址248-255为保留地址,所以子节点单独地址选择区间只有1-247。
注意:主站是没有地址标识的,设备地址只和从站有关。每个从站地址都是唯一的,以便和其他从站区分。
协议数据单元(PDU)
报文的协议数据单元(PDU)是由功能码和数据构成,功能码为1字节,数据长度不定(由具体功能决定)。
MODBUS的寄存器有四种:线圈、离散输入、输入寄存器、保持寄存器四种。
根据寄存器不同,分离出多种不同的功能码。
以下的说明内容只包含报文中的PDU部分,不包含地址域和CRC差错校验。
PDU报文解析:
01功能码 读线圈寄存器
主站发送报文01 00 02 00 06
01 MODBUS功能码 读线圈寄存器
00 读取线圈起始地址高位
02 读取线圈起始地址低位
00 读取线圈个数高位
06 读取线圈个数低位
需要先将报文从十六进制转换为十进制,转换结果为 读取线圈起始地址 3(2+1) 读取线圈个数 6
表示从第三个线圈开始读(起始地址0代表线圈1 所以起始地址2代表从线圈3开始读) 读取到第8个线圈结束
从站应答报文01 01 00
01 MODBUS功能码 和读取报文功能码一致
01 返回字节数
00 线圈的状态(0x00)
从右至左分别代表线圈状态 最高位没有用0填充 结果为 0 0 8线圈 7线圈 6线圈 5线圈 4线圈 3线圈
0F功能码 写多个线圈
主站发送 0F 00 02 00 06 01 2A
0F MODBUS功能码
00 写入线圈地址高位
02 写入线圈地址低位
00 写入线圈个数高位
06 写入线圈地址低位
01 写入值字节长度
2A 写入值
表示从第三个线圈开始写(起始地址0代表线圈1 所以起始地址2代表从线圈3开始读) 写到第8个线圈结束
从站应答 0F 00 02 00 06
0F MODBUS功能码
00 写入线圈地址高位
02 写入线圈地址低位
00 写入线圈个数高位
06 写入线圈个数低位
技巧:写入数据时,响应报文和请求报文的前5个字节是完全相同的。
04功能码 读输入寄存器
主机发送04 00 67 00 04
04 MODBUS功能码
00 读输入寄存器地址高位
67 读输入寄存器地址低位
00 寄存器数量高位
04 寄存器数量低位
参考某系列寄存器数据手册,设定读104-107寄存器数据,104转换为16进制,转换结果为68,但是地址书写中十进制的寄存器地址是从1开始计数,而16进制的地址是从0开始计数的,所以地址104转换为16进制的结果为0x67。
从机应答
从机应答报文 04 08 F5 55 18 63 01 1A
04 MODBUS功能码
08 数据长度
F5 55 返回寄存器104(0x67)的数据
F5 55 返回寄存器105的数据
18 63 返回寄存器106的数据
01 1A 返回寄存器107的数据
根据返回寄存器的数据,对应相应手册,即可转换为实际的值。在此不多做赘述。
10功能码 写多个寄存器
主机发送 10 00 67 00 02 04 00 00 00 07
10 MODBUS功能码
00 67 起始地址
00 02 写寄存器数量
04 字节长度
00 00 写入到寄存器0x67的数据
00 07 写入到寄存器0x68的数据
从机应答 10 00 67 00 02
10 MODBUS功能码
00 67 起始地址
00 02寄存器数量
技巧:10功能码应答与请求报文的前5为数据一致。
CRC循环冗余校验
CRC循环冗余校验由两个字节组成,会附加在报文后面发送出去,具体值由发送设备计算,而接收设备会在接收报文时重新计算CRC的值,并将结果与报文的CRC值进行比较,如果CRC的值不相等,则校验错误。
现在一般使用程序自动生成CRC码。
错误应答报文
主站发送 02 00 00 00 05
02 MODBUS功能码
00 00 寄存器起始地址
00 05 寄存器数量
从站返回 82 03
82 功能码
正常相应的所以功能码最高有效位都为0 ,即功能码的值都低于16进制的0x80,所以异常相应的功能码出现的是正常功能码+0x80。
03 非法数据值(超出现有的数量)
所有的异常状态码如下图所示:
补充说明:
在RTU传输模式下,每个字节都有11为,分为有奇偶校验位和无奇偶校验位,其中有奇偶校验位的数据格式位1个起始位、8位数据位、1个奇偶校验位、1个停止位;无奇偶校验位的数据格式位1个起始位、8个数据位、两个停止位。
124316514d5a7e1797.png (171.97 KB )
---------------------
作者:鸡蛋鸭蛋荷包蛋
链接:https://bbs.21ic.com/icview-3330694-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。