modbus-tcp顾名思义是基于TCP网络连接的MODBUS协议。
和RS485总线不同,TCP协议是通过设备的IP地址和端口来寻址。
modbus-tcp的默认端口号是502,设备端作为TCP服务器监听502端口,主机为TCP客户端主动去连接外设。与RS485一样,主机发起请求,设备返回响应,设备不会主动发送数据。
1个主机可以同时与多个设备建立连接。
1个设备可以同时被多个主机连接。
在协议层使用的包格式是二进制格式:
序号 | 协议 | 长度 | 数据 |
2字节 | 2字节 | 2字节 | N字节 |
序号:标识通信流水号,主机发送时每次加1,设备原样返回。
协议:固定为0x00,0x00
长度:表示后续数据的长度(网络序:大端格式)
数据:包含设备地址和功能码以及寄存器参数,和RTU格式一样,但不包含校验。
因为TCP本身是可靠通信连接,因此MODBUS-TCP协议层没有添加校验位。
下面是示例:
主机发送:0x00,0x09,0x00,0x00,0x00,0x06,0x01,0x03,0x00,0x01,0x00,0x02
设备返回:0x00,0x09,0x00,0x00,0x00,0x05,0x01,0x03,0x02,0x00,0x00
序号:0x00,0x09
协议:0x00,0x00
长度:0x00,0x06
数据:0x01,0x03,0x00,0x01,0x00,0x02
数据部分的格式和MODBUS-RTU是一样的,但不包含2个字节的CRC16。
解析出来就是: 0x01(地址),0x03(功能码),0x0001(寄存器地址),0x0002(寄存器数量)
RTU格式请参见:MODBUS常用功能码https://kerndev.blog.csdn.net/article/details/125293329
设备返回数据时,也是按照上面的格式,带上6字节的帧头再加上N字节的RTU数据。
在此不再赘述。