Modbus-RTU数据帧,帧长度最大为256字节,由以下4部分构成:
Modbus-RTU帧间隔,Modbus-RTU要求两个RTU报文帧间隔要大于3.5个字节时间:
且每个报文帧内字节间隔小于1.5个字节时间,否则会认为接收不完整。
Modbus-RTU采用循环几余校验(CRC - Cyclical Redundancy Checking) 算法对报文顺全部数据进行计算,得到的校验值附加在报文末尾,低位在前。CRC-16_Modbus计算方法可以参考: CRC-16_Modbus校验算法。
示例1: 写单个寄存器。向01地址设备0x0105保持寄存器写入1个数据: 0x0190
主机发送: 01 06 01 05 01 90 99 CB从机回复: 01 06 01 85 01 90 99 CB
01表示从机地址,06功能码表示写单个保持寄存器,0105表示寄存器地址,0190表示写入寄存器的数值,99CB为CRC校验值。可以看出,当写1个寄存器数据时,从机响应的数据帧和主机发送的数据帧完成一致。
示例2: 写多个寄存器。向01地址设备0x0105、0x0106、0x0107地址保持寄存器,写入3个寄存器数据: 0x1102,0x0304,0x0566???????
主机发送: 01 10 01 05 00 03 06 11 02 03 04 05 66 4a 12从机回复: 01 10 01 05 00 03 91 f5
同理,01从机地址,10功能码表示写多个保持寄存器,0105表示起始地址0003表示写3个寄存器,06表示数据量为6个字节1102/0304/0566分别表示写入3个寄存器的数值,4a12表示CRC校验数值.
可以看出,写多个寄存器时使用10功能码,从机回复数据也比较精简。
示例3: 读单个寄存器。读01地址设备0x0105保持寄存器数据???????
主机发送: 01 03 01 05 00 01 95 f7从机回复: 01 03 02 56 78 87 c6
03表示读多个寄存器,0105表示起始地址,0001表示读1个寄存器
02表示2个字节,56 78表示寄存器的数据
示例4: 读多个寄存器。读01地址设备0x0105、0x0106、0x0107地址保持寄存器,共3个寄存器数据:???????
主机发送: 01 03 01 05 00 03 14 36从机回复: 81 03 06 11 22 33 44 55 66 2a 18
03表示读多个寄存器,0105表示起始地址,0003表示读3个寄存聚
06表示6个字节,11 22 33 44 55 66表示寄存器的数据