FIBERIOT / 基础知识
仪表显示25,电脑却显示一个离谱的小数,通信日志还提示成功。这种情况不一定是网线或光纤出了问题:数据可能完整到达,只是软件把它读成了另一种意思。理解Modbus字序,不需要先学一堆公式。只要沿着“寄存器里放什么、报文怎样带走、软件怎样拼回”这条路径,就能分清传输正确与读数正确。

01先把寄存器看成有编号的小格子
Modbus是工业设备交换数据的一套规则。读取保持寄存器或输入寄存器时,可以把设备的数据区想象成一排有编号的格子。一个这样的寄存器容纳16位,也就是两个字节;一个字节容纳8位。这里的格子是逻辑上的数据单位,不表示仪表内部一定装着一排独立小芯片。
格子的编号告诉软件去哪里取东西,却不直接说明里面是什么。同样两个字节,可能是一个无符号整数,也可能是开关状态的集合。温度、压力、电量的含义,要靠设备的寄存器表,也常被叫作点表来解释。点表相当于随货清单:地址、类型、单位、比例和有效条件都应一起看,不能只抄地址。
还要注意地址的写法。有的手册用40001这样的保持寄存器参考编号,报文里使用的却是起始偏移;有的软件界面会替用户完成换算。先核对同一份资料的示例请求,确认界面期望编号还是偏移,才能避免整组数据错开一个格子。把地址误差当成字序问题反复交换,往往只会让排查更乱。
02一个格子内部,先发哪一个字节
用十六进制写一个示例寄存器值0x1234,可以分成12和34两个字节。十六进制只是为了紧凑地记录原始数据,不是现场必须进行的高等计算。按Modbus寄存器的标准编码,高字节12在前,低字节34在后。接收软件据此把两个字节还原成同一个16位内容。
这里说的是字节在报文中的排列,不能与串口线上一个字节内部的比特发送次序混为一谈。还要区分电脑内存排布与线上编码:电脑处理器怎样存放变量,并不允许应用程序随意改变协议规定的报文字节顺序。抓包看到的是报文;软件调试窗口显示的可能已经是转换后的内存值,两者要先确认观察位置再比较。
03两个格子共同表示一个数,出现了字序
一个32位数据放不进单个16位寄存器,通常要占用相邻两个。这时除了每个寄存器内部的字节次序,还多了一个问题:前面的寄存器放整个数的高16位,还是低16位?这就是本文所说的字序。不同设备或配置可能采用不同安排,不能仅凭“都支持Modbus”就推定相同。
例如按IEEE 754单精度浮点格式,25.0可以写成四字节41 C8 00 00。某个示例点表把41C8放在寄存器N、0000放在N+1;另一个示例反过来放。两种设备各自按点表读取并正确重组,都能得到25.0。若软件拿第一种解释去读第二种,通信可以成功,数值却完全不对。这是演示数据,不是某款仪表的实际地址或配置。

04交换两个字,与交换字内字节不同
可以把两本书各自的上下页看成四个数据字节。交换两本书的位置,类似交换两个16位字;把每本书的上下页互换,类似改变字内字节。两种动作影响的范围不同。软件菜单里的“大端”“小端”“交换”有时指向不同层次,不能只看中文名称就确定它做了哪一种变换。
联调时,把原始四字节按收到的顺序记录下来,再在旁边写出软件实际采用的重组顺序。一次只改一个明确的解释选项,并与正式点表核对。不要对所有测点盲目套同一种交换,也不要用一个碰巧合理的数证明整张点表正确。尤其接近零的值容易让错误顺序看起来没那么夸张,应再核对几个已知且不同的数值。
Modbus RTU帧末尾的CRC是一种检错码,用来帮助接收端检查传输内容是否发生变化。若设备本来就返回低字在前的数据,CRC完全可以正确;软件之后按高字在前解释,CRC不会替它报警。类似地,读到了另一个合法地址的数据,也可能通过校验。因此应分别保存“收到什么”和“怎样解释”两份证据。
05同一组字节,也可能需要不同的读法
即便排列正确,还要确定数据类型。32位整数与32位浮点数不是同一种解释;浮点格式能表示小数,不代表读到任何四字节都应该按浮点解码。一个带符号整数还允许负值,而无符号整数采用另一套范围解释。这些约定应来自设备资料,不能让上位机根据画面是否顺眼来猜。
比例与单位也属于解释链。例如某点表明确说明原始整数253代表25.3摄氏度,软件就应按这条约定显示,而不能把253直接当摄氏度。这里是另一个独立示例,不能与前面的浮点25.0混用。还要查无效值、离线标志和保留位:有些特殊编码表示不可用,把它当正常测量值画上曲线,会制造看似真实的异常工况。

