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 |
浙公网安备 33010602011771号