比较操作
决策逻辑与范围
数值比较是工业决策逻辑的引擎。掌握 TIA Portal 中的标准比较器、范围测试和有效性检查。
什么是 TIA Portal 中的比较操作?
比较操作允许您比较两个相同数据类型(整数、实数、时间等)的数值,或检查一个数值是否位于定义的范围内。它们是创建报警阈值、转换条件和调节回路的基础。
TIA Portal 提供标准比较器(==、<>、>= 等)、范围指令(IN_Range、OUT_Range)、浮点数有效性测试,以及用于 Variant 数据类型和 DB 指针的高级指令。
标准比较器
评估两个操作数之间的相等和不等关系
CMP == — 等于 (Equal)
==功能
比较两个操作数(IN1 和 IN2)。如果 IN1 等于 IN2,则指令返回 TRUE。它支持几乎所有简单数据类型。
适用场景
检查计数器是否达到目标、HMI 设定值是否与当前值匹配,或特定的机器状态是否激活。
专家提示
使用 Real 类型时要小心:由于精度原因,严格相等可能会失败。建议使用偏差或范围。
在 SCL 中:IF value1 = value2 THEN ...
可以比较字符串 (String) 以验证识别码。
CMP <> — 不等于 (Not equal)
<>功能
如果两个操作数 IN1 和 IN2 不同,则返回 TRUE。这是相等的反操作。
适用场景
检测数值变化,确保传感器不返回 0,或验证当前模式不是禁止的模式。
专家提示
常用于在数值偏离设定值时立即触发动作。
在 SCL 中:IF value1 <> value2 THEN ...
可用于比较时间戳 (DTL) 以查看日期是否已更改。
CMP >= — 大于或等于
>=功能
如果第一个值 (IN1) 大于或等于第二个值 (IN2),则返回 TRUE。
适用场景
触发高位报警,在未达到目标温度时允许加热。
专家提示
适用于限值必须包含在条件中的安全阈值。
在 SCL 中:IF level >= setpoint THEN ...
可与 Time 类型一起使用,以检查是否已超过最小持续时间。
CMP <= — 小于或等于
<=功能
如果 IN1 小于或等于 IN2,则返回 TRUE。
适用场景
低水位监控、停止泵、验证最小压力。
专家提示
通常配合滞后处理以避免输出抖动。
原生支持 Date 和 Time 类型。
在 SCL 中:IF pressure <= min_limit THEN ...
CMP > — 大于 (Greater than)
>功能
如果 IN1 严格大于 IN2,则返回 TRUE。
适用场景
不应包含目标值的严格比较。
专家提示
在自动化中比 >= 使用得少,但在数学算法中很有用。
在 SCL 中:IF current > max THEN ...
更适合循环索引比较 (FOR)。
CMP < — 小于 (Less than)
<功能
如果 IN1 严格小于 IN2,则返回 TRUE。
适用场景
严格下限测试。
专家提示
用于检查数值是否为“负数” (val < 0)。
在 SCL 中:IF val < 0 THEN ...
支持字符比较(按字母顺序排序)。
范围操作
检查数值是否属于区间 [MIN..MAX]
IN_Range — 在范围内
IN_Range功能
检查数值 (VAL) 是否位于下限 (MIN) 和上限 (MAX) 之间。区间是闭合的:MIN <= VAL <= MAX。
适用场景
运行窗口监控(例如:压力在 2 到 5 bar 之间)、机器速度验证。
专家提示
有效地替代了两个串联的比较器,使程序段更易读。
如果 MIN > MAX,指令始终返回 FALSE。
对于需要多个模拟量条件的“就绪运行”连锁非常有用。
OUT_Range — 范围外
OUT_Range功能
如果数值 (VAL) 位于 MIN 和 MAX 定义的区间之外,则返回 TRUE。即 VAL < MIN 或 VAL > MAX。
适用场景
异常检测或超过极端阈值(范围报警)。
专家提示
它是 IN_Range 的精确反操作。
使用它来简化过程报警逻辑。
在 SCL 中:res := (val < min) OR (val > max);
有效性测试
检查浮点数的完整性
|OK| — 检查有效性
|OK|功能
检查浮点值(Real 或 LReal)是否为有效数字。如果值为 NaN(非数字)或 Inf(无穷大),则返回 FALSE。
适用场景
在复杂计算(除法、平方根、对数)之后,以避免传播可能导致 PLC 停机的数学错误。
专家提示
在将 Real 值发送到模拟量输出或变频器之前必不可少。
允许检测间接除以零。
便于过滤故障传感器的反馈。
|NOT_OK| — 检查无效性
|NOT_OK|功能
如果浮点值无效(NaN 或 Inf),则返回 TRUE。
适用场景
触发计算故障位或强制执行安全值。
专家提示
如果轨迹计算失败,使用它使机器进入安全状态。
相当于其他语言中的 IS_NAN。
在 SCL 中:IF NOT OK(value) THEN ...
高级比较 (Variant)
用于动态编程和复杂类型的指令
EQ_Type / NE_Type
功能
将 Variant 类型变量的数据类型与另一个变量或定义类型的类型进行比较。
适用场景
在必须处理不同数据类型的通用块中(例如:接受 Int 或 Real 的日志块)。
专家提示
对于面向对象编程和可重用库至关重要。
允许确保动态内存访问的安全。
与 VariantGet 指令配合使用。
IS_NULL / NOT_NULL
功能
检查指针(Variant 或 DB_ANY)是否为空(不指向任何内容)。
适用场景
避免在使用间接寻址 DB 时发生访问错误。
专家提示
在通过指针调用方法或读取数据之前,务必测试 NOT_NULL。
相当于 C#/Java 中的 'Nothing' 或 'null' 对象。
对于 PLC 中的链表管理或动态结构必不可少。
IS_ARRAY
功能
检查 Variant 变量是否指向数组 (Array)。
适用场景
编写批量处理功能或数据缓冲区。
专家提示
配合 CountOfElements 使用以获取数组大小。
允许创建通用的排序函数。
也适用于结构体数组 (UDT)。
比较器对比 — 使用哪一个?
为您的 PLC 逻辑选择正确的指令
| 您想要... | 使用此指令 | 示例 |
|---|---|---|
| 测试精确相等 | CMP == | 产品代码正确 |
| 高安全阈值 | CMP >= | 压力 > 10 bar |
| 维持在区域内 | IN_Range | 温度在 18 到 24°C 之间 |
| 监控 Real 错误 | |OK| | 检查除法结果 |
| 验证 DB 指针 | NOT_NULL | 配方 DB 已加载 |
| 验证 Variant 类型 | EQ_Type | 输入确实是 Int |
常见问题
为什么我的 == 比较有时在处理 Real 数字时失败?
Real 数字(浮点数)的精度有限。计算可能会得出 10.000001 而不是 10.0。比较浮点值时,请始终使用带有小容差的 IN_Range(例如:在 9.99 和 10.01 之间)。
IN_Range 和两个串联的比较器有什么区别?
功能上是相同的。但是,IN_Range 在图形上更紧凑,更易读,且性能更高,因为 PLC 在一个步骤中处理该指令。
|OK| 和 |NOT_OK| 指令有什么用?
它们用于检测 Real 计算中的“静默”错误。如果您对负数求平方根,结果是 NaN。如果没有 |OK| 测试,这个 NaN 将污染您的所有其他计算,并可能导致 CPU 停机。
可以比较完整的结构体 (UDT) 吗?
CMP == 指令不允许直接比较两个结构体。您必须逐个比较每个成员,或者使用比较内存区域的特定块。