两套地址体系的由来
Modbus 的地址存在两个体系,混淆由此产生:一是协议内部的地址(报文中的地址字段,从 0 开始),二是工程惯例中的引用号,例如 40001 表示保持寄存器的第 1 个。经典对应关系是引用号 40001 对应协议地址 0,即引用号比协议地址多一个偏移。不同设备手册采用的表示并不统一,有的直接给协议地址,有的给引用号,还有的用 4xxxx 简写,这是现场配置最容易出错的地方之一。
四个数据区的区间惯例
| 线圈 | 0xxxx,常见 00001 至 09999,扩展实现可用更长的编号 |
|---|---|
| 离散输入 | 1xxxx,常见 10001 至 19999 |
| 输入寄存器 | 3xxxx,常见 30001 至 39999 |
| 保持寄存器 | 4xxxx,常见 40001 至 49999 |
| 协议地址 | 报文中的地址字段,从 0 开始,与引用号通常相差 1 |
| 说明 | 区间长度与编号位数随实现不同,一律以设备手册为准 |
同一位置的多种写法
| 写法 | 示例 | 与协议地址的关系 |
|---|---|---|
| 引用号 | 40001 表示保持寄存器第 1 个 | 对应协议地址 0,相差一个偏移 |
| 协议地址 | 地址 0 表示保持寄存器第 1 个 | 与报文地址字段一致 |
| 1 起编号 | 地址 1 表示保持寄存器第 1 个 | 部分手册与软件采用此约定 |
| 区间表示 | 30001、40001 等 | 区号只用于分类,不进入报文 |
| 多寄存器数据 | 40001 与 40002 组成 32 位值 | 还涉及字序与字节序问题 |
配置时的核对方法
- 先确认手册使用的是引用号还是协议地址,并找到关于地址起点的说明
- 用只读方式试读一个已知值,例如设备型号或固定状态字,比较数值判断是否偏移
- 写操作先用仿真或测试设备验证地址,再在生产设备上执行
- 把地址映射表与点表一起纳入版本管理,避免多人各自解释
- 同型号不同固件版本的映射可能不同,升级后需重新核对
32 位数据,例如浮点数,占用两个连续寄存器,字序存在高字在前与低字在前两种约定,寄存器内字节顺序也可能不同。地址正确而字序不符时数值会明显失真,这类问题不能靠调地址解决,需要按手册配置数据类型。
地址偏移一位的错误在读操作上常只表现为数值异常,在写操作上却可能改到相邻参数。未经核对的写地址直接下发属于高风险操作。