变量的字节序
在 PLC 中,寄存器的长度通常为 16 bit,常见的数据类型有 16bit、32bit长度的
对于 32 bit 长度的数据,比如浮点型(在西门子、Codesys 中称为 REAL 型),由于长度较长,在不同平台、使用不同协议进行数据传输时,双方传输的数据的字节排布的方式有可能不同,举例如下:
- 设按照 IEEE754 标准,从高字节到低字节的一个浮点数为:A B C D
- 则不同数据对以上数据的存储方式可能有 4 种:ABCD、CDAB、BADC、DCBA
因此,不同厂商、设备之间若使用浮点数进行数据交换,有可能要做数据转换,转换的本质是改变不同字节的排列顺序,因此又称为【字节序转换】
常见的字节序转换方法
现成的字节交换指令 + 类型转换指令
如汇川、西门子、三菱都提供了SWAP
指令,此指令可实现同一个寄存器高低字节的交换
(下图引自大佬的文章:https://blog.csdn.net/qq_42983533/article/details/125691077)
下图引自西门子指令文档
总体逻辑
REAL 变量输入 --1–> WORD 类型数组 --2–> 交换字节的 WORD 类型数组 --3–> REAL 类型输出
- 1:使用系统的数据类型转换函数,将 REAL 型变量转换为 WORD 类型数组
- 2:使用上面介绍的
SWAP
指令,交换每个 WORD 中的字节 - 3:使用系统的数据类型转换函数,将 WORD 型数组转回 REAL 型变量
部分厂商直接提供了相关的指令,比如:
-
西门子博途高版本提供的一系列大端/小端读写指令:
READ_LITTLE
/WRITE_LITTLE
/READ_BIG
/WRITE_BIG
介绍见:https://support.industry.siemens.com/cs/mdm/109759862?c=81971440011&lc=en-AF
-
Codesys 的 Memory 库中提供的 (倍福、欧姆龙、汇川、信捷、禾川等能导入对应Codesys库的也都可使用)
介绍见:https://content.helpme-codesys.com/en/libs/CAA%20Memory/Current/CAA_Memory/Reverse-Bit-Swap-ByteWord-order/fld-Reverse-Bit-Swap-ByteWord-order.html
Byte 数组/结构体 AT 映射 Float 直接操作
参考这位大佬的文章:http://www.ymmfa.com/read-gktid-1643979.html
关键是编程软件要 支持构造直接指向 REAL 型变量的 Byte [] 数组 或 UDT结构体
PCS7、博途、CodeSys 均支持以上写法
循环左移 + 类型转换
- 高低字转换:通过按字交叉赋值实现
- 高低字节转换:在 WORD 中使用【循环左移 ROL 】实现(循环左移 8 位 = 每个字交换高低字节)
比如以下的文档:https://www.schneider-electric.cn/zh/faqs/FA414474/
图片摘自上面的网页