什么是输入寄存器 什么是输出寄存器 什么是写输入寄存器 什么是读保持寄存器
在 Modbus 协议中,寄存器(Registers)是用于存储设备数据的存储单元,主要分为 输入寄存器(Input Registers) 和 保持寄存器(Holding Registers)。此外,还有 线圈(Coils) 和 离散输入(Discrete Inputs),但这里我们主要讨论 寄存器 相关的概念。
1. 输入寄存器(Input Registers)
(1) 定义
输入寄存器(Input Registers) 是 只读(Read-Only) 的 16 位寄存器。
通常用于存储 设备的状态、传感器数据、测量值 等(如电压、电流、温度)。
无法通过 Modbus 写入,只能读取。
(2) 功能码
读输入寄存器(Function Code
0x04
):用于读取输入寄存器的值。
示例请求:
[Transaction ID] [Protocol ID] [Length] [Unit ID] [0x04] [Start Address Hi] [Start Address Lo] [Quantity Hi] [Quantity Lo]
示例响应:
[Transaction ID] [Protocol ID] [Length] [Unit ID] [0x04] [Byte Count] [Data Hi] [Data Lo] [Data Hi] [Data Lo] ...
(3) 典型应用
读取模拟量输入(如 PLC 的 AI 模块数据)。
读取设备运行状态(如温度、压力)。
2. 保持寄存器(Holding Registers)
(1) 定义
保持寄存器(Holding Registers) 是 可读可写(Read-Write) 的 16 位寄存器。
通常用于存储 设备参数、控制命令、配置数据(如 PID 参数、设定值)。
可以通过 Modbus 读取和写入。
(2) 功能码
读保持寄存器(Function Code
0x03
):用于读取保持寄存器的值。
示例请求:
[Transaction ID] [Protocol ID] [Length] [Unit ID] [0x03] [Start Address Hi] [Start Address Lo] [Quantity Hi] [Quantity Lo]
示例响应:
[Transaction ID] [Protocol ID] [Length] [Unit ID] [0x03] [Byte Count] [Data Hi] [Data Lo] [Data Hi] [Data Lo] ...
写单个保持寄存器(Function Code
0x06
):用于写入单个保持寄存器的值。
示例请求:
[Transaction ID] [Protocol ID] [Length] [Unit ID] [0x06] [Register Address Hi] [Register Address Lo] [Value Hi] [Value Lo]
示例响应(服务器原样返回):
[Transaction ID] [Protocol ID] [Length] [Unit ID] [0x06] [Register Address Hi] [Register Address Lo] [Value Hi] [Value Lo]
写多个保持寄存器(Function Code
0x10
):用于写入多个保持寄存器的值。
示例请求:
[Transaction ID] [Protocol ID] [Length] [Unit ID] [0x10] [Start Address Hi] [Start Address Lo] [Quantity Hi] [Quantity Lo] [Byte Count] [Data Hi] [Data Lo] [Data Hi] [Data Lo] ...
示例响应(服务器返回起始地址和数量):
[Transaction ID] [Protocol ID] [Length] [Unit ID] [0x10] [Start Address Hi] [Start Address Lo] [Quantity Hi] [Quantity Lo]
(3) 典型应用
写入设备参数(如设定温度、速度)。
读取设备配置(如通信参数)。
3. 输入寄存器 vs. 保持寄存器
特性 | 输入寄存器(Input Registers) | 保持寄存器(Holding Registers) |
---|---|---|
读写权限 | 只读(Read-Only) | 可读可写(Read-Write) |
功能码 |
|
|
典型用途 | 传感器数据、状态监测 | 参数设置、控制命令 |
是否可修改 | ❌ 不能通过 Modbus 写入 | ✅ 可以写入 |
4. 常见问题
(1) 为什么没有“写输入寄存器”功能码?
输入寄存器是只读的,设计上不允许通过 Modbus 协议修改。
如果设备需要更新输入寄存器的值(如传感器数据),通常由设备内部逻辑或硬件接口(如 ADC)自动更新。
(2) 保持寄存器能存储什么数据?
可以是 任何 16 位数据,如:
整数(如
0x1234
)浮点数(IEEE 754 格式,占用 2 个寄存器)
状态标志(如
0x0001
表示“运行”)
(3) Modbus 地址范围
输入寄存器:通常从
30001
开始(Modbus 地址0x0000
)。保持寄存器:通常从
40001
开始(Modbus 地址0x0000
)。具体范围取决于设备厂商定义。
5. 总结
概念 | 说明 |
---|---|
输入寄存器(Input Registers) | 只读,用于读取设备状态或传感器数据(功能码 |
保持寄存器(Holding Registers) | 可读可写,用于参数配置或控制(功能码 |
写输入寄存器 | Modbus 不支持,输入寄存器是只读的。 |
读保持寄存器 | 使用 |
如果你在开发 Modbus 设备或调试通信,理解这些寄存器的区别非常重要! 🚀