1. 数据类型与存储区分类
Modbus协议将数据分为四类存储区,通过存储区代号区分:
-
输出线圈(0x):可读写,对应二进制开关量(如继电器状态),地址范围
000001-065536
(绝对地址)。 -
输入线圈(1x):只读,用于读取外部设备状态(如传感器开关),地址范围
100001-165536
。 -
输入寄存器(3x):只读,存储16位数据(如温度值),地址范围
300001-365536
。 -
输出寄存器(4x):可读写,用于控制设备参数(如设定频率),地址范围
400001-465536
。
每个存储区最多支持65536个元素(线圈或寄存器),通过偏移量定位具体地址。
2. 地址模型
Modbus有两种地址表示方式:
-
PLC地址模型:直接使用存储区代号+偏移量,如
D100
表示D区第100个字,M10
表示M区第10个位。 -
Modbus地址模型:采用六位绝对地址,由存储区代号+(偏移量+1)组成。
-
例如:
-
4区第1个寄存器 →
400001
(绝对地址),对应偏移量0。 -
4区第100个寄存器 →
400100
(绝对地址),对应偏移量99。
-
为何协议报文中使用相对地址?
协议报文中仅包含偏移量(从0开始),结合功能码即可确定存储区。若用绝对地址(如400001),可能因功能码冲突导致歧义。
3. 长地址 vs 短地址模型
-
长地址模型:六位数地址,覆盖全范围(如
400001-465536
),适用于PLC等复杂系统。 -
短地址模型:五位数地址,范围缩小(如输出线圈
00001-09999
),常见于仪表、变频器等简单设备,便于配置。
示例转换:
PLC的D100
对应Modbus长地址400100
(4区偏移量99),而短地址可能直接表示为40099
。
4. 协议分类
Modbus协议根据传输方式和介质分为多种类型:
-
串口通信(RS232/485/422):
-
Modbus RTU:二进制编码,高效,使用CRC校验。
-
Modbus ASCII:文本编码,可读性强,效率较低,使用LRC校验。
-
-
以太网通信:
-
Modbus TCP:基于TCP/IP,无校验,适用于工业以太网。
-
Modbus RTU/ASCII Over TCP/UDP:将串口协议封装在TCP/UDP包中,兼容旧设备。
-
5. 功能码说明
功能码是操作指令的代号,定义了对存储区的读写行为:
-
读取操作:
-
01
:读取输出线圈(如继电器状态)。 -
02
:读取输入线圈(如传感器开关)。 -
03
:读取输出寄存器(如读取PLC参数)。 -
04
:读取输入寄存器(如采集温度值)。
-
-
写入操作:
-
05
:写入单个线圈(如控制继电器通断)。 -
0F
:写入多个线圈。 -
06
:写入单个寄存器(如修改频率设定)。 -
10
:写入多个寄存器
-
6. 关键总结
-
存储区与地址:通过功能码+偏移量定位数据,长地址兼容全范围,短地址简化配置。
-
协议选择:RTU适合高效串口通信,TCP用于以太网,ASCII便于调试。
-
功能码核心作用:明确操作类型(读/写)和目标存储区,是协议交互的核心指令。
示例应用:
若要读取变频器的运行频率(存储在输出寄存器4x,地址400010),使用功能码03
,发送偏移量9(因绝对地址400010对应偏移量9)。设备返回该寄存器的16位数据值。