什么是输入寄存器 什么是输出寄存器 什么是写输入寄存器 什么是读保持寄存器

在 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)
​​功能码​​ 0x04(读输入寄存器) 0x03(读保持寄存器)、0x06(写单个)、0x10(写多个)
​​典型用途​​ 传感器数据、状态监测 参数设置、控制命令
​​是否可修改​​ ❌ 不能通过 Modbus 写入 ✅ 可以写入

​​4. 常见问题​​

​​(1) 为什么没有"写输入寄存器"功能码?​​

  • ​​输入寄存器是只读的​​,设计上不允许通过 Modbus 协议修改。

  • 如果设备需要更新输入寄存器的值(如传感器数据),通常由设备内部逻辑或硬件接口(如 ADC)自动更新。

​​(2) 保持寄存器能存储什么数据?​​

  • 可以是 ​​任何 16 位数据​​,如:

    • 整数(如 0x1234)

    • 浮点数(IEEE 754 格式,占用 2 个寄存器)

    • 状态标志(如 0x0001表示"运行")

​​(3) Modbus 地址范围​​

  • ​​输入寄存器​ ​:通常从 30001开始(Modbus 地址 0x0000)。

  • ​​保持寄存器​ ​:通常从 40001开始(Modbus 地址 0x0000)。

  • 具体范围取决于设备厂商定义。


​​5. 总结​​

​​概念​​ ​​说明​​
​​输入寄存器(Input Registers)​​ 只读,用于读取设备状态或传感器数据(功能码 0x04)。
​​保持寄存器(Holding Registers)​​ 可读可写,用于参数配置或控制(功能码 0x03、0x06、0x10)。
​​写输入寄存器​​ Modbus 不支持,输入寄存器是只读的。
​​读保持寄存器​​ 使用 0x03读取保持寄存器的值。

如果你在开发 Modbus 设备或调试通信,理解这些寄存器的区别非常重要! 🚀

相关推荐
蹊黎9 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
无敌贵点大王13 小时前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件
庙堂龙吟奈我何13 小时前
二进制和十六进制
stm32·单片机
国科安芯15 小时前
长期在轨的计算底座:商业空间站与在轨服务飞行器健康管理中的抗辐射MCU—— 面向可维护空间平台的分层容错与安全通信综述
人工智能·单片机·嵌入式硬件·安全·低轨卫星·抗辐射
不昀17 小时前
RMII切到10Mbps,50MHz参考时钟也要降到5MHz吗?
单片机·嵌入式硬件·硬件设计·以太网接口
路上有只喵18 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇6
单片机·嵌入式硬件
集芯微电科技有限公司19 小时前
40V/24A高频率增强型GaN HEMT功率开关管/高频DC转换/电动工具/GaN充电器 方案首选
人工智能·科技·单片机·嵌入式硬件·深度学习·神经网络·生成对抗网络
十八岁牛爷爷19 小时前
STM32H7 长时间运行后 HTTP 断连:从“串口还活着”到 TX 描述符错账
stm32·单片机·嵌入式硬件
Lxx_Zw19 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·stm32·单片机·嵌入式硬件
凯基迪科技20 小时前
瑞萨R5F100解密 R8C/RL78 MCU 固件读取与保护机制详解
服务器·网络·单片机