阐述 Modbus 四种寄存器(通信对象)
不是芯片物理硬件寄存器,是固件软件内存,是逻辑寄存器。
很多人会混淆:芯片CPU内部的物理寄存器 和 Modbus逻辑寄存器,二者完全两码事。
1 关键点
Modbus的线圈、离散输入、保持寄存器、输入寄存器,叫Modbus逻辑寄存器。
- 单片机/PLC芯片本身,有CPU物理寄存器(用于CPU运算,和Modbus无关)。
- Modbus的4组,是固件在RAM内存里开辟出来的四块内存区域,软件层面模拟出来的逻辑存储区,不是硬件芯片自带的物理寄存器。
固件工作流程:
- 固件在内存划分四块内存:线圈区(bit位)、离散输入区(bit)、保持寄存器区(16bit字)、输入寄存器区(16bit字)
- 硬件采集传感器 → 固件把温度、压力写到【输入寄存器】内存块里
- 外部4‑20mA端子、开关量输入,固件刷新到【离散输入/线圈】内存
- 上位机Modbus报文过来,固件读取/修改这四块内存,把内存数据返回给主站
- 如果上位机写保持寄存器,固件读到内存变化,再去控制继电器、输出模拟量。
真实硬件:Modbus寄存器 = RAM内存的一块逻辑分区。
Java模拟Modbus从站:数组/Map = 模拟这块RAM内存分区,二者原理一模一样。
2 Modbus四种逻辑寄存器
| 类型 | 存储单位 | 读写权限 | 通俗说明 |
|---|---|---|---|
| 线圈 Coils | 1 bit(0/1) | 可读、可写 | 开关输出,控制继电器通断。比如0=断开,1=闭合 |
| 离散输入 Discrete Inputs | 1 bit(0/1) | 只读 | 外部开关输入,硬件检测到按钮按下,固件置1,上位机只能读不能改 |
| 保持寄存器 Holding Register | 16 bit(1个字,0‑65535) | 可读、可写 | 最重要。存参数、设定值、温度压力,上位机可以读写。设备参数、配置大多放这里 |
| 输入寄存器 Input Register | 16 bit(1个字) | 只读 | 传感器原始采集值。比如AD采样出来的电压、温度,硬件更新,上位机只能读取,不能修改 |
2.1 地址小知识
- 线圈、离散输入:按位访问,一个地址代表1个开关位
- 保持、输入寄存器:按字访问,一个地址代表1个16位的字
注意:这些地址只是固件给这四块内存编的编号,不是CPU物理内存地址,是Modbus协议层面的逻辑地址。
3 举例
一个温控仪表:
- 测温探头采集温度,固件把温度值写入输入寄存器地址0(只读,上位机只能看,不能改温度原始采集值)
- 温度设定目标值,存放在保持寄存器地址0(上位机可以读写,写这个寄存器就修改设备设定温度)
- 继电器输出触点状态放在线圈地址0,写1就开启加热继电器
- 外部报警按钮信号,映射到离散输入地址0,上位机读取看按钮有没有按下
所有数据都放在固件RAM四块逻辑内存,Modbus通信只是读写这四块内存。
4 容易踩坑区分
- CPU物理寄存器:芯片内部,CPU运算用,和Modbus无关。
- Modbus逻辑寄存器:固件在RAM中开辟的4块内存,给Modbus协议使用。
- Java模拟从站:用数组模拟这四块RAM,没有真实硬件,纯软件内存。
5 总结
Modbus的四类寄存器,不是芯片硬件寄存器,是固件在内存划分出来的四块逻辑存储区,Modbus协议就是读写这四块内存。