工具介绍
ModBus Poll 在TCP中模拟客户端,在RTU中模拟主机;(请求数据方)
ModBus Slave 在TCP中模拟服务器,在RTU中模拟从机;(响应数据方)
数据帧简介
ModBus是一种通信协议,用于在工业自动化领域中,通过串行通信或以太网连接来传输数据。ModBus数据帧是用于在ModBus协议中传输数据的格式。
ModBus协议支持两种不同的数据帧格式:ModBus TCP和ModBus RTU。
ModBus TCP数据帧:
ModBus TCP是基于以太网的ModBus协议版本。在ModBus TCP中,数据帧格式如下:
1)事务标识符(2字节):用于标识请求和响应之间的关联。
2)协议标识符(2字节):用于指定ModBus协议版本。
3)长度字段(2字节):指定数据帧中后续字段的长度。
4)单元标识符(1字节):用于标识ModBus设备。
5)功能码(1字节):指定要执行的操作。
6)字节数(1字节):数据的字节数量
6)数据(可变长度):根据功能码的不同,数据字段可以包含不同类型的数据。
ModBus RTU数据帧:
ModBus RTU是基于串行通信的ModBus协议版本。在ModBus RTU中,数据帧格式如下:
1)地址(1字节):用于标识ModBus设备。
2)功能码(1字节):指定要执行的操作。
3) 字节数(1 字节) :数据的字节个数
3) 数据(可变长度):根据功能码的不同,数据字段可以包含不同类型的数据。
4) CRC(2字节):用于检测数据传输中的错误。
数据帧具体举例
ModBusTCP和ModBusRTU数据帧,主从对比示例。功能码为4
以下是一个主从模式下使用功能码为4的ModBusTCP和ModBusRTU数据帧的对比示例:
假设我们有一个ModBus主设备(主机)和一个ModBus从设备(从机),主设备要从从设备读取输入寄存器的值。
ModBus TCP主从模式数据帧示例:
主设备发送:
1)事务标识符:0x0001
2)协议标识符:0x0000
3)长度字段:0x0006
4)单元标识符:0x01
5)功能码:0x04
6)起始地址:0x0000
7)读取长度:0x0002
从设备响应:
1)事务标识符:0x0001
2)协议标识符:0x0000
3)长度字段:0x0005
4)单元标识符:0x01
5)功能码:0x04
6)字节数:0x04
7)数据:0x1234 0x5678(输入寄存器的值)
ModBus RTU主从模式数据帧示例:
主设备发送:
1)地址:0x01
2)功能码:0x04
3)起始地址:0x0000
4)读取长度:0x0002
5)CRC:0xA9 0x39(根据数据计算的循环冗余校验)
从设备响应:
1)地址:0x01
2)功能码:0x04
3)字节数:0x04
4)数据:0x34 0x12 0x78 0x56(输入寄存器的值,低位在前)
5)CRC:0x9E 0x80(根据数据计算的循环冗余校验)
可以看到,ModBusTCP和ModBusRTU主从模式下的数据帧结构也是基本相同的,都包含了地址、功能码、起始地址、读取长度和数据字段。不同之处在于ModBusTCP数据帧中包含了额外的字段(事务标识符、协议标识符、长度字段),而ModBusRTU数据帧中则没有这些字段。此外,ModBusRTU数据帧中的数据字段是按照字节顺序排列的,而ModBusTCP数据帧中则是按照字节顺序排列的。
帧格式对比
从机
类型 | MBAP报文头 | 地址码 | 功能码 | 寄存器地址 | 寄存器数量 | CRC校验 |
---|---|---|---|---|---|---|
MODBUS RTU | 无 | 0C | 04 | 00 00 | 00 05 | XX XX |
MODBUS TCP | 00 01 00 00 00 06 | 0C | 04 | 00 00 | 00 05 | 无 |
主机
类型 | MBAP报文头 | 地址码 | 功能码 | 数据长度 | 具体数据 | CRC校验 |
---|---|---|---|---|---|---|
MODBUS RTU | 无 | 0C | 04 | 0a | 00 05 … | XX XX |
MODBUS TCP | 00 01 00 00 00 06 | 0C | 04 | 0a | 00 05 … | 无 |
图示
如果需要将MODBUS TCP数据转化为MODBUS RTU数据则只需要将RTU数据的CRC校验去掉,然后加上事务处理标识符、协议标识符、长度字段信息即可。