06顺序正确,还要确认是否来自同一时刻
两次分别读取两个寄存器,设备可能恰好在中间更新数据。以一个32位无符号计数器为例,旧值是0000 FFFF,新值是0001 0000。若先拿到旧值的高字0000,随后拿到新值的低字0000,软件会拼出0000 0000;它既不是完整旧值,也不是完整新值,问题在取样一致性。
一次连续读取两个寄存器,通常能减少分开请求造成的时间窗口,但不能凭这一点保证任何设备都提供原子快照。是否锁存、怎样刷新、能否用序号或时间标记判断同一批数据,要查该设备的实现说明。若经过网关缓存,还应记录缓存更新时间。数据报文刚刚返回,不等于测量值也刚刚产生,更不能用更快轮询替代一致性设计。
07沿传输路径分工,读数才有依据
飞畅官网列有FCP-D8G工业轨式Modbus光端机,用于点对点的Modbus串行通信光纤传输。它提示了一个重要分工:光传输链路负责传送通信数据,仪表点表决定数据含义。不能从“使用了Modbus光端机”推导它会替所有仪表自动识别浮点字序、换算单位或生成同步测量快照;具体能力以对应版本资料为准。
实际核对可以从一台设备、一个获准的只读测点开始:先保存同一事务的请求与响应,确认目标、功能码、起始地址写法和读取数量,再核对原始寄存器、字序、数据类型、比例、单位和更新时间。校验通过只是其中一个环节,不替软件证明业务解释正确。把这一条读数链解释清楚,再扩大到其他测点,日后换仪表或换软件时也能按记录逐项复核。
若同一测点在本机工具正常、经光链路后异常,应对比同一设备同一配置下两端的原始返回内容,再检查通道选择、串口参数与日志。原始字节一致而显示不同,重点查看解码设置;字节本身不同或事务不对应,则沿通信路径继续定位。这个判断顺序能减少盲目更换硬件,也避免把真实传输故障草率归为字序。
参考资料
Modbus Organization:寄存器与数据格式说明;应用协议V1.1b3第4.2节:字节编码;Schneider Electric:寄存器映射与字序实例;Schneider Electric:交换字序浮点数的读取;飞畅FCP-D8G Modbus光端机资料。第三方设备设置不等于飞畅型号能力;示例由飞畅独立组织,不是现场实测或接线指导。
现场常见问题
Modbus通信成功,为什么数值仍然错误?
传输与解释是两个环节。还要核对目标、地址写法、寄存器数量、字序、数据类型、比例、单位和更新时间;CRC正确不证明业务解释正确。
交换两个寄存器与交换字节是一样的吗?
不同。前者调整两个完整16位字的位置,后者可能改变一个字内部的两个字节。按设备点表和软件实际重组结果核对,不能只看菜单名称。
一次读两个寄存器就一定是同一时刻的数据吗?
不一定。连续读取可缩小分开请求带来的窗口,但原子快照、锁存和刷新机制必须按设备实现核实;网关缓存还要核对更新时间。
适用边界与延伸阅读
通用寄存器数据解释与一致性示意;不是具体型号点表、接线指导或现场实测。使用设备正式资料核对。


