3.5 比较指令
本节将介绍PLC的数据比较指令
学习目标
- 掌握各种比较指令的用法
- 理解比较指令的应用场景
- 能够使用比较指令进行条件判断
1. 比较指令概述
1.1 什么是比较指令
比较指令用于比较两个数据的大小关系,根据比较结果输出ON或OFF状态。
比较指令工作原理:
┌───────────────────────────────────────────────────┐
│ ┌───────┐ 比较 ┌───────┐ │
│ │ 数据1 │ ───────────→ │ 结果 │ │
│ └───────┘ 运算符 └───────┘ │
│ ↑ │ │
│ ┌───────┐ │ ▼ │
│ │ 数据2 │ ──────┘ 成立=ON │
│ └───────┘ 不成立=OFF │
└───────────────────────────────────────────────────┘1.2 比较运算符
| 运算符 | 名称 | 含义 | 示例 |
|---|---|---|---|
| == | 等于 | 相等时成立 | D0 == 100 |
| <> | 不等于 | 不相等时成立 | D0 <> 0 |
| > | 大于 | 大于时成立 | D0 > 50 |
| < | 小于 | 小于时成立 | D0 < 100 |
| >= | 大于等于 | 大于或等于时成立 | D0 >= 0 |
| <= | 小于等于 | 小于或等于时成立 | D0 <= 255 |
1.3 比较指令通用形式
比较指令在各品牌PLC中的通用表示:
| 功能 | 符号 | 说明 |
|---|---|---|
| 等于 | == 或 = | 相等时成立 |
| 不等于 | <> 或 != | 不相等时成立 |
| 大于 | > | 大于时成立 |
| 小于 | < | 小于时成立 |
| 大于等于 | >= | 大于或等于时成立 |
| 小于等于 | <= | 小于或等于时成立 |
2. 比较触点形式
2.1 比较触点梯形图
比较指令(触点形式):
【等于比较】
┌──────┐
───┤ == ├───
│ D0 │
│ 100 │
└──────┘
当D0=100时,触点闭合
【大于比较】
┌──────┐
───┤ > ├───
│ D0 │
│ 50 │
└──────┘
当D0>50时,触点闭合
【范围组合】(50 < D0 < 100)
┌──────┐ ┌──────┐
───┤ > ├────┤ < ├───
│ D0 │ │ D0 │
│ 50 │ │ 100 │
└──────┘ └──────┘2.2 简化梯形图表示
【简化表示】
[D0 == 100]
──────┤├──────────( 输出 )───
[D0 > 50] [D0 < 100]
──────┤├─────────────┤├────────( 输出 )───
说明:当条件满足时,触点闭合2.3 比较指令块形式
【梯形图】
┌──────────┐
条件 ──────┤ CMP │──── 结果输出
│ │
数据1 ─────┤IN1 │
数据2 ─────┤IN2 │
└──────────┘
【逻辑表达】
IF 数据1 == 数据2 THEN
结果输出 := TRUE;
ELSE
结果输出 := FALSE;
END_IF;3. 比较指令编程形式
3.1 触点比较指令
触点比较指令形式:
【装载等于】
[D0 == 100]
──────┤├──────────( 输出 )───
当D0=100时,输出有效
【串联大于】
输入 [D0 > 50]
───┤├────────┤├──────( 输出 )───
当输入=ON且D0>50时,输出有效
【并联小于】
输入
───┤├────┬────────────( 输出 )───
│
[D0<100] │
─────┤├──┘3.2 比较指令块
【CMP比较指令】
条件 源1 源2 结果
───┤├───────[CMP 源1 源2 结果]───
结果存储(连续3个标志位):
· 源1 > 源2 → 结果+0 = ON
· 源1 = 源2 → 结果+1 = ON
· 源1 < 源2 → 结果+2 = ON
【区间比较指令】
条件 下限 上限 源 结果
───┤├───────[ZCP 下限 上限 源 结果]───
结果:
· 源 < 下限 → 结果+0 = ON(小于下限)
· 下限≤源≤上限 → 结果+1 = ON(在区间内)
· 源 > 上限 → 结果+2 = ON(大于上限)3.3 数据类型与位数
比较指令支持的数据位数:
┌────────────────────────────────────────────────────┐
│ 位数 │ 数据范围 │
├────────────────────────────────────────────────────┤
│ 8位(字节) │ 0 ~ 255 │
│ 16位(字) │ -32768 ~ 32767 或 0 ~ 65535 │
│ 32位(双字) │ -21亿 ~ 21亿 或 0 ~ 42亿 │
│ 浮点数 │ ±3.4×10^38 │
└────────────────────────────────────────────────────┘
比较指令形式对照:
┌────────────────────────────────────────────────────┐
│ 功能 │ 16位指令 │ 32位指令 │
├────────────────────────────────────────────────────┤
│ 比较 │ CMP │ DCMP │
│ 区间比较 │ ZCP │ DZCP │
│ 触点形式 │ ==, >, <等 │ D==, D>, D<等 │
└────────────────────────────────────────────────────┘4. 各种比较指令详解
4.1 等于比较(==)
等于比较:当两个值相等时成立
应用场景:
· 检测特定值
· 状态判断
· 位置到达检测
【梯形图】
[温度 == 设定值]
──────┤├──────────( 到达指示 )───
说明:当温度等于设定值时,触点闭合,到达指示输出4.2 不等于比较(<>)
不等于比较:当两个值不相等时成立
应用场景:
· 检测异常值
· 变化检测
· 非正常状态判断
【梯形图】
[故障码 <> 0]
──────┤├──────────( 故障指示 )───
说明:当故障码不等于0时,表示有故障,触发报警4.3 大于比较(>)
大于比较:当第一个值大于第二个值时成立
应用场景:
· 上限报警
· 超量检测
· 速度过快判断
【梯形图】
[温度 > 300]
──────┤├──────────( 超温报警 )───
说明:当温度超过300时,触发超高温报警4.4 小于比较(<)
小于比较:当第一个值小于第二个值时成立
应用场景:
· 下限报警
· 不足检测
· 速度过慢判断
【梯形图】
[液位 < 100]
──────┤├──────────( 液位过低 )───
说明:当液位低于100时,触发液位过低报警4.5 大于等于比较(>=)
大于等于比较:当第一个值≥第二个值时成立
应用场景:
· 达到条件判断
· 计数完成检测
· 位置到达判断
【梯形图】
[计数值 >= 100]
──────┤├──────────( 批次完成 )───
说明:当计数值达到或超过目标值时,表示批次完成4.6 小于等于比较(<=)
小于等于比较:当第一个值≤第二个值时成立
应用场景:
· 范围内判断
· 安全限值检测
· 余量不足提示
【梯形图】
[库存 <= 10]
──────┤├──────────( 库存不足 )───
说明:当库存数量≤10时,提示库存不足5. 范围比较
5.1 范围比较原理
范围比较:判断数据是否在指定范围内
下限 上限
│ │
▼ ▼
────────┼───────────┼────────
┌─────────────┐
│ 有效范围 │
└─────────────┘
判断公式:下限 ≤ 数据 ≤ 上限5.2 组合比较实现
用两个比较指令组合:
【判断 50 ≤ 数据 ≤ 100】
梯形图:
┌──────┐ ┌──────┐
───┤ >= ├────┤ <= ├──────( 在范围内 )───
│ 数据 │ │ 数据 │
│ 50 │ │ 100 │
└──────┘ └──────┘
简化表示:
[数据>=50] [数据<=100]
──────┤├──────────┤├────────( 在范围内 )───
逻辑表达:
IF (数据 >= 50) AND (数据 <= 100) THEN
在范围内 := TRUE;
END_IF;5.3 区间比较指令
【区间比较指令】
条件
───┤├───────[ZCP 下限 上限 源 结果]───
功能:比较源数据与区间[下限, 上限]的关系
结果输出:
┌────────────────────────────────────────────────────┐
│ 条件 │ 结果+0 │ 结果+1 │ 结果+2 │
├────────────────────────────────────────────────────┤
│ 源 < 下限(小于下限) │ ON │ OFF │ OFF │
│ 下限≤源≤上限(在区间)│ OFF │ ON │ OFF │
│ 源 > 上限(大于上限) │ OFF │ OFF │ ON │
└────────────────────────────────────────────────────┘
应用示例:温度区间判断
· 结果+0=ON:温度过低,需要加热
· 结果+1=ON:温度正常,保持状态
· 结果+2=ON:温度过高,需要降温6. 比较指令应用实例
6.1 温度控制
需求:
· 温度<200℃:加热
· 200℃≤温度≤250℃:保温
· 温度>250℃:停止加热
【使用区间比较】
始终
───┤├───────[ZCP 200 250 温度 结果]───
结果解析:
· 结果+0=ON:温度<200(需要加热)
· 结果+1=ON:200≤温度≤250(保温)
· 结果+2=ON:温度>250(过热)
【输出控制】
// 加热输出
结果+0
───┤├───────( 加热器 )───
// 保温输出
结果+1
───┤├───────( 保温加热 )───
// 过热报警
结果+2
───┤├───────( 报警 )───6.2 速度分档
需求:根据设定值分3档速度
分档标准:
· 设定<30:低速
· 30≤设定<70:中速
· 设定≥70:高速
【梯形图】
// 低速判断
[设定值 < 30]
──────┤├──────────( 低速标志 )───
// 中速判断
[设定值>=30] [设定值<70]
──────┤├─────────┤├────────( 中速标志 )───
// 高速判断
[设定值 >= 70]
──────┤├──────────( 高速标志 )───
// 速度输出
低速标志
───┤├───────[MOV 500 速度输出]───
中速标志
───┤├───────[MOV 1000 速度输出]───
高速标志
───┤├───────[MOV 2000 速度输出]───6.3 计数比较控制
需求:
· 计数<50:显示正常
· 计数=50:提示即将完成
· 计数≥100:停止并报警
【梯形图】
// 产品计数
计数信号 100
───┤├───────[OUT 计数器]───
// 即将完成提示(=50时)
[计数器 == 50]
──────┤├──────────( 提示灯 )───
// 完成停止(≥100时)
[计数器 >= 100]
──────┤├──────────( 停止 )───
────────( 完成指示 )───6.4 液位控制
需求:水箱液位自动控制
· 液位<20%:启动进水
· 液位>80%:启动排水
· 20%≤液位≤80%:保持
【梯形图】(液位值范围0-1000)
// 检测低液位(带自保持)
[液位 < 200]
──────┤├────┬─────────( 低液位标志 )──
│
低液位标志│
───┤├──────┘
// 检测高液位(带自保持)
[液位 > 800]
──────┤├────┬─────────( 高液位标志 )──
│
高液位标志│
───┤├──────┘
// 进水阀(低液位且非高液位时进水)
低液位标志 高液位标志
───┤├─────────┤/├─────( 进水阀 )──
// 排水阀(高液位时排水)
高液位标志
───┤├─────────────────( 排水阀 )──6.5 故障代码判断
需求:根据故障代码显示不同故障
故障代码表:
· 0:无故障
· 1:过热
· 2:过流
· 3:欠压
· 4:通信故障
【梯形图】
// 无故障
[故障码 == 0]
──────┤├──────────( 正常指示 )───
// 过热故障
[故障码 == 1]
──────┤├──────────( 过热指示 )───
// 过流故障
[故障码 == 2]
──────┤├──────────( 过流指示 )───
// 欠压故障
[故障码 == 3]
──────┤├──────────( 欠压指示 )───
// 通信故障
[故障码 == 4]
──────┤├──────────( 通信故障 )───
// 有任何故障时总报警
[故障码 <> 0]
──────┤├──────────( 总报警 )───7. 比较指令使用注意事项
7.1 数据类型匹配
注意事项:比较的两个数据类型应一致
┌────────────────────────────────────────────────────┐
│ 错误示例: │
│ 比较 D0(整数)与 浮点数 │
│ → 可能产生意外结果 │
│ │
│ 正确做法: │
│ · 整数与整数比较 │
│ · 浮点数与浮点数比较 │
│ · 必要时进行类型转换 │
└────────────────────────────────────────────────────┘7.2 有符号与无符号
有符号数与无符号数比较:
有符号数:数据 = -1 (二进制: 0xFFFF)
无符号数:比较时被视为 65535
示例:
[数据 > 0] // 有符号比较:-1 > 0 = FALSE
[数据 > 0] // 无符号比较:65535 > 0 = TRUE
建议:
· 明确数据的符号属性
· 使用对应类型的比较指令
· 必要时进行数据转换7.3 浮点数比较
浮点数比较注意事项:
由于浮点数精度问题,不建议直接用==比较
错误示例:
IF RealValue = 3.14 THEN // 可能永远不相等
正确做法:使用范围判断
IF ABS(RealValue - 3.14) < 0.001 THEN
// 认为相等
END_IF;
或使用>=和<=组合:
IF (RealValue >= 3.139) AND (RealValue <= 3.141) THEN
// 在可接受范围内
END_IF;本节小结
比较指令要点:
┌────────────────────────────────────────────────────┐
│ 基本比较运算符 │
│ · ==(等于) <>(不等于) │
│ · >(大于) <(小于) │
│ · >=(大于等于) <=(小于等于) │
├────────────────────────────────────────────────────┤
│ 触点形式比较 │
│ · 可直接作为触点使用 │
│ · 串联、并联灵活组合 │
│ · 适合简单条件判断 │
├────────────────────────────────────────────────────┤
│ 范围比较 │
│ · 组合使用>=和<= │
│ · 可用区间比较指令(ZCP) │
│ · 一次判断三种结果 │
├────────────────────────────────────────────────────┤
│ 注意事项 │
│ · 数据类型要匹配 │
│ · 有符号/无符号要明确 │
│ · 浮点数比较用范围判断 │
└────────────────────────────────────────────────────┘练习题
- 编写程序判断D0是否在50~100范围内。
- 根据温度值(D10)控制风扇:>30℃开启,<25℃关闭。
- 设计一个故障诊断程序,根据故障代码(1-5)点亮对应指示灯。
- 说明为什么浮点数不宜直接用==比较。