Modbus TCP 数据帧
MBAP + PDU
MBAP: Modbus Application Protocol Header
PDU:Protocol Data Unit
MBAP + Function code + Data
示例:
00 01 00 00 00 06 01
事务标识2+modbus协议2+数据长度2+Slave站号1
Function code:
0x01:读线圈
02:读离散量输入
03:读保持寄存器
04:读输入寄存器
05:写单个线圈
06:写单个保持寄存器
10:写多个保持寄存器
0F:写多个线圈
报文头部:
字节序号 | 含义 | 客户端 | 服务器 |
---|---|---|---|
BYTE 0 – 1 | 传输标志,事务标识符 | 由客户端生成 | 应答时复制该值 |
BYTE 2 – 3 | 协议标识,Modbus 协议=0 | 由客户端生成 | 应答时复制该值 |
BYTE 4 ¬- 5 | 报文后续数据的字节长度 | 由客户端生成 | 应答时由服务器重新生成 |
BYTE 6 | MODBUS单元标志 | 由客户端生成 | 应答时复制该值 |
Modbus TCP协议功能码报文
功能码3 读多个寄存器
请求报文格式
字节序号 | 含义 |
---|---|
BYTE 7 | 功能码=3 |
BYTE 8 - 9 | 读取数据的寄存器偏移地址 |
BYTE 10 - 11 | 读取数据的寄存器数量,单位为Word |
读数据成功的响应报文格式
字节序号 | 含义 |
---|---|
BYTE 7 | 功能码=3 |
BYTE 8 | 读取到的数据的字节数 |
BYTE 9- 10 | 读取到的寄存器1的数据 |
BYTE 11 - 12 | 读取到的寄存器2的数据 |
…. | … |
功能码16 写多个寄存器
请求报文格式
字节序号 | 含义 |
---|---|
BYTE 7 | 功能码=16 |
BYTE 8 - 9 | 写数据的寄存器偏移地址 |
BYTE 10 - 11 | 写数据的寄存器数量,单位为Word |
BYTE 12 | 写数据的字节数(数据等于写数据的寄存器数量 x 2) |
BYTE 13 - 14 | 寄存器1的数据 |
BYTE 15 - 16 | 寄存器1的数据 |
写数据成功的响应报文格式
字节序号 | 含义 |
---|---|
BYTE 7 | 功能码=16 |
BYTE 8 - 9 | 写数据的寄存器偏移地址 |
BYTE 10 - 11 | 写数据的寄存器数量,单位为WORD |
功能码6 写单个寄存器
请求报文格式
字节序号 | 含义 |
---|---|
BYTE 7 | 功能码=6 |
BYTE 8 - 9 | 写数据的寄存器偏移地址 |
BYTE 10 - 11 | 寄存器的数值 |
写数据成功的响应报文格式
字节序号 | 含义 |
---|---|
BYTE 7 | 功能码=6 |
BYTE 8 - 9 | 写数据的寄存器偏移地址 |
BYTE 10 - 11 | 寄存器的数值 |
控制 IB IL 24 DO8开关量输出模块请求报文,模块寄存器地址:384,控制数据在最后一个字节;
0F 01 00 00 00 06 FF 06 01 80 00 0F
控制DO输出成功响应报文
0F 01 00 00 00 06 FF 06 01 80 00 0F
读取 IB IL 24 DI8开关量输入模块请求报文,模块寄存器地址:0,数据寄存器长度为1;
0B 01 00 00 00 06 FF 03 00 00 00 01
读取IB IL 24 DI8开关量输入成功的响应报文,数据在最后一个字节;
0B 01 00 00 00 05 FF 03 02 00 XX
读取 IB IL AI2SF-230模拟量输入模块请求报文,模块寄存器地址:192,数据寄存器长度为2,该模块默认连接0~10V信号;
0B 02 00 00 00 06 FF 03 00 C0 00 02
读取数据成功的响应报文,数据在最后4个字节,分别为通道1~2;
0B 02 00 00 00 07 FF 03 04 XX XX XX XX
Kepserver
Address
输出线圈: 000001 ~ 065536
输入线圈: 100001 ~ 165536
内部寄存器:300001 ~ 365536
保持寄存器:400001 ~ 465536
访问输出线圈:Address:000001
访问连续10个输出线圈:Address:000001#10
访问保持寄存器:Address:400001
访问连续10个保持寄存器:Address:400001[10]
1 |