Modbus RTU 数据结构(发送和返回/读/写)
以下是 Modbus RTU 协议的典型数据结构示例,包含 读保持寄存器 和 写单个寄存器 的请求帧与响应帧格式,以及详细说明:
1. 读保持寄存器 (Function Code: 0x03)
请求帧 (主机 → 从机)
字段 | 字节数 | 示例值 | 说明 |
---|---|---|---|
设备地址 | 1 |
| 从机设备地址(1-247) |
功能码 | 1 |
| 读保持寄存器 |
起始寄存器地址 | 2 |
| 要读取的起始寄存器地址 |
寄存器数量 | 2 |
| 读取的寄存器数量(2个) |
CRC校验 | 2 |
| CRC16校验(低字节在前) |
完整帧示例(Hex):
01 03 00 00 00 02 C4 0B
响应帧 (从机 → 主机)
字段 | 字节数 | 示例值 | 说明 |
---|---|---|---|
设备地址 | 1 |
| 从机设备地址 |
功能码 | 1 |
| 读保持寄存器 |
数据字节数 | 1 |
| 返回的数据字节数(2寄存器×2字节) |
寄存器数据 | N |
| 寄存器1值( |
CRC校验 | 2 |
| CRC16校验(低字节在前) |
完整帧示例(Hex):
01 03 04 00 0A 00 64 AB CD
2. 写单个寄存器 (Function Code: 0x06)
请求帧 (主机 → 从机)
字段 | 字节数 | 示例值 | 说明 |
---|---|---|---|
设备地址 | 1 |
| 从机设备地址 |
功能码 | 1 |
| 写单个寄存器 |
寄存器地址 | 2 |
| 要写入的寄存器地址 |
写入值 | 2 |
| 要写入的值( |
CRC校验 | 2 |
| CRC16校验(低字节在前) |
完整帧示例(Hex):
01 06 00 02 00 FF 12 34
响应帧 (从机 → 主机)
字段 | 字节数 | 示例值 | 说明 |
---|---|---|---|
设备地址 | 1 |
| 从机设备地址 |
功能码 | 1 |
| 写单个寄存器 |
寄存器地址 | 2 |
| 写入的寄存器地址 |
写入值 | 2 |
| 确认写入的值( |
CRC校验 | 2 |
| CRC16校验(低字节在前) |
完整帧示例(Hex):
01 06 00 02 00 FF 56 78
(响应帧与请求帧完全相同,表示写入成功)
3. 关键说明
CRC校验
计算范围:从设备地址到最后一个数据字节(不包括CRC本身)。
校验值格式:16位,低字节在前(如
0xC40B
发送顺序是0B C4
)。
寄存器地址
Modbus寄存器地址从
0x0000
开始,但实际设备可能映射为40001
(保持寄存器)或30001
(输入寄存器)。
错误响应
如果操作失败,功能码最高位置1(如
0x83
表示读保持寄存器错误),并返回错误码:01 83 02 C0 91 // 错误码0x02(非法数据地址)
字节顺序
Modbus默认使用 大端序(Big-Endian),即高位字节在前。
4. 实际应用场景
读保持寄存器
用途:读取设备参数(如温度、电压等)。
示例:
主机请求读取从机地址1的寄存器0和1的值:
01 03 00 00 00 02 C4 0B
从机返回寄存器0=10,寄存器1=100:
01 03 04 00 0A 00 64 AB CD
写单个寄存器
用途:修改设备参数(如设定阈值)。
示例:
主机请求向从机地址1的寄存器2写入255:
01 06 00 02 00 FF 12 34
从机确认写入成功:
01 06 00 02 00 FF 56 78
5. 注意事项
超时处理:主机需等待从机响应(典型超时为100ms-1s)。
并发控制:同一时刻只能有一个设备在总线上通信。
地址范围:寄存器数量不能超过Modbus协议限制(通常最多125个寄存器/请求)。
如果需要其他功能码(如写多个寄存器、读输入寄存器等)的示例,可以进一步补充!