1.ADU

Application Data Unit:应用数据单元;

2.PDU

Protocol Data Unit:协议数据单元;由功能码+数据组成。

功能码是一个字节,数据长度不定,由具体功能码的具体功能决定。

3.MBAP

报文头,长度7个字节。

MBAP组成 字节个数 说明
事物处理标识 2 可以理解为报文的序列号,一般每次通信后就要加1以区别不同的通信数据报文;由客户端生成;应答时复制该值
协议标识 2 00 00:表示ModbusTCP协议;由客户端生成;应答时复制该值
长度 2 表示该字节后面的数据长度,单位为字节;
单元标识符 1 设备地址;由客户端生成;应答时复制该值

 

 

 

 

 

 

 

 

4.modbus tcp和modbus rtu协议格式

modbus tcp数据帧(ADU)由MBAP+PDU组成;物理层为以太网接口。

modbus rtu数据帧(ADU)由地址+PDU+校验组成;物理层为串口,RS232、RS422、RS485。

modbus tcp 和modbus rtu数据帧中的PDU部分是相同的。

   MBAP 地址   功能码  数据  CRC16校验
Modbus RTU  无  1字节  1字节  n字节  2字节
Modbus TCP  7字节  无  1字节  n字节  无

 

 

 

 

 

 

5.示例

以下表格中的数据都是十六进制。

1)01H-读线圈

含义:读从机线圈寄存器,位操作,可读单个或者多个。返回数据中一个地址的数据为1位,data1的最低位代表最低地址的线圈状态。

例:从机地址01,寄存区开始地址0x23,总共读取21个线圈:

  MBAP 从机地址 功能码 寄存器地址 寄存器个数 CRC
modbus rtu发送
01 01 00 23 00 17 XX XX
modbus tcp发送

00 01 00 00

00 06 01


01 00 23 00 17

 

 

 

 

 

 

  MBAP 从机地址 功能码 返回字节数 data1 data2 data3 CRC
modbus rtu响应
01 01 03 a5 d4 18 XX XX
modbus tcp响应

00 01 00 00

00 06 01


01 03 a5 d4 18

 

 

 

 

 

2)02H-读离散输入状态

含义:读离散输入寄存器,位操作,可读单个或多个,协议类似功能码01H协议。

3)03H-读保持寄存器

含义:读保持寄存器,字节指令操作,可读单个或者多个;

例如:从机地址01,起始地址为0x32,读2个保持寄存器:

  MBAP 从机地址 功能码 寄存器地址 寄存器个数 CRC
modbus rtu发送
01 03 00 32 00 02 XX XX
modbus tcp发送

00 01 00 00

00 06 01


03 00 32 00 02

 

 

 

 

  

  MBAP 从机地址 功能码 返回字节数 data1H data1L data2H data2L CRC
modbus rtu响应
01 03 04 a5 d4 18 12 XX XX
modbus tcp响应

00 01 00 00

00 07 01


03 04 a5 d4 18 12

 

 

 

 

 

4)04H-读输入寄存器

含义:读输入寄存器,字节指令操作,可读单个或者多个。协议格式同03指令。

5)05H-写单个线圈

含义:写单个线圈,位操作,只能写一个;值为0xff00表示设置线圈状态为ON,写0x0000表示设置线圈状态为OFF;

例如:设置0x0032线圈为ON。

  MBAP 从机地址 功能码 寄存器地址 寄存器个数 CRC
modbus rtu发送
01 05 00 32 ff 00 XX XX
modbus tcp发送

00 01 00 00

00 06 01


05 00 32 ff 00

 

 

 

 

 

 响应指令同发送指令一样。

 6)06H-写单个保持寄存器

含义:写单个保持寄存器,字节指令操作,只能写一个;

例如:写0x0032保持寄存器为0x1234

  MBAP 从机地址 功能码 寄存器地址 寄存器个数 CRC
modbus rtu发送
01 06 00 32 12 34 XX XX
modbus tcp发送

00 01 00 00

00 06 01


06 00 32 12 34

 

 

 

 

 

响应指令同发送指令一样。

07)0FH-写多个线圈

含义:写多个线圈寄存器;若数据区对应的位值为“1”表示设置线圈状态为ON;若值为“0”,则状态为OFF;

例如:线圈地址为0x04a5,写12个线圈:

  MBAP 从机地址 功能码 寄存器地址 寄存器个数 data1 data2 CRC
modbus rtu发送
01 0f 04 a5 00 0d 0c 02 XX XX
modbus tcp发送

00 01 00 00

00 08 01


0f 04 a5 00 0d 0c 02

 

 

 

 

 

  MBAP 从机地址 功能码 寄存器地址 寄存器个数 字节数 CRC
modbus rtu响应
01 0f 04 a5 00 0d 02 XX XX
modbus tcp响应

00 01 00 00

00 07 01


0f 04 a5 00 0d 02

 

 

 

 

 

08)10H-写多个保持寄存器

含义:写多个保持寄存器,字节指令操作,可写多个;

例如:稀释地址为0x0034,写2个寄存器4个字节的数据:

  MBAP 从机地址 功能码 寄存器地址 寄存器个数 字节数 data1H data1L data2H data2L CRC
modbus rtu发送
01 10 00 34 00 02 04 0c 02 12 45 XX XX
modbus tcp发送

00 01 00 00

00 0B 01


10 00 34 00 02 04 0c 02 12 45

 

 

 

 

  

  MBAP 从机地址 功能码 寄存器地址 寄存器个数 CRC
modbus rtu响应
01 10 00 34 00 02 XX XX
modbus tcp响应

00 01 00 00

00 06 01


10 00 34 00 02
posted on 2021-06-29 15:32  风光霁月  阅读(944)  评论(0)    收藏  举报