数据模型与寻址

数据模型与寻址

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 常用 0xFF0(见 TCP 篇)

下一篇:02-功能码与PDU.md

文章互动

阅读 --

留言

0 条留言

正在加载留言…