首先是在本地下载模拟ModbusTCP通讯报文测试的软件,这里使用Modscan32模拟主设备,Modbus Slave模拟从站设备:
从站设备:

设置对应的功能码和寄存器数量:

主站设备:

需要注意:连接时使用的功能码要一致,连通后得到的报文如下:[01][00][00][00][00][06][01][03][00][00][00][0a][01][00][00][00][00][17][01][03][14][00][0c][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]

这个Modbus TCP通讯报文。这个报文包含了一个请求和一个响应。
Modbus TCP 帧结构回顾
| 字段 | 字节数 | 说明 |
|---|---|---|
| 事务处理标识符(Transaction ID) | 2 | 用于匹配请求和响应 |
| 协议标识符(Protocol ID) | 2 | Modbus TCP 固定为 0x0000 |
| 长度(Length) | 2 | 后续字节数(从 Unit ID 开始计算) |
| 单元标识符(Unit ID) | 1 | 从站设备地址(通常 0x01 或 0xFF) |
| 功能码(Function Code) | 1 | 操作类型(如 0x01 读线圈,0x03 读保持寄存器) |
| 数据(Data) | N | 取决于功能码(如起始地址、寄存器数量等) |
请求报文(前12字节):[01][00][00][00][00][06][01][03][00][00][00][0a]
响应报文报文(后30字节):[01][00][00][00][00][17][01][03][14][00][0c][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
详细解析
1. 请求报文解析
| 字节位置 | 十六进制值 | 字段名称 | 说明 |
|---|---|---|---|
| 0-1 | 01 00 | 事务标识符 | Transaction ID = 0x0001,用于请求响应配对 |
| 2-3 | 00 00 | 协议标识符 | Protocol ID = 0x0000,表示Modbus协议 |
| 4-5 | 00 06 | 长度字段 | Length = 6字节,后续数据长度(不含前6字节MBAP头) |
| 6 | 01 | 单元标识符 | Unit ID = 1,从站地址 |
| 7 | 03 | 功能码 | 读保持寄存器(Read Holding Registers) |
| 8-9 | 00 00 | 起始地址 | 从地址0开始读取 |
| 10-11 | 00 0a | 线圈数量 | 读取10个线圈(0x000A = 10) |
请求含义:主站请求从地址为1的从站读取从地址0开始的10个线圈状态。
2. 响应报文解析
| 字节位置 | 十六进制值 | 字段名称 | 十进制值 | 详细说明 |
|---|---|---|---|---|
| 0-1 | 01 00 | 事务标识符 | 256 | 与请求一致,配对响应 |
| 2-3 | 00 00 | 协议标识符 | 0 | Modbus TCP协议 |
| 4-5 | 00 17 | 长度字段 | 23 | 后续数据长度 |
| 6 | 01 | 单元标识符 | 1 | 从站设备地址 |
| 7 | 03 | 功能码 | 3 | 读保持寄存器(Read Holding Registers) |
| 8 | 14 | 字节计数 | 20 | 返回数据的字节数 |
| 9-10 | 00 0c | 寄存器0数据 | 12 | 地址0寄存器值 |
| 11-12 | 00 00 | 寄存器1数据 | 0 | 地址1寄存器值 |
| 13-14 | 00 00 | 寄存器2数据 | 0 | 地址2寄存器值 |
| 15-16 | 00 00 | 寄存器3数据 | 0 | 地址3寄存器值 |
| 17-18 | 00 00 | 寄存器4数据 | 0 | 地址4寄存器值 |
| 19-20 | 00 00 | 寄存器5数据 | 0 | 地址5寄存器值 |
| 21-22 | 00 00 | 寄存器6数据 | 0 | 地址6寄存器值 |
| 23-24 | 00 00 | 寄存器7数据 | 0 | 地址7寄存器值 |
| 25-26 | 00 00 | 寄存器8数据 | 0 | 地址8寄存器值 |
| 27-28 | 00 00 | 寄存器9数据 | 0 | 地址9寄存器值 |
响应总结:从站返回了10个保持寄存器的值,第一个寄存器值为12,其余9个寄存器值均为0。
解析完报文后。
解析完成后开发对应功能,此处由于版本受限,是在VS2005的MFC开发的该功能。