『7x24小时有问必答』
  系统学习-大小端

人生就像一场马拉松,偶尔停下来摸摸鱼,才能走得更远

---

在工业自动化现场,很多工程师都遇到过这样一种诡异情况:PLC通信正常,寄存器地址也没错,数据能读到,但数值却完全不对。

比如:
1. 温度应为 25.5℃,结果显示 6553℃;
2. 流量应为 123.45,结果变成天文数字;
3. 变频器频率设为 50Hz,PLC读取却显示 0.0000001。

很多人第一反应是:“地址错了?”“通信故障?”“数据类型不匹配?”检查半天后发现,真正的问题往往只有四个字:字节顺序

什么是字节顺序(Endian)?
计算机中的数据最终都会以二进制形式存储

例如十进制数字 4660,转换成十六进制是:0x1234,它占用两个字节:12 34

问题来了:这两个字节在内存中谁先谁后?于是产生了两种规则:

大端模式(Big Endian)高位字节放前面。

地址0:12  地址1:34

排列为:12 34因为最高位在前,所以称为“大端”。

小端模式(Little Endian)低位字节放前面。

地址0:34  地址1:12  

排列为:34 12  因为最低位在前,所以称为“小端”。

为什么会有两种标准?
这主要是历史原因早期不同CPU厂商采用了不同设计理念:

后来Intel统治了PC市场,因此Windows电脑、x86/x64平台几乎全部采用小端。
但工业设备并不一定遵循Intel体系。PLC、DCS、仪表、变频器、网关等设备,可能来自完全不同的架构,于是兼容性问题就出现了。
为什么PLC特别容易中招?
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
现场看到的就是:通信正常,但数据完全不可信。

Modbus中的四种排列方式

对于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也不会报警,通信软件甚至会显示“数据接收正常”。但一个简单的字节交换,就足以让温度变成天文数字,让压力值完全失真,让整个系统看起来像是发生了故障。

很多时候设备没有出错,程序也没有出错。真正出错的,只是那几个字节站错了位置
  

---

授人以鱼不如授人以渔

喜欢就给个点赞+在看

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码