modbus rtu数据寄存器地址
时间: 2025-03-06 22:34:16 浏览: 86
### Modbus RTU 数据寄存器地址详解
#### 寄存器分类
Modbus RTU 中的数据寄存器分为四类,每种类型的寄存器都有特定的用途和地址范围:
1. **线圈 (Coils)**
地址范围:`0x0000` 至 `0xFFFF`
描述:这些是离散输入或输出点,每个线圈占用一位。可以用来控制继电器、指示灯等。
2. **离散输入 (Discrete Inputs)**
地址范围:`10001` 至 `19999`
描述:只读状态量,通常用于监控开关位置或其他二进制信号源的状态。
3. **保持寄存器 (Holding Registers)**
地址范围:`40001` 至 `49999`
描述:可读写的多字节存储区,常用于保存配置参数、测量值和其他过程数据。每个寄存器为两个字节大小[^1]。
4. **输入寄存器 (Input Registers)**
地址范围:`30001` 至 `39999`
描述:只读的多字节存储区,主要用于记录外部设备传来的模拟量转换后的数值或者其他不可更改的过程数据。
#### 寄存器寻址方式
在实际应用中,为了方便编程人员理解,不同厂商可能采用不同的命名约定来表示上述四种类型的寄存器。例如,在某些情况下,“保持寄存器”的起始地址可能是`40001`而不是`0x0000`;同样地,“输入寄存器”的起始地址也可能是`30001`而非`0x0000`。这种差异主要是出于历史原因以及便于人类阅读的目的而设定的不同偏移量[^2]。
当通过Modbus RTU访问某个具体的寄存器时,除了指定该寄存器的实际物理地址外,还需要提供相应的功能码以表明操作类型(如读取还是写入),这有助于确保通信双方能够正确解析命令并作出适当反应。
```python
# Python 示例代码展示如何构建一个简单的Modbus RTU请求包
def build_modbus_request(slave_id, function_code, start_address, quantity=1):
# 构建基础报文结构
request = [
slave_id,
function_code,
(start_address >> 8) & 0xFF, # 高位字节
start_address & 0xFF, # 低位字节
(quantity >> 8) & 0xFF, # 数量高位字节
quantity & 0xFF # 数量低位字节
]
# 计算CRC校验值
crc = calculate_crc(request)
request.extend([crc & 0xFF, (crc >> 8) & 0xFF])
return bytes(request)
def calculate_crc(data):
"""计算给定数据序列的CRC-16/MODBUS"""
crc = 0xFFFF
for pos in data:
crc ^= pos
for _ in range(8):
if (crc & 1) != 0:
crc >>= 1
crc ^= 0xA001
else:
crc >>= 1
return crc
```
阅读全文
相关推荐


















