‖ 系统学习-大小端
人生就像一场马拉松,偶尔停下来摸摸鱼,才能走得更远
---
在工业自动化现场,很多工程师都遇到过这样一种诡异情况:PLC通信正常,寄存器地址也没错,数据能读到,但数值却完全不对。 比如:
1. 温度应为 25.5℃,结果显示 6553℃;
2. 流量应为 123.45,结果变成天文数字;
3. 变频器频率设为 50Hz,PLC读取却显示 0.0000001。 很多人第一反应是:“地址错了?”“通信故障?”“数据类型不匹配?”检查半天后发现,真正的问题往往只有四个字:字节顺序
例如十进制数字 4660,转换成十六进制是:0x1234,它占用两个字节:12 34 问题来了:这两个字节在内存中谁先谁后?于是产生了两种规则: 排列为:12 34因为最高位在前,所以称为“大端”。 小端模式(Little Endian)低位字节放前面。 排列为:34 12 因为最低位在前,所以称为“小端”。
这主要是历史原因早期不同CPU厂商采用了不同设计理念:
后来Intel统治了PC市场,因此Windows电脑、x86/x64平台几乎全部采用小端。
但工业设备并不一定遵循Intel体系。PLC、DCS、仪表、变频器、网关等设备,可能来自完全不同的架构,于是兼容性问题就出现了。
PLC最常见的数据单位是 16位寄存器(Word)。一个寄存器 = 2个字节。
例如寄存器中存放:0x1234通常不会有问题。
但当数据变成 32位整数 或 浮点数(Float) 时,就需要两个寄存器。
例如一个32位值:00 BC 61 4E需要拆成:
寄存器1:00 BC
寄存器2:61 4E
这时如果设备之间对“先传哪个寄存器”理解不同,数据就会乱掉。
最经典的Float陷阱
PLC工程师最常遇到的情况:Modbus读取浮点数。
例如 25.5℃ 的IEEE754表示为:41 CC 00 00占4个字节。
正常顺序:41 CC 00 00
PLC解析后得到 25.5。
但如果字顺序被交换:00 00 41 CC
PLC可能解析成:2.36 × 10^-41
现场看到的就是:通信正常,但数据完全不可信。
对于4个字节 A B C D,不同厂家可能采用:
工业现场最常见的是 ABCD 和 CDAB 两种。
因为PLC的发展跨度太长,不同厂家继承了各自的历史架构
因此,一个链路:PLC A → 网关 → PLC B可能经历多次字节转换,最终结果面目全非
最实用的方法是:发送一个固定测试值。例如发送浮点数 1.0。其IEEE754固定为:3F 80 00 00读取寄存器后
说明顺序正常。
如果看到:
则说明发生了 Word Swap(字交换)。
通常几分钟内就能定位问题
当出现:
✓ 通信正常
✓ 地址正确
✓ 数据类型正确
✗ 数值异常
首先不要怀疑网络。
先怀疑:字节顺序。
经验上,超过一半的Modbus浮点数异常,最终都与Endian有关。
外遥大端与小端,看似只是几个字节排列顺序的差异,却是工业通信中最隐蔽、最常见的问题之一。 PLC不会告诉你顺序错了,Modbus也不会报警,通信软件甚至会显示“数据接收正常”。但一个简单的字节交换,就足以让温度变成天文数字,让压力值完全失真,让整个系统看起来像是发生了故障。 很多时候设备没有出错,程序也没有出错。真正出错的,只是那几个字节站错了位置。
---