Modbus TCP帧结构详解

jmfans 发布于 2024-08-30 1.21k 次阅读


AI 摘要

Modbus TCP基于TCP/IP协议,无需静默时间,使用MBAP头和PDU传输数据。

Modbus TCP是基于TCP/IP协议的Modbus变体,常用于以太网网络中。与Modbus RTU和Modbus ASCII不同,Modbus TCP没有起始和结束静默时间,而是使用TCP/IP协议进行数据传输。以下是Modbus TCP帧结构的详细解释:

Modbus TCP帧结构

Modbus TCP帧由以下几个部分组成:

  1. MBAP头(Modbus Application Protocol Header)
  2. PDU(Protocol Data Unit)

1. MBAP头

MBAP头包含7个字节,具体结构如下:

  • 事务标识符(Transaction Identifier): 2字节
    • 用于匹配请求和响应。
  • 协议标识符(Protocol Identifier): 2字节
    • 固定为0,表示Modbus协议。
  • 长度(Length): 2字节
    • 表示后续数据的长度,包括单元标识符和PDU。
  • 单元标识符(Unit Identifier): 1字节
    • 用于标识从设备,在Modbus TCP中通常用于网关场景。

2. PDU(Protocol Data Unit)

PDU包含以下部分:

  • 功能码(Function Code): 1字节
    • 指定请求的操作类型(如读写寄存器)。
  • 数据域(Data): 可变长度
    • 包含与功能码相关的数据(如寄存器地址和数量)。

完整的Modbus TCP帧结构

+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| Transaction ID   | Protocol ID      | Length           | Unit ID          | Function Code    | Data             |
| (2 bytes)        | (2 bytes)        | (2 bytes)        | (1 byte)         | (1 byte)         | (N bytes)        |
+------------------+------------------+------------------+------------------+------------------+------------------+------------------+

示例

假设我们有一个读取保持寄存器(功能码0x03)的请求,其事务标识符为0x0001,协议标识符为0x0000,单元标识符为0x01,读取的寄存器地址为0x0010,数量为2。帧结构如下:

  • 事务标识符: 0x0001
  • 协议标识符: 0x0000
  • 长度: 0x0006(1字节Unit ID + 1字节Function Code + 4字节Data)
  • 单元标识符: 0x01
  • 功能码: 0x03
  • 数据: 0x0010(起始地址) + 0x0002(寄存器数量)
+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| 0x00             | 0x01             | 0x00             | 0x00             | 0x00             | 0x06             | 0x01             | 0x03             | 0x00             | 0x10             | 0x00             | 0x02             |
+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+

响应帧结构

如果从设备响应读取请求,返回的帧结构如下:

  • 事务标识符: 0x0001(与请求一致)
  • 协议标识符: 0x0000
  • 长度: 0x0005(1字节Unit ID + 1字节Function Code + 1字节Byte Count + N字节Data)
  • 单元标识符: 0x01
  • 功能码: 0x03
  • 字节计数: 0x04(读取2个寄存器,每个寄存器2字节)
  • 数据: 寄存器值(每个寄存器2字节)

假设读取的寄存器值为0x1234和0x5678:

+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| 0x00             | 0x01             | 0x00             | 0x00             | 0x00             | 0x07             | 0x01             | 0x03             | 0x04             | 0x12             | 0x34             | 0x56             | 0x78             |
+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+

更多通讯协议请访问--点击跳转