TCP/IP 上的 MODBUS 的请求/响应
MBAP报文头
| 域 | 长度(字节) | 示例 | 描述 |
|---|---|---|---|
| 事务元标识符 | 2 | 0x00 0x00 | MODBUS 请求/响应事务处理的识别码 |
| 协议标识符 | 2 | 0x00 0x00 | 0=MODBUS 协议 |
| 长度 | 2 | 0x00 0x00 | 以下字节的数量 |
| 单元标识符 | 1 | 0x01 | 串行链路或其它总线上连接的远程从站的识别码 |
(1)事务标识符:可以解释为报文的序列号,由于我们测试使用的Modbus Poll客户端是一直发送数据,所以每发送一次数据标识符就加一。服务器接收时会把这个数据原封返回。
(2)协议表示:00 00代表TCP协议。
(3)长度:表示从单元标识符开始后面数据的长度。如:00 06表示后面有0x06个字节长度的数据。
(4)单元标识符:相当于设备的地址。一般为01。
PDU (帧结构)
| 域 | 长度(字节) | 示例 | 描述 |
|---|---|---|---|
| 功能码 | 1 | 0x01 | modbus的功能码列表 |
| 数据 | 0~(65535-2) | 0x00 | / |
modbus的操作对象
| 操作对象 | 描述 |
|---|---|
| 线圈 | 相当于开关,在MODBUS中可读可写,数据只有00和01 |
| 离散量 | 输入位,开关量,在MODBUS中只读 |
| 输入寄存器 | 只能从模拟量输入端改变的寄存器,在MODBUS中只读 |
| 保持寄存器 | 用于输出模拟量信号的寄存器,在MODBUS中可读可写 |
根据对象的不同,modbus的功能码有
| 功能码 | 描述 |
|---|---|
| 0x01 | 读线圈 |
| 0x05 | 写单个线圈 |
| 0x0F | 写多个线圈 |
| 0x02 | 读离散量输入 |
| 0x04 | 读输入寄存器 |
| 0x03 | 读保持寄存器 |
| 0x06 | 写单个保持寄存器 |
| 0x10 | 写多个保持寄存器 |
报文解读
读取01-03号线圈值
发送响应
抓包确认
报文解析
TX(发送): 08 80 00 00 00 06 01 01 00 01 00 03
| 报文 | 描述 |
|---|---|
| 08 80 | 事务标识符 |
| 00 00 | Modbus TCP协议标识 |
| 00 06 | 剩余报文长度 |
| 01 | 单元标识符 |
| 01 | 功能码(读线圈) |
| 00 01 00 03 | 指令数据,此处代表从1开始读3个 |
RX(响应): 08 80 00 00 00 04 01 01 01 05
| 报文 | 描述 |
|---|---|
| 08 80 | 事务标识符 |
| 00 00 | Modbus TCP协议标识 |
| 00 04 | 剩余报文长度 |
| 01 | 单元标识符 |
| 01 | 功能码(读线圈) |
| 01 05 | 此处01代表有效数据长度1字节,05=0101,反向得出1,3线圈true |