▎西门子博途 LGF 库详解 · 04:比较操作——浮点数相等、掩码匹配、Variant 比较
做过 PLC 编程的都知道一个痛:两个 LReal 明明都是 3.14,一比较居然不相等。IEEE 754 浮点数的精度问题,让 "等于" 变成了玄学。
LGF 的比较操作组就是来解决这个问题的。5 个块覆盖了掩码比较、浮点精度比较、字符串比较和 Variant 类型比较——全是原生博途指令的短板。文末有 CompareLRealByPrecision 的一个参数设置技巧,别漏了。
一、5 个块一览
比较操作组(4.4 Comparator operations)
| 块名 | 类型 | 版本 | 一句话功能 |
|------|------|------|-----------|
| LGF_BinaryMaskCompare | FC | V1.0.0 | 用掩码过滤后再比较两个 DWord |
| LGF_CompareLReal | FC | V3.0.2 | 以 1.0E-12 精度比较两个 LReal 是否近似相等 |
| LGF_CompareLRealByPrecision | FC | V3.0.2 | 自定义精度阈值比较两个 LReal |
| LGF_CompareString | FC | V1.0.0 | 比较两个字符串是否相同 |
| LGF_CompareVariant | FC | V3.0.1 | 比较两个 Variant 类型变量是否相等 |
二、引脚详解
#### LGF_BinaryMaskCompare
| 引脚 | 类型 | 方向 | 说明 |
| source | DWord | IN | 待比较的原值 |
| compare | DWord | IN | 对比值 |
| mask | DWord | IN | 掩码:bit=1 的位参与比较,bit=0 的位忽略 |
| Ret_Val | Bool | OUT | TRUE=掩码后的位完全匹配 |
#### LGF_CompareLReal / LGF_CompareLRealByPrecision
| 引脚 | 类型 | 方向 | 说明 |
| valueA | LReal | IN | 第一个实数值 |
| valueB | LReal | IN | 第二个实数值 |
| precision | LReal | IN | 精度阈值(仅 CompareLRealByPrecision 有此引脚) |
| Ret_Val | Bool | OUT | TRUE=在精度范围内相等 |
pRecision 参数设置技巧
CompareLReal 内置精度 1.0E-12,适合大多数场景。但如果你比较的是经过多次运算的值——累积误差可能超过 1.0E-12,建议用 CompareLRealByPrecision 并设置 precision := 1.0E-6(百万分之一)。如果用于模拟量比较(0-27648),precision := 0.5 通常就够用了。
#### LGF_CompareString
| 引脚 | 类型 | 方向 | 说明 |
| string1 | String | IN | 第一个字符串 |
| string2 | String | IN | 第二个字符串 |
| Ret_Val | Bool | OUT | TRUE=完全相同 |
#### LGF_CompareVariant
| 引脚 | 类型 | 方向 | 说明 |
| var1 | Variant | IN | 第一个变量(任意类型) |
| var2 | Variant | IN | 第二个变量(任意类型) |
| Ret_Val | Bool | OUT | TRUE=类型和值完全相同 |
三、实战案例
#### 案例 1:浮点数相等判断
LReal 精度比较
不直接写 IF valueA = valueB THEN(不可靠),改为:
isEqual := LGF_CompareLRealByPrecision(valueA := a, valueB := b, precision := 1.0E-6);
IF isEqual THEN ...
#### 案例 2:仅比较状态的特定 bit
你有一个 32 位状态字,只关心 bit 0-3(设备状态码),其余位是时间戳等动态信息。用 BinaryMaskCompare:
掩码比较
仅比较 bit 0-3 是否是 0101(5=运行中):
match := LGF_BinaryMaskCompare(source := statusWord,
compare := 16#00000005,
mask := 16#0000000F);
mask 的 bit 0-3 = 1(参与比较),其余 = 0(忽略)。
四、总结与下载
下载信息
| 项目 | 内容 |
|------|------|
| SIOS-ID | 109479728 |
| 下载地址 | 中文站:www.ad.siemens.com.cn/download/documentdetail_12471.html |
| 当前版本 | V5.1.1(数据以此版为准) |
| 全球站 | support.industry.siemens.com/cs/document/109479728(另有 V5.2.1) |
| 费用 | 完全免费 |
下篇预告:05——数学函数(上)。距离计算、阶乘、N 次方根、范围判断、容差检测——9 个块覆盖 PLC 里最常用的数学需求。
欢迎点赞、在看、转发。