Modbus TCP 格式
| 事务ID | 协议ID | 长度 | 单元ID | 功能码 | 数据 |
- 事务 ID(2 字节):用于标识请求和响应的配对。
- 协议 ID(2 字节):通常为 0,表示 Modbus 协议。
- 长度(2 字节):表示后续数据的字节数(不包括事务 ID、协议 ID 和长度字段)。
- 单元 ID(1 字节):从设备的地址。对于 Modbus TCP,通常可以忽略此字段。
- 功能码(1 字节):与 Modbus RTU 相同。
- 数据(n 字节):根据功能码而定,包含请求或响应的数据。
示例:
发送读取保持寄存器的请求,假设事务 ID 为 1,协议 ID 为 0,单元 ID 为 1,功能码为 3,读取寄存器地址为 0,数量为 2:
| 0x00 0x01 | 0x00 0x00 | 0x00 0x06 | 0x01 | 0x03 | 0x00 | 0x00 | 0x00 | 0x02 |
-
事务 ID(Transaction ID):
0x00 0x01
- 2 字节:用于标识请求和响应的配对。通常在每次请求时自增。
- 在这里,它的值是 1。
-
协议 ID(Protocol ID):
0x00 0x00
- 2 字节:表示协议类型。对于 Modbus,通常为 0,表示使用 Modbus 协议。
-
长度(Length):
0x00 0x06
- 2 字节:表示后续数据的字节数(不包括事务 ID、协议 ID 和长度字段)。
- 在这个例子中,后续数据的长度是 6 字节。
-
单元 ID(Unit ID):
0x01
- 1 字节:表示从设备的地址。可以理解为设备的标识符。在这里,设备地址为 1。
-
功能码(Function Code):
0x03
- 1 字节:表示请求的操作类型。
0x03
代表“读取保持寄存器”(Read Holding Registers)。
- 1 字节:表示请求的操作类型。
-
数据(Data):
0x00 0x00
:表示寄存器的起始地址。此处为寄存器地址 0。0x00 0x02
:表示要读取的寄存器数量。在这个例子中,数量为 2。
其中功能码为一个字节,modbus定义的功能码有:
- 01 读线圈(coils)状态,读取单个或多个
- 02 读离散输入(discreteinputs)状态,读取单个或多个
- 03 读保持寄存器(holdingregisters),读取单个或多个
- 04 读输入寄存器(inputregisters),读取单个或多个
- 05 写单个线圈(coils)状态,单个写入
- 06 写单个保持寄存器(holdingregisters),单个写入
- 15 写多个线圈(coils),多个写入
- 16 写多个保持寄存器(holdingregisters),多个写入
示例:
假设你要从单元 ID 为 1 的设备读取从地址 0 开始的 10 个线圈的状态。构建的请求可能如下:|
| 0x00 0x01 | 0x00 0x00 | 0x00 0x07 | 0x01 | 0x01 | 0x00 | 0x00 | 0x00 | 0x0A |
各字段解释:
- 事务 ID(
0x00 0x01
):用于标识请求,可以是任意值,通常在每次请求时自增。 - 协议 ID(
0x00 0x00
):通常为 0,表示 Modbus 协议。 - 长度(
0x00 0x07
):后续数据的字节数,这里是 7 字节(功能码和数据部分)。 - 单元 ID(
0x01
):表示从设备的地址。 - 功能码(
0x01
):表示读取线圈状态。 - 起始地址(
0x00 0x00
):表示从地址 0 开始读取。 - 数量(
0x00 0x0A
):表示要读取的线圈数量,这里为 10。
响应格式
从设备的响应将包含请求的线圈状态,格式如下:
| 事务 ID | 协议 ID | 长度 | 单元 ID | 功能码 | 字节数 | 状态 |
示例响应(假设读取到的状态为 10 个线圈的状态):
| 0x00 0x01 | 0x00 0x00 | 0x00 0x06 | 0x01 | 0x01 | 0x02 | 0xFF | 0x0A |
- 字节数:状态数据的字节数,这里为 2 字节(10 个线圈的状态)。
- 状态:每个线圈状态用 1 位表示,
0xFF
表示所有线圈为 1,0x0A
的二进制为00001010
表示第 1、3、5、7 个线圈为 1,其余为 0。