前面啥也没有
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 |