数据模型与寻址
Modbus 把设备数据抽象成四张“表”
协议层用 0-based 地址;厂商手册常写 1-based 点号(如 40001)——这是联调第一坑
依据:Application Protocol V1.1b3 数据模型章节。
1. 四类数据
| 表 | 访问 | 宽度 | 典型用途 |
|---|---|---|---|
| Coils(线圈) | 读写 | 1 bit | 数字输出、继电器 |
| Discrete Inputs(离散输入) | 只读 | 1 bit | 数字输入、开关量 |
| Holding Registers(保持寄存器) | 读写 | 16 bit | 设定值、参数、过程量 |
| Input Registers(输入寄存器) | 只读 | 16 bit | 测量值、状态字 |
Client 不能“发明”第五张表;厂商扩展通常映射进保持/输入寄存器。
2. 协议地址 vs 手册点号
规范 PDU 里的地址是 从 0 开始 的偏移。
许多手册沿用历史记号:
| 手册常见写法 | 含义 | PDU 起始地址 |
|---|---|---|
| 00001–0xxxx | 线圈 | 地址 = 点号 - 1 |
| 10001–1xxxx | 离散输入 | 地址 = 点号 - 10001 |
| 30001–3xxxx | 输入寄存器 | 地址 = 点号 - 30001 |
| 40001–4xxxx | 保持寄存器 | 地址 = 点号 - 40001 |
例:手册写 Holding 40001 → PDU 地址 0,功能码 03。
有的厂商直接写“寄存器 0”“寄存器 1000”,以手册为准,不要死套 4xxxx。
3. 数量与对齐
- 位:按 bit 打包进字节(MSB/打包顺序以实现/规范为准,读手册)
- 寄存器:每个 16-bit;一次读写有 最大数量限制(受 PDU≤253 约束,常见 ≤125 寄存器)
- 32-bit float / int:通常占 2 个寄存器,存在字节序/字序问题(见 05)
4. 点表(Register Map)工程习惯
一份可用的点表应包含:
| 字段 | 例 |
|---|---|
| 名称 | motor_speed_rpm |
| 表类型 | Holding |
| 协议地址 | 100 |
| 数据类型 | uint16 / float32 |
| 缩放 | raw * 0.1 |
| 读写 | R/W |
| 功能码 | 03 / 16 |
| 备注 | 大端、字倒序 |
没有点表就开写代码 = 赌运气。
5. 广播地址(串行)
- 串行从站地址:1–247(常用)
- 0 = 广播(写类功能;通常无响应)
- TCP 直连设备时 Unit ID 常用
0xFF或0(见 TCP 篇)
下一篇:02-功能码与PDU.md
正在加载留言…