Modbus RTU/TCP:PLC 怎么读位置值
说明:Germanjet 德敏哲现售接口以模拟量、Start-Stop、SSI 及 CANopen/Profibus/Profinet/EtherCAT 总线为主;Modbus 并非标准现售接口,下文仅作协议原理科普,不代表可直接采购对应型号。
用 Modbus 读位移传感器,本质就是一件事:用"读保持寄存器"功能,把两个连续的 16 位寄存器拼成一个 32 位位置计数值,再乘以分辨率步长得到实际位移。RTU 走 RS-485 串行链路、TCP 走以太网,应用层数据模型完全一致,差别只在传输层与地址方式。Modbus 的优势是几乎所有 PLC、HMI、网关、上位机都支持,实现成本极低;劣势是它是主从轮询协议,实时性与诊断能力都弱于专用现场总线。本文说明读取方法与三个高频坑,接口大类的整体判断见 模拟量 vs 数字量全系怎么选。
数据模型:位置值怎么放
Modbus 的寄存器都是 16 位,而位置值需要 32 位表示,因此必然占用两个连续寄存器。主机侧用"读保持寄存器(Read Holding Registers)"一次读取两个寄存器,然后按约定的字序拼成 32 位整数。
读回的仍然是计数值而非毫米:实际位移 = 计数值 × 分辨率步长,档位在 1 / 2 / 5 / 10 / 20 / 50 / 100 μm 中选取。倍率算错时读数看起来像"量程标错了",这是所有数字接口的通病,与协议无关。分辨率与精度指标的区别见 分辨率、重复精度、非线性度的区别。位置值为绝对位置,掉电重启无需回零,见 绝对位置 vs 增量位置。
三个高频坑
坑一:字序(word order)。32 位数据拆成两个寄存器时,"高 16 位在前"还是"低 16 位在前"没有统一约定,各厂商实现不同。字序理解反了,读数会呈现极大的、看似随机的跳变——但通信状态完全正常,很容易误判为干扰。验证方法很简单:把磁环停在行程中段,缓慢移动一小段距离,观察读数是否连续、单调变化。若跳变毫无规律,先调换两个寄存器的拼接顺序再看。
坑二:有符号与无符号。位置值以有符号 32 位整数表示,若主机按无符号解释,负值(零位以下或反向计数时)会显示为一个极大的数。HMI 上出现"接近 43 亿"的读数,基本可以确定是符号解释错误。
坑三:轮询周期。Modbus 是主动轮询,主机不问从机就不答。轮询周期不应短于传感器自身更新率——磁致伸缩需等待扭转波从磁环传回电子头,量程越长耗时越久(较短量程约 0.5 ms 量级,超长量程可达数毫秒);同时轮询周期也不应短于链路能承载的最小交互时间,RTU 在低波特率下尤其明显。周期压得过紧的表现是超时率上升与重复值增多。匹配方法见 响应时间/刷新率怎么和控制周期匹配。
RTU 与 TCP 对比
| 维度 | Modbus RTU | Modbus TCP |
|---|---|---|
| 物理层 | RS-485 双绞(半双工) | 标准以太网 |
| 设备寻址 | 从站地址(网段内唯一) | IP 地址 + 单元标识 |
| 多设备共线 | 可以,同一对双绞线挂多站 | 通过交换机组网 |
| 终端匹配 | 需要,网段两端各一只 120 Ω | 不需要 |
| 校验 | CRC 校验 | 依赖 TCP 层 |
| 典型周期能力 | 受波特率与站数限制,较慢 | 较快,但受网络负载影响 |
| 布线成本 | 低,长距离友好 | 需交换机,单段长度受以太网限制 |
| 适用 | 点数少、距离长、成本敏感 | 已有以太网、需与上位机/SCADA 对接 |
RTU 侧的物理层要求与 CAN、Profibus 同源:线形拓扑、两端各一只 120 Ω 终端电阻、中间不装,且从站地址网段内唯一。阻抗匹配的原理见 终端电阻与总线长度:为什么必须 120 Ω;接地屏蔽的系统做法见 总线干扰排查:接地、屏蔽、拓扑。
什么时候该用 Modbus,什么时候不该
适合用的场合:控制器不是任何专用现场总线的主站,但支持 Modbus;只有一到几轴,对周期要求不高;需要把位置数据送给 HMI、SCADA 或数据采集网关;改造项目中现场已有 RS-485 链路可复用。
不适合的场合:多轴同步控制(Modbus 无同步采样机制,各站读取时刻天然错开);要求毫秒级确定周期的高速闭环;需要设备主动上报故障的场合(Modbus 从站不能主动发起通信,诊断只能靠主机轮询状态寄存器)。这些场景应选专用总线,取舍见 总线型全系对比,其中多轴同步机制可参考 194 CANopen 系列 的 SYNC 机制与 197 EtherCAT 系列 的分布式时钟。
需要提醒:具体型号是否提供 Modbus RTU / TCP 接口,应在选型阶段向技术支持确认,不能默认所有数字型号都支持。主站体系与协议的匹配路径见 选型指南:我的 PLC 支持哪种总线,其他高频疑问见 FAQ 汇总:磁致伸缩位移传感器 20 个高频问题。
常见问题
Q:Modbus 怎么读 32 位位置值?
位置值占两个连续的 16 位保持寄存器,用读保持寄存器功能一次读取两个寄存器后按约定字序拼成 32 位整数。读回的是计数值,实际位移等于计数值乘以分辨率步长。
Q:Modbus 读数跳变很大怎么排查?
先验字序:把磁环停在行程中段缓慢移动一小段,读数应连续单调变化;若跳变毫无规律,调换两个寄存器的拼接顺序再看。字序错误时通信状态完全正常,极易被误判为干扰。
Q:读数出现接近 43 亿的巨大值是什么原因?
有符号与无符号解释错误。位置值以有符号 32 位整数表示,主机按无符号解释时,零位以下或反向计数产生的负值会显示为一个极大的数。
Q:Modbus RTU 需要终端电阻吗?
需要。RTU 走 RS-485 双绞线,物理层要求与 CAN、Profibus 同源:线形拓扑、网段两端各一只 120 Ω 终端电阻、中间节点不装,且从站地址在网段内唯一。
Q:Modbus 能做多轴同步控制吗?
不适合。Modbus 是主动轮询协议,没有同步采样机制,各站读取时刻天然错开,也不支持从站主动上报故障。多轴同步与毫秒级确定周期的场合应选 CANopen 的 SYNC 或 EtherCAT 的分布式时钟方案。





