Modbus RTU协议解析

1.Modbus RTU一般是通过RS485/RS232物理接口采用的数据通信协议。

2.报文格式

主站询问报文格式
byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[n] byte[n+1]
站号 功能码 起始地址 寄存器数量/线圈个数 校验码
从站响应报文格式
byte[0] byte[1] byte[2]  byte[3] byte[4]... byte[n] byte[n+1]
站号 功能码 响应字节个数 数据 校验码

 根据功能码的不同报文格式略有差别,主站询问格式前6个字节固定不变“1字节站号+1字节功能码+2字节起始地址+2字节寄存器/线圈数量+...+2字节校验码”,从站响应格式前3个字节固定不变“1字节站号+1字节功能码+1字节长度+...+2字节校验码

3.功能码01报文解析

Rx:000004-01 01 00 00 00 0A BC 0D

主站询问报文格式
byte[0]  byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7]
01 01 00 00 00 0A BC 0D
站号1 功能码01 起始地址0 10个线圈数量 校验码

从站号1的起始地址0处读取连续10个线圈的开关量

Tx:000005-01 01 02 30 00 AD FC

从站响应报文格式
byte[0]  byte[1] byte[2]  byte[3] byte[4] byte[5] byte[6]
01 01 02 30 00 AD FC
站号1 功能码01 2个字节长度 2个字节开关量 校验码

从站响应数据30 00,转为二进制为0011 0000/0000 0000,2字节分别逆序排列0000 1100/0000 0000,因此返回的10个开关量数据为00001100

4.功能码03报文解析

Rx:000000-01 03 00 00 00 0A C5 CD

主站询问报文格式
byte[0]  byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7]
01 03 00 00 00 0A C5 CD
站号1 功能码03 起始地址0 10个寄存器数量 校验码

主站向从站1号的起始地址0请求读取连续10个寄存器的数据

Tx:000001-01 03 14 00 00 00 17 00 00 00 2D 00 00 00 00 00 11 00 00 00 00 00 00 71 BF

从站响应报文格式
byte[0]  byte[1] byte[2]  byte[3] byte[4]... byte[23] byte[24]
01 03 14 00 00 00 17 00 00 00 2D 00 00 00 00 00 11 00 00 00 00 00 00 71 BF
站号1 功能码03 20个字节长度 20个字节寄存器数据 校验码

从站1号响应20个字节的数据,00 00 00 17 00 00 00 2D 00 00 00 00 00 11 00 00 00 00 00 00,对应10进制:0 23 0 45 0 0 17 0 0 0

4.功能码10报文解析

Rx:000002-01 10 00 00 00 0A 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 5C 8F

主站询问报文格式
byte[0]  byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8].. byte[27] byte[28]
01 10 00 00 00 0A 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 5C 8F
站号1 功能码10 起始地址0 10个寄存器数量 20个字节长度 批量写入的20字节数据 校验码

主站向从站1号的起始地址0处开始连续的10个寄存器,批量写入20个字节的数据 

Tx:000003-01 10 00 00 00 0A 40 0E

从站响应报文格式
byte[0]  byte[1] byte[2] byte[3]   byte[4] byte[5] byte[6] byte[7]
01 10 00 00 00 0A 40 0E
站号1 功能码10 起始地址0 写入寄存器的个数 校验码

从站1号响应报文,与询问报文前6个字节保持一致。

5.功能码04报文解析

Rx:000004-01 04 00 00 00 0A 70 0D

主站询问报文格式
byte[0]  byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7]
01 04 00 00 00 0A 70 0D
站号1 功能码04 起始地址0 10个保持寄存器数量 校验码

主站向从站1号的起始地址0处开始读取连续10个保持寄存器的值 

Tx:000005-01 04 14 00 00 00 04 00 00 00 08 00 05 00 00 00 09 00 00 00 00 00 00 40 C4

从站响应报文格式
byte[0]  byte[1] byte[2]  byte[3] byte[4].. byte[23] byte[24]
01 04 14 00 00 00 04 00 00 00 08 00 05 00 00 00 09 00 00 00 00 00 00 40 C4
站号1 功能码04 20个字节的数据 读取的20字节数据 校验码

从站响应20个字节的数据,对应10进制:0 4 0 8 5 0 9 0 0 0 

6.功能码02报文解析

Rx:000000-01 02 00 00 00 0A F8 0D

主站询问报文格式
byte[0]  byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7]
01 02 00 00 00 0A F8 0D
站号1 功能码02 起始地址0 10个离散量 校验码

主站向从站1号的起始地址0出开始请求读取10个离散量 

Tx:000001-01 02 02 56 01 47 D8

从站响应报文格式
byte[0]  byte[1] byte[2]  byte[3] byte[4] byte[5] byte[6]
01 02 02 56 01 47 D8
站号1 功能码02 字节长度 响应的数据 校验码

从站响应2个字节数据56 01,翻译为二进制 0101 0110/0000 0001,字节分别逆序排列0110101010

你可能感兴趣的:(物联网)