本节摘要:Modbus 把设备数据分成线圈、离散输入、输入寄存器、保持寄存器四类,读写属性与地址空间各不相同。本节用点表视角讲清四类对象的分工,并回答"为什么温度要放保持寄存器而不是输入寄存器"。位置:第 1 章建立了问答模型,本章走进数据本体——知道读什么,比知道怎么读更重要。
翻开任何一台 Modbus 设备的说明书,一定会有一张"寄存器表"(点表)。点表把设备数据按四类归档,主站读写的每一笔账都在这里:
| 类别 | 英文 | 位/字 | 读 | 写 | 典型内容 |
|---|---|---|---|---|---|
| 线圈 | Coil | 位 | ✓ | ✓ | 启动/停止、使能位、报警复位 |
| 离散输入 | Discrete Input | 位 | ✓ | ✗ | 限位开关、按钮状态、故障触点 |
| 输入寄存器 | Input Register | 字(16bit) | ✓ | ✗ | 传感器实时值:温度、压力、电流 |
| 保持寄存器 | Holding Register | 字(16bit) | ✓ | ✓ | 设定值、累计量、参数、可写状态 |
读写的分界是第一认知:能被外部改的是"线圈"和"保持寄存器";只能看不能动的是"离散输入"和"输入寄存器"。把"启动按钮"做成离散输入会永远读不到"已按下"——因为它根本没有写路径。
按直觉,传感器测的温度应该是"输入寄存器"(设备采集、主站只读)。但实际点表里温度、压力这类模拟量大量出现在保持寄存器——原因有两个:一是历史原因,早期许多仪表只有保持寄存器空间,厂商懒得用两套;二是保持寄存器可写意味着主站可以写"零点"、"满量程"、"滤波系数"等校准参数,同一段地址既读实时值又写配置,点表更紧凑。
工程结论:别按类别名猜数据,按点表注释定用途。厂商在点表里写"保持寄存器 40001:温度(实时),可写零点偏移",你按"只读实时值"处理即可。
点表里常见两种地址写法:数据模型地址(0-65535 的偏移量)与 PLC 习惯地址(前缀 + 偏移)。PLC 习惯写法把 4 类对象用首数字区分:0x 开头是线圈、1x 是离散输入、3x 是输入寄存器、4x 是保持寄存器,例如"40001"表示保持寄存器第 1 个(偏移 0)。同一份点表两种写法并存,是现场接线与调试时最经典的混淆源,第 2.2 节专门展开。
把视角切到从站内部,四类对象对应着设备内存里的不同区域:线圈通常映射到输出寄存器/DO 通道(主站可置位),离散输入映射到 DI 通道(只读,反映外部触点),输入寄存器映射到 ADC 采样缓存(只读,传感器实时值),保持寄存器映射到可读写的参数区或 DAC/设定缓存。有些设备把同一物理量的"实时值"与"设定值"分别放在输入寄存器与保持寄存器——读错区域会读到"想设定但没生效的值"。
设备内存视角: DO 通道 ←→ 线圈(01/05/15 操作) DI 通道 ←→ 离散输入(02 操作) ADC 采样 ←→ 输入寄存器(04 操作) 参数区 ←→ 保持寄存器(03/06/16 操作)
四类对象的另一层坑在"点表地址 ↔ 物理通道号"的映射:很多设备的通道号从 1 开始,而寄存器偏移从 0 开始,中间还有可能跳号(比如通道 1 用偏移 0、通道 2 用偏移 2,中间留了一个保留位)。映射规则只存在于厂商固件里,点表是唯一权威——读点表时把"物理通道号、PLC 地址、偏移、功能码"四列对照着抄,少抄一列现场就要多猜一轮。
线圈与离散输入是"位"(一个布尔),寄存器是"字"(16 位)。位操作的报文把 8 个位打包进 1 个字节传输,读 20 个线圈的响应是 3 个字节里解出 20 位——位序是 LSB 优先(第 0 位在字节最低位)。很多人把位当字节处理,解出来的开关状态整体错位。同理,字操作里 16 位是"一个整体",不要把它拆成两个字节分别解释。
要点回顾:四类对象 = 可写位(线圈)+ 只读位(离散输入)+ 只读字(输入寄存器)+ 读写字(保持寄存器);数据归类看点表注释别靠猜。下一节处理最实际的坑:寻址偏移与各家地址方言。
项目里有人把设备的"本地/远程"切换开关读成了离散输入(02),结果永远读到"本地"——因为该开关是设备可远程改写的(主站能切到远程),实际映射在线圈区。数据读得到但永远不对,正是"四类对象语义搞反"的典型症状:读错区域不会报错,只是数据永远是错的。
复盘结论:看到点表先确认每个量的"读写属性"(列头通常写着 R 或 R/W),再决定用哪个功能码。可写的量读成只读区 → 读到默认值;只读的量写进可写区 → 被拒绝或改坏参数。调试时把"名称、功能码、偏移"三列对着点表核一遍,90% 的"读不对"能在十分钟内解决。
小结:四类对象按读写属性划分,位与字两套操作体系;归类看点表注释而非名字猜测;调试前把名称、功能码、偏移三列对着点表核一遍。
延伸练习:找一台手边的 Modbus 设备,打开它的点表,把每个业务量标注为(类别 / 功能码 / 偏移 / 缩放),再写一小段读取代码验证——标注与实测一致,四类对象这一课才算过关。完成练习后对照本节要点自查:能否不翻资料说出四类对象的读写属性与对应功能码?能,则进入下一节。