ModBus协议总结
- ModBus协议总结
- RTU
- 1 线圈设备读写
- 2 读取离散值
- 3 保持寄存器读写 通过功能码 03 06 16(0x10)
- 功能码06
- 功能码16
- 读取输入寄存器数值
- TCP
ModBus协议总结
RTU
总结modbus协议的通信和处理,首先明确同种通信方式TCP和串口(RTU)的区别:
RTU主站请求从站(串口传输)
| 协议 | 字节 | 作用 |
|---|---|---|
| 从站的地址 | 1 | 范围1-247 0是广播地址 |
| 功能码 | 1 | 0x01-0x06、0x0F 、0x10 |
| 起始寄存器 | 2 | 寄存器地址 |
| 数据长度 | 2 | 寄存器数量 |
| CRC | 2 | 数据校验位 |
如
01 03 00 00 00 02 C4 0BRTU从站设备回复请求如果成功(串口传输)
| 协议 | 字节 | 作用 |
|---|---|---|
| 从站的地址 | 1 | 范围1-247 0是广播地址 |
| 功能码 | 1 | 0x01-0x06、0x0F 、0x10 |
| 字节数 | 1 | 寄存器地址 |
| 数据位 | N | 一个寄存器返回2个字节寄存器数量 |
| CRC | 2 | 数据校验位 |
如
01 03 04 12 34 56 78 5A 3D如果出现一场情况将会返回异常报文
| 协议 | 字节 | 作用 |
|---|---|---|
| 从站的地址 | 1 | 范围1-247 0是广播地址 |
| 异常功能码 | 1 | 原功能码 0x03 的最高位(bit 7)置1,即 0x03 0x80 = 0x83 |
| 异常码 | 1 | 01 02 03 04 |
| CRC | 2 | 数据校验位 |
如
01 83 02 C0 F1常见的异常码有:
01:非法功能(不支持该功能码)。
02:非法数据地址(请求的寄存器地址超出范围)。
03:非法数据值(写入的数据值超出范围)。
04:从站设备故障。
这里把所有RTU手法总结如下:
功能码 0x01 — 读线圈
请求帧格式:
[从站地址] 01 [起始地址高] [起始地址低] [数量高] [数量低] [CRC低] [CRC高]
最大读取数量:2000个线圈(但受串口帧长度限制,实际约2000个)
正常响应帧格式:
[从站地址] 01 [字节数] [线圈状态1] [线圈状态2] … [CRC低] [CRC高]
异常响应:
[从站地址] 81 [异常码] [CRC低] [CRC高]
01 01 00 00 00 0A BC 0D响应(假设线圈0-7全ON,线圈8-9为OFF):
01 01 02 FF 00 78 2F1 线圈设备读写
线圈设备是一类可由信号控制的继电器设备,按位读写,主要功能码 围绕 01 05 15三个功能码 工作
01是读功能码
05是单写功能码
15是多写功能码
01 01 00 00 00 0A BC 0D上面指令是从 01从设备读取0线圈开始读取10个线圈
01 01 02 FF 00 78 2F收到的响应是 01从设备回复两个字节的数据 前0-8个设备状态是全1 后两个设备状态全0
01 05 00 00 FF 00 8C 3A从站设备01,线圈0设置为ON, (ON值必须为 0xFF00,OFF值必须为 0x0000)
01 05 00 00 FF 00 8C 3A从站设备响应
01 0F 00 00 00 0C 02 AD 0A 34 12上面指令是从 01从设备从0线圈开始写入12线圈
01 0F 00 00 00 0C 04 08上面指令是写入了12个响应数据
2 读取离散值
离散值是一种 外部环境决定的不可 物理按钮 限位开关 等只能读取
01 02 00 00 00 0A 78 0D从01从设备00地址开始读取10个离散值输入
01 02 02 AD 02 5D B8返回两个字节的返回数据
3 保持寄存器读写 通过功能码 03 06 16(0x10)
保持寄存器的读取命令在协议介绍时03 已经写出 就不在这里介绍了
功能码06
写入
01 06 00 02 00 FF 48 0B响应
01 06 00 02 00 FF 48 0B写入和响应返回一致信息 02寄存器 写入FF
功能码16
写入3个寄存器数值,从地址0105 开始的3个寄存器 总字节长度为6
01 10 01 05 00 03 06 11 02 03 04 05 66 4A 12响应 从寄存器地址 0105开始成功写入了3个寄存器
01 10 01 05 00 03 1E 1E读取输入寄存器数值
输入寄存器只读,修改由器件内部的操作控制
从00寄存器开始读取 1个寄存器的数据
01 04 00 00 00 01 31 CA返回两个字节数据
01 04 02 01 00 78 F4TCP
tcp和命令和RTU相同,但封装格式不同
| 协议 | 字节 | 作用 |
|---|---|---|
| 事务标识符 | 2 | 客户端每次发送请求时递增(建议从 1 开始)。服务器在响应时原样复制此 ID。这是 TCP 支持并发通信的关键 |
| 协议标识符 | 2 固定为 0x0000,表示这是一个 Modbus 协议包 | |
| 长度 | 2 | 告诉接收方,从“单元标识符”开始到数据结束,还有多少个字节 |
| 单元标识符 | 1 | “从站地址”的替身。用于标识目标设备。在纯 TCP/IP 网络中,它相当于 RTU 的从站地址 |
| 功能码 | 1 | 与 RTU 完全一致。包括 0x01 读线圈、0x03 读寄存器、0x06 写寄存器等 |
| 数据域 | N | 格式和 RTU 也完全一致,采用大端模式,存放具体的操作参数,如寄存器起始地址、数量或要写入的值 |