▎西门子博途 LGF 库详解 · 13:字节序反转——SwapBlock 三个块彻底解决大小端问题
做过 Modbus TCP 通信的人几乎都踩过这个坑:从设备读到一个 32 位浮点数,数值一看就不对——不是设备坏了,是字节序反了。对方的 Big-Endian 32 位到了 S7-1200 的 Little-Endian 环境,高低字节完全颠倒。
本篇讲 3 个 SwapBlock 块:一个功能、三种位宽——解决问题的方法简单到只需要加一行。文末附 LGF 大小端检测块的配合用法。
一、3 个块一览
字节序反转组(4.9 Converter/Binary Byte Swapping)
| 块名 | 类型 | 版本 | 功能 | 典型场景 |
|------|------|------|------|---------|
| LGF_SwapBlockWord | FC | V1.0.0 | 交换 Word 的高低字节 | Modbus 16 位寄存器 |
| LGF_SwapBlockDWord | FC | V1.0.0 | 反转 DWord 的 4 字节(ABCD→DCBA) | Modbus 32 位浮点数 |
| LGF_SwapBlockLWord | FC | V1.0.0 | 反转 LWord 的 8 字节 | 64 位计数器值 |
三个块接口完全一致:都是 1 个输入 → 1 个输出,纯函数无状态。
二、引脚详解
#### LGF_SwapBlockWord
| 引脚 | 类型 | 方向 | 说明 |
| value | Word | IN | 原始 Word(高字节在前) |
| Ret_Val | Word | OUT | 交换后的 Word(高字节低字节互换) |
#### LGF_SwapBlockDWord
| 引脚 | 类型 | 方向 | 说明 |
| value | DWord | IN | 原始 DWord(ABCD 顺序) |
| Ret_Val | DWord | OUT | 反转后(DCBA 顺序) |
#### LGF_SwapBlockLWord
| 引脚 | 类型 | 方向 | 说明 |
| value | LWord | IN | 原始 LWord |
| Ret_Val | LWord | OUT | 字节反转后 |
三、实战案例
#### 案例 1:Modbus 浮点数修正
从 Modbus 设备读到 2 个 16 位寄存器拼成的 32 位浮点数(大端序),直接赋值偏离好几个数量级:
SwapBlockDWord 修正
rawFloat := 将两个 Modbus 寄存器拼接为 DWord;
correctFloat := LGF_SwapBlockDWord(rawFloat);
// 现在 correctFloat 才是正确的浮点数
什么时候要 Swap,什么时候不要
并不总是需要 swap。这与通信伙伴的字节序有关。原则:
1. 先用 LGF_IsBigEndian / LGF_IsLittleEndian(第 24 篇)检测自己 CPU 的字节序
2. 查阅通信伙伴的手册确认对方的字节序
3. 如果双方不同,才调用 SwapBlock
盲目 swap 会把数据又反转一次——本来正确的反而错了。
#### 案例 2:CRC16 结果的小端序写入
Modbus 的 CRC16 校验值必须以小端序(低字节在前)追加到报文末尾。而 S7-1200 的硬件是小端序,CalcCRC16Advanced 返回的 Word 在内存中已经就是低字节在前——但你把它 COPY 到发给设备的报文缓冲区时,目标设备的接收缓冲区可能是按大端序组织的。不确定的时候,用 SwapBlockWord 保证顺序:
CRC16 字节序保证
swappedCRC := LGF_SwapBlockWord(crcValue);
四、配合大小端检测使用
LGF 的第 24 篇将讲到系统操作块中的 IsBigEndian 和 IsLittleEndian。结合使用模式:
安全 Swap 模式
needSwap := (myCpuIsLittleEndian AND partnerIsBigEndian) OR
(myCpuIsBigEndian AND partnerIsLittleEndian);
IF needSwap THEN value := LGF_SwapBlockDWord(value); END_IF;
五、总结与下载
下载信息
| 项目 | 内容 |
|------|------|
| 库名称 | Library of General Functions (LGF) |
| SIOS-ID | 109479728 |
| 下载地址 | 中文站:www.ad.siemens.com.cn/download/documentdetail_12471.html |
| 当前版本 | V5.1.1(中文站最新;SIOS 全球站另有面向高版本博途的 V5.2.1) |
| 兼容 | TIA Portal V17+、S7-1200 (固件 ≥V4.2)、S7-1500 (固件 ≥V2.0) |
| 费用 | 完全免费 |
> 本文所有引脚数据基于 LGF V5.1.1 官方文档。全球站地址:support.industry.siemens.com/cs/document/109479728
下篇预告:LGF 库详解 · 14——字符串操作。ToLower/ToUpper、CharArray 提取与查找,5 个块处理来自扫码枪和上位机的文本数据。
欢迎点赞、在看、转发。