ModbusRTU协议报文解析
报文格式:
设备地址/从站地址: 1个字节 指定目标设备地址(从站地址)
功能码:1个字节 功能码在modbus协议用于表示信息帧的功能,例如读取线圈状态、读取寄存器等。
数据: N个字节 后面数据根据不同功能码不同。
CRC校验:循环冗余校验码,用于检测报文完整性和数据错误
modbus 常用功能代码
十进制 | 功能 | 数据类型 |
---|---|---|
01 | 读取 多个线圈 | 位 |
02 | 读取 多个离散量输入 | 位 |
03 | 读取 多个保持寄存器 | 16进制整型 |
04 | 读取 多个输入寄存器 | 16进制整型 |
05 | 写入 单个线圈 | 位 |
06 | 写入 单个寄存器 | 16进制整型 |
15 | 写入 多个线圈 | 位 |
16 | 写入 多个寄存器 | 16进制整型 |
功能码详解:
01 读取多个线圈
示例报文:
请求:01 01 00 00 00 0A BC 0D
第1位 01 设备地址
第2位 01 功能码
第3,4位00 00
起始地址
第5,6位 00 0A
查询线圈长度,查询10个线圈
第7,8位BC 0D
是CRC校验码
响应:01 01 02 82 00 D9 5C
前2位设备地址和功能码,同请求发送的报文
第3位02
是后面数据位的长度
第4-5位82 00
都是数据位,长度与第3位的长度对应
第6,7位是CRC校验码
01查询线圈,每一个16进制数据表示8位线圈
第3位82 --> 1000 0010 第二位是1,第八位是1,对应地址从零开始,地址1是1,地址7是1,其余都为0
02读取 多个离散量输入
第二位功能码不同,报文其他格式都同01
03 读取 多个保持寄存器
寄存器读取与线圈的区别,响应数据,寄存器数据每两个字节表示1位,一次请求不能超过127个地址
示例报文:
请求:01 03 00 00 00 0A C5 CD
第1位 01 设备地址
第2位 03 功能码
第3,4位00 00
起始地址
第5,6位 00 0A
查询寄存器长度,查询10个寄存器
第7,8位C5 CD
是CRC校验码
响应:01 03 14 00 00 00 05 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 A8 3C
前2位设备地址和功能码,同请求发送的报文
第3位14
是后面数据位的长度,每一个寄存器长度为2个字节,所以总长20(0x14)
第4位开始,20位都是数据位,第6,7位(数据位3,4)00 05,表示地址1数据为5,第10,1位(数据位7,8)00 0A
,表示地址3值为
04 读取 多个输入寄存器
同03
05 (05H)写入 单个线圈
请求:01 05 00 05 FF 00 9C 3B
前两位还是设备地址和功能码
第3,4位 00 05
写入线圈的地址
第5,6位 写入的数据值 FF 00
表示置ON/1状态 ,00 00
表示置OFF/0状态
响应:01 05 00 05 FF 00 9C 3B
正常响应与请求报文一致
15(0FH)写入 多个线圈
请求:01 0F 00 05 00 0A 02 B2 00 91 CD
前两位还是设备地址和功能码
第3,4位 00 05
写入的起始地址
第5,6位 00 0A
写入线圈数量
第7位 02
数据字节数量
第8,9位是数据 低地址字节在前
第10,11位是CRC校验码
数据位:
B2 00
—> 1011 0010 0000 00000
位 | 0C | 0B | 0A | 09 | 08 | 07 | 06 | 05 |
值 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
位 | 14 | 13 | 12 | 11 | 10 | 0F | 0E | 0D |
值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
06(06H) 写入 单个寄存器
请求:01 06 00 04 00 37 89 DD
向地址为4的寄存器写入55。
第1位 01 设备地址
第2位 06 功能码
第3,4位 00 04
写入的起始地址
第5,6位 00 37
写入寄存器的值
第7,8位89 DD
位CRC校验码
响应:01 06 00 04 00 37 89 DD
写入成功,响应报文与写入报文一致
16(10H)写入多个寄存器
请求:01 10 00 05 00 02 04 00 14 00 21 B3 8C
从地址5开始写入两个寄存器,5寄存器写入20,3寄存器写入33
第1位 01 设备地址
第2位 10
功能码
第3,4位 00 05
写入的起始地址
第5,6位 00 02
写入的寄存器的数量
第7位04
是后面写入数据位的长度
第8-11位是数据
最后两位是CRC校验码
响应:01 10 00 05 00 02 51 C9
写入成功响应1-6位同发送报文,然后加CRC校验码,没有数据位
错误响应:
当发生通讯异常时,响应前1位仍然为modbus正常协议格式(设备地址),第2位响应功能码(请求功能码+0x80),第3位异常码,第4,5位为CRC校验码。
异常数据即包含异常码的数据:
目前使用的异常码是:01,02,03和04。
- 响应功能码 = 请求功能码 + 0x80
- 响应报文提供异常码显示出错原因。
常见异常码含义:
异常码 | 名称 | 含义 |
01 | 非法功能 | 对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作,可能是因为功能码仅适用于新设备而被选单元中不可实现同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:它是未配置的,且要求返回寄存器值。 |
02 | 地址非法 | 对于服务器(或从站)来说,询问中接收的数据地址是不可允许的地址,特别是参考号和传输长度的组合是无效的。对于带有100个寄存器的控制器来说,偏移量96和长度4的请求会成功,而偏移量96和长度5的请求将产生异常码02。 |
03 | 数据非法 | 对于服务器(或从站)来说,询问中包括的值是不可允许的值。该值指示了组合请求剩余结构中的故障。例如:隐含长度是不正确的。modbus协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。 |
04 | 从站设备故障 | 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。 |