Skip to content

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)                          │
│  · 一次判断三种结果                               │
├────────────────────────────────────────────────────┤
│  注意事项                                          │
│  · 数据类型要匹配                                 │
│  · 有符号/无符号要明确                            │
│  · 浮点数比较用范围判断                           │
└────────────────────────────────────────────────────┘

练习题

  1. 编写程序判断D0是否在50~100范围内。
  2. 根据温度值(D10)控制风扇:>30℃开启,<25℃关闭。
  3. 设计一个故障诊断程序,根据故障代码(1-5)点亮对应指示灯。
  4. 说明为什么浮点数不宜直接用==比较。

← 上一节:3.4 数据传送指令 | 返回目录 | 下一章:第四章 高级指令应用 →

本教程由 AI (Claude Opus 4.5) 生成,仅供学习参考