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