0%

Modbus通讯协议

前面啥也没有

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