一、ModBus TCP 一帧数据格式
其中MBAP报文头有7个字节,分别是:
域 | 长度 | 描述 |
---|---|---|
事物处理标识符 | 2个字节 | 用于事务处理配对,他是Modbus的事务处理码,每次通信后就要加一 |
协议标识符 | 2个字节 | 用于系统内的多路复用,当值为0是,表示使用ModBus协议 |
长度 | 2个字节 | 用于说明接下来还有多少字节的数量 |
单元标识符 | 1个字节 | 当ModBus客户端在请求设置这个域是,在响应中服务器必须利用相同的值返回这个域(同设备地址) |
二、0x10:写多个保持寄存器
在一个远程设备中写连续寄存器块(1~123个寄存器)
请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)
响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
回:写入成功
00 01 00 00 00 06 01 10 00 00 00 01
三、通信过程
例如:03读保存寄存器
????????主机发送:03? 寄存器起始地址? 读取数量 CRC校验
????????从机正常响应:03? ?数据长度(是请求报文中的读取数量的2倍)? ? 保持寄存器数据,n个字节(是请求报文中的读取数量的2倍)CRC校验
????????从机异常响应报文:131(0x83)? 异常码?CRC校验