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 RTU/TCP:PLC 怎么读位置值
Modbus RTU/TCP:PLC 怎么读位置值

数据模型:位置值怎么放

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 RTUModbus 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 的分布式时钟方案。

← 返回行业动态