1. 确认浮点数的存储格式
-
IEEE 754单精度浮点数(32位)结构:
-
符号位(1位):0表示正,1表示负。
-
指数位(8位):实际指数 = 存储值 - 127(偏移量)。
-
尾数位(23位):隐含前导1,实际值为
1.尾数
。
-
-
PLC中浮点数通常占用两个连续的16位寄存器(共32位)。
2. 关键步骤
(1) 合并寄存器数据
将两个16位寄存器合并为32位数据,需注意字节顺序(大端/小端):
-
大端(Big-Endian):高位寄存器在前(如西门子PLC)。
-
小端(Little-Endian):低位寄存器在前(如三菱FX系列)。
示例:
-
寄存器1:
4048
(高16位) -
寄存器2:
F5C3
(低16位) -
合并后的32位十六进制值:
4048F5C3
(大端)或F5C34048
(小端)。
(2) 使用PLC指令转换
不同品牌的PLC提供专用指令直接转换:
PLC品牌 | 指令示例 | 说明 |
---|---|---|
西门子(S7-300/400/1200/1500) | MOVE 或 UNPACK | 将16进制数据块复制到浮点数变量。 |
三菱(FX/Q系列) | DVAL 或 DEMOV | 将两个连续的D寄存器转换为浮点数。 |
欧姆龙(CP/CJ系列) | FIXD 或 FLT | 将十六进制转换为浮点数。 |
罗克韦尔(AB PLC) | COP (复制指令) | 将十六进制数组复制到浮点数标签。 |
(3) 手动计算(无专用指令时)
若需手动转换,步骤如下(以十六进制 4048F5C3
为例):
-
转换为二进制:
复制
0100 0000 0100 1000 1111 0101 1100 0011
-
分段解析:
-
符号位
0
→ 正数。 -
指数位
10000000
→ 十进制128 → 实际指数 = 128 - 127 = 1。 -
尾数位
10010001111010111000011
→1.10010001111010111000011
(隐含前导1)。
-
-
计算浮点数值:
复制
值 = (-1)^符号位 × 1.尾数 × 2^指数 = 1 × 1.5683594 × 2^1 ≈ 3.1367188
(实际值为
3.14
,误差因截断导致)。
3. 注意事项
-
字节顺序:必须确认PLC的存储顺序(大端或小端),否则结果错误。
-
数据类型对齐:确保32位数据在寄存器中连续且对齐。
-
特殊值处理:检查是否为
NaN
、无穷大或非规格化数。
4. 示例(西门子PLC)
假设寄存器 MD10
存储十六进制值 4048F5C3
(对应浮点数 3.14
):
STL
复制
L MD10 // 加载32位数据到累加器 T DBD20 // 将数据传送到浮点数变量(如DB1.DBD20)
通过以上步骤,您可以在PLC中实现十六进制到浮点数的转换。具体指令请参考对应PLC的编程手册。