Modbus TCP 介绍

Modbus=MBAP(报文头)+PDU(帧结构)

Modbus TCP 使用 TCP 协议传输数据,传输的数据是 Modbus 格式。

客户端传输数据时是以十六进制发送,每次发送两位;服务器接收数据时也是以十六进制的形式接收,每次接收两位。 如:0X00,两位十六进制数是 8 位二进制数。

MBAP

事务标识符协议标识长度单元标识符
2 字节2 字节2 字节1 字节
00 0000 0000 0001
  • 事务标识符:可以解释为报文的序列号,例如测试使用的 Modbus Poll 客户端一直发送数据,所以每发送一次数据标识符就加一。服务器接收时会把这个数据原封返回。
  • 协议表示:00 00 代表 TCP 协议。
  • 长度:表示从单元标识符开始后面数据的长度。如:00 06 表示后面有 0X06 个字节长度的数据。
  • 单元标识符:相当于设备的地址。一般为 01。

PDU

PDU=功能码+数据

功能码数据
1 字节视功能而定

功能码:

Modbus 的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。

  • 线圈:相当于开关,在 Modbus 中可读可写,数据只有 00 和 01。
  • 离散量:输入位,开关量,在 Modbus 中只读。
  • 输入寄存器:只能从模拟量输入端改变的寄存器,在 Modbus 中只读。
  • 保持寄存器:用于输出模拟量信号的寄存器,在 Modbus 中可读可写。

根据对象的不同,Modbus 的功能码有:

  • 0x01:读线圈
  • 0x05:写单个线圈
  • 0x0F:写多个线圈
  • 0x02:读离散量输入
  • 0x04:读输入寄存器
  • 0x03:读保持寄存器
  • 0x06:写单个保持寄存器
  • 0x10:写多个保持寄存器

报文的详细解读

这里只以读保持寄存器内容为例,以下数据全部为 16 进制数据。

请求:00 01 00 00 00 06 01 03 00 02 00 04(客户端)

  • 00 01:事务标识符
  • 00 00:Modbus TCP 协议
  • 00 06:后面有 00 06 个字节数据
  • 01:单元标识符
  • 03:功能码(读保持寄存器)
  • 00 02:开始读的数据的地址。从 00 02 开始读数据。
  • 00 04:注意这里不是读到 00 04,而是从开始位置读 00 04 个寄存器数据。

回应:00 01 00 00 00 09 01 03 08 00 00 00 37 00 00 00 00(服务器)

  • 00 01:事务标识符
  • 00 00:Modbus TCP 协议
  • 00 09:后面有 00 09 个字节数据
  • 01:单元标识符
  • 03:功能码
  • 08:后面有 08 个字节的数据,后面的数据每两字节表示一个寄存器数据。
  • 00 00:第一个寄存器数据
  • 00 37:第二个寄存器数据
  • 00 00:第三个寄存器数据
  • 00 00:第四个寄存器数据