Modbus地址400001和HR0说的是一个东西吗?一次讲清PLC、上位机里的地址换算

发布时间:2026/6/10 11:01:25
Modbus地址400001和HR0说的是一个东西吗?一次讲清PLC、上位机里的地址换算 Modbus地址400001和HR0说的是一个东西吗一次讲清PLC、上位机里的地址换算在工业自动化项目中Modbus协议因其简单可靠成为设备间通信的首选方案。但每当工程师在不同厂家的PLC编程软件和上位机组态软件间切换时总会遇到这样的困惑为什么同一个寄存器在协议文档里叫400001在组态软件里显示HR0而在设备手册上又标着0000H更令人头疼的是当这些地址格式混用时稍有不慎就会导致通信失败而错误提示往往又含糊不清。1. Modbus数据模型的本质解析Modbus协议本质上定义了一套虚拟的数据组织结构与物理存储无关。这套模型将设备数据抽象为四种基本类型线圈状态Coils可读写的布尔量对应PLC中的DO点离散输入Discrete Inputs只读的布尔量对应PLC中的DI点输入寄存器Input Registers只读的16位数值如传感器采集值保持寄存器Holding Registers可读写的16位数值最常用的数据区这四种数据区在协议中的最大寻址范围都是65536个元素但实际设备通常只实现其中的一部分。例如某温度控制器可能只开放了50个保持寄存器用于参数配置。关键区别线圈和离散输入按位(bit)访问而输入寄存器和保持寄存器按字(word)访问。2. 地址表示法的三大门派2.1 协议标准表示法6位数字编码Modbus原始规范采用6位数字编码通过首位数字区分数据类型数据类型地址范围功能码线圈000001-06553601/05/15离散输入100001-16553602输入寄存器300001-36553604保持寄存器400001-46553603/06/16这种表示法的特点是地址编号从1开始计数400001表示第一个保持寄存器在协议帧中实际传输时会转换为从0开始的偏移量2.2 工程软件表示法区域代码偏移为简化配置主流工业软件采用更直观的表示方式# 西门子TIA Portal中的典型表示 保持寄存器1 HR0 # 对应400001 输入寄存器10 IR9 # 对应300010 # 罗克韦尔Studio 5000中的表示 保持寄存器1 4x0001 # 4代表保持寄存器x表示16位访问这种表示法的特点是区域代码明确标识数据类型HR/IR/DI/DO偏移地址从0开始计数不同软件可能使用不同前缀符号2.3 设备手册表示法16进制许多设备厂商偏好使用16进制地址保持寄存器1 0x0000 保持寄存器2 0x0001 ... 保持寄存器100 0x0063这种表示法需注意地址从0开始计数通常省略0x前缀直接写0000H与协议帧中的偏移量完全一致3. 地址换算实战手册3.1 标准地址 ↔ 软件地址以保持寄存器为例标准地址软件地址计算公式400001HR0400001 - 400001 0400010HR9400010 - 400001 9400100HR99400100 - 400001 993.2 标准地址 ↔ 16进制地址400001 → 0x0000 400010 → 0x0009 400100 → 0x0063换算公式16进制地址 (标准地址 - 基地址)的16进制表示 基地址线圈0, 离散输入100000, 输入寄存器300000, 保持寄存器4000003.3 跨平台配置示例假设某变频器的频率设定地址在手册中标为标准地址40001016进制地址0009H在不同软件中的配置方法WinCC组态添加Modbus TCP设备变量地址填写4x94表示保持寄存器x表示16位访问9是十进制偏移组态王配置变量地址 HR9 // 保持寄存器偏移9Python modbus-tk库# 读取400010寄存器 master.execute(1, cst.READ_HOLDING_REGISTERS, 9, 1)4. 调试排错指南当通信失败时建议按以下步骤检查地址配置确认数据类型确保主站和从站对数据类型的理解一致读取线圈(01)和读取保持寄存器(03)会访问不同的存储区验证偏移基准检查是否混淆了从0还是从1开始计数典型错误将400010配置为HR10实际应为HR9检查字节顺序多字节数据需确认是大端序还是小端序例如32位浮点数在西门子和AB PLC中的存储顺序相反使用工具验证# 使用modbus-cli工具测试 modbus read --unit1 --count1 192.168.1.100 400010协议分析用Wireshark捕获通信报文确认功能码和地址偏移是否正确例如读取400010对应的实际请求应为事务ID | 00 00 | 长度 | 单元ID | 03 00 09 00 01在最近的一个污水处理项目中我们发现西门子S7-1200作为Modbus TCP从站时其TIA Portal中配置的MB_HR0实际对应的是标准地址400001而第三方SCADA软件误将其配置为4x0000导致通信失败。通过抓包分析最终确认问题出在地址偏移量的基准不一致——SCADA软件的4x前缀默认从0开始计数而西门子PLC内部映射时自动做了1处理。