『7x24小时有问必答』

▎西门子博途 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
引脚类型方向说明
valueWordIN原始 Word(高字节在前)
Ret_ValWordOUT交换后的 Word(高字节低字节互换)
#### LGF_SwapBlockDWord
引脚类型方向说明
valueDWordIN原始 DWord(ABCD 顺序)
Ret_ValDWordOUT反转后(DCBA 顺序)
#### LGF_SwapBlockLWord
引脚类型方向说明
valueLWordIN原始 LWord
Ret_ValLWordOUT字节反转后

三、实战案例

#### 案例 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 个块处理来自扫码枪和上位机的文本数据。
欢迎点赞、在看、转发

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

本帖子中包含更多资源

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

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

本版积分规则

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

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

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


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