前面第9讲,我们把 PLC 里最关键的一个基础讲清楚了:
位、字、双字是什么,X、Y、M、D、T、C 这些软元件到底怎么分工。
那一讲解决的是一个“存”的问题。
也就是:数据放在哪里,状态放在哪里,参数放在哪里,内部逻辑放在哪里。
这一讲要解决的,就是一个“判”的问题。
也就是:PLC 拿到这些数据以后,到底怎么判断条件成不成立,什么时候该动作,什么时候该报警,什么时候该停机,什么时候该放行。
很多初学者刚开始写 PLC 程序时,逻辑都比较简单。
比如:
按钮按下了,电机启动
按钮松开了,电机停止
延时到了,阀门打开
计数到了,蜂鸣器响
这种逻辑大多数属于“开关量逻辑”,本质上是在判断某个位有没有成立。
可一旦你开始接触工程项目,就会发现现场并不是只有这种“有和没有”的判断。
现场更多的是这种情况:
温度大于 80 度就报警
压力小于 0.25 兆帕就启动水泵
液位在高位和低位之间时保持当前状态
频率设定值超过上限不允许再加
计数值达到 50 时执行剔除动作
某个参数必须在 10 到 30 之间才允许启动
某个模拟量连续高于阈值 5 秒,才判定故障成立
你会发现,这些都不是简单地看一个触点开没开,而是在“比较一个数值”。
所以从这一课开始,我们就正式进入 PLC 里很重要的一块:
数值逻辑判断。
如果你把这一课学透,后面做模拟量、报警、触摸屏参数、变频器通讯、温度控制、压力控制时,就会轻松很多。
一 什么叫比较指令
先把概念说清楚。
所谓比较指令,简单说就是:
把两个数放在一起,判断它们之间的关系。
最常见的关系只有几种:
大于
小于
等于
大于等于
小于等于
不等于
PLC 里不同品牌写法不同,但本质都一样。
它其实就是在问一个问题:
这两个数据相比,条件成立吗
如果成立,就让程序往下走。
如果不成立,就不让程序往下走,或者执行另一套逻辑。
比如:
D100 大于 80
D200 小于 D210
D300 等于 0
D400 大于等于 50
D500 不等于 D510
这些都属于比较。
你可以把比较指令理解成 PLC 的“裁判”。
它不负责存数据,也不负责输出动作,它负责判断规则有没有满足。
二 为什么比较指令这么重要
因为绝大多数工程逻辑,最后都绕不过“比较”。
你想想,现场程序里最常见的判断其实都是比较:
温度高不高
压力够不够
液位满没满
转速到没到
数量够不够
时间是不是超过了
设定值是不是超范围
故障码是不是等于某个值
模拟量是不是进入危险区间
这些全都不是“看输入点亮没亮”那么简单,而是要对数值做判断。
所以你可以这么理解:
前面学触点逻辑,是在学 PLC 的“骨架”
这一课学比较指令,是在学 PLC 的“判断能力”
没有比较指令,你只能做很基础的开关控制。
有了比较和区间判断,你的程序才开始真正接近工程现场。
三 最常见的几种比较关系,先讲透
咱们先不急着讲复杂应用,先把几种最常用的比较关系讲清楚。
1 大于
大于就是左边这个值,比右边这个值更大。
例如:
实际温度大于报警温度
当前压力大于上限值
累计件数大于目标值
当前频率大于最大允许频率
这种判断适合做什么?
超上限报警
超过某值才动作
超过阈值才允许下一步
上升到某值后切换状态
举个例子。
如果 D100 表示实际温度,D200 表示高温报警设定值。
那么:
当 D100 大于 D200 时,高温报警成立。
这就是最典型的大于判断。
2 小于
小于和大于正好相反。
例如:
压力小于下限
液位小于低液位阈值
速度小于最小值
剩余时间小于 10 秒
流量小于允许下限
这种判断适合做:
缺料报警
低压启动
低液位保护
速度不足报警
低于某值禁止运行
比如恒压供水里,如果压力小于启动压力,就启动水泵;
如果压力恢复到一定值,再停泵。
这背后就是小于和大于的配合。
3 等于
等于看起来简单,其实工程里要小心。
等于的意思是:
两个值完全一样。
比如:
故障代码等于 203
当前步骤号等于 5
当前计数值等于 10
某个模式值等于 2
某个通讯返回字等于预定值
等于特别适合这种情况:
状态码判断
固定编号判断
步骤号判断
精确值判断
但是它不太适合直接判断波动型模拟量。
因为模拟量是会跳动的,想让它正好“等于某一个数”,很多时候并不稳定。
例如你让 PLC 判断:
压力等于 0.50 兆帕就停机
现场很可能实际值跳来跳去,从 0.49 到 0.51,一下过去了,根本不会刚好落在某个精确值上。
所以这种时候,通常不用等于,而是用大于等于或者区间判断。
这个细节非常重要。
4 大于等于、小于等于
这两个是现场里特别常用的。
因为很多时候你不是要求“严格超过”才动作,而是“达到或超过”就算成立。
例如:
产量大于等于 50,执行剔除
压力大于等于停泵值,停止水泵
温度小于等于低温值,启动加热
速度大于等于设定转速,切入下一步
这种写法比单纯的大于、小于更稳妥。
尤其是处理边界值时,很好用。
5 不等于
不等于一般用于:
故障码不是 0
当前步骤不等于 3
参数值不等于设定默认值
通讯接收值不等于上次值
比如:
故障代码不等于 0,就说明有故障。
这比去判断每一种故障代码更省事。
四 比较指令最常比较的对象是什么
理解这一点很关键。
比较指令的两边,通常比较的不是 X、Y 这种位,而是数值。
也就是说,多数情况下比较的对象都在 D 寄存器里,或者是计数器、定时器当前值、常数。
常见的比较有三类。
第一类 数值和常数比较
例如:
D100 大于 80
D200 小于 300
D500 等于 0
这类最简单,也最常见。
比如把实际温度和固定上限比较。
第二类 数值和数值比较
例如:
D100 大于 D200
D110 小于 D120
D300 等于 D301
这种在工程上更实用。
因为右边不是写死的,而是参数设定值、目标值、另一路测量值。
比如:
实际压力 D100 和设定压力 D200 比较
当前频率 D300 和最大允许频率 D310 比较
实际液位 D120 和高液位阈值 D130 比较
这种比较更灵活,尤其适合配合触摸屏参数设置。
第三类 特殊元件当前值和数值比较
例如:
计数器当前值大于 20
定时器当前值小于 5 秒
高速计数当前脉冲等于目标脉冲
这种场合也很多。
比如包装到 10 个执行一次封口,或者定时到一定值时切换动作。
五 工程现场里,为什么很多报警都离不开比较
我们先说报警,因为这个最直观。
很多人觉得报警就是“某个点亮了就报警”。
这只是最基础的一种。
真正工程现场里,大量报警都来自数值越界。
比如:
电机电流过大
系统压力过低
油温过高
液位过低
温度过高
风压不足
速度偏差过大
伺服位置误差超限
这些本质上都是:
实际值和阈值比较以后,发现越界了,于是报警。
所以报警逻辑里,比较指令是核心。
一个温度报警例子
假设:
D100 是实际温度
D200 是高温报警值,设为 80
D201 是超高温停机值,设为 90
那么逻辑可以这样分层:
当 D100 大于等于 D200 时,触发预警
当 D100 大于等于 D201 时,触发停机报警
你看,这一下就把报警分级做出来了。
这比单纯“温度高了就报警”要工程化得多。
六 比较不是只会写一个“>”就行,关键是边界怎么定
这个地方是初学者最容易写得不稳的。
同样一个判断,你写成“大于”,还是“大于等于”,结果可能完全不同。
举个例子。
某系统规定:
压力达到 0.60 兆帕就停泵
那你程序写成:
实际压力大于 0.60 停泵
就会有一个问题。
如果压力正好等于 0.60 呢?
程序不动作,因为你写的是“大于”,不是“大于等于”。
所以更合理的写法通常是:
实际压力大于等于 0.60 停泵
同样地,低压启动也是一样。
如果你想“低于或等于 0.30 就启动”,就别写成“小于 0.30”,要写成“小于等于 0.30”。
这类边界问题,在现场会带来很多莫名其妙的故障感受:
明明已经到了,怎么还不动作
明明应该停了,怎么没停
明明显示值就是那个数,为什么程序不成立
很多时候,不是 PLC 坏了,而是你的比较边界没写对。
七 模拟量判断里,为什么不要轻易用“等于”
这一点一定要单独讲一下。
模拟量,比如温度、压力、液位、流量、电流,这些值在现场几乎都是会波动的。
即使画面上看起来比较平稳,PLC 内部读到的原始值也常常在上下跳。
所以你如果写:
压力等于 500 时报警
温度等于 80 时停机
液位等于 1200 时切换状态
往往是不稳的,甚至根本不成立。
因为这个数可能会这样变化:
498
499
501
503
它一下就越过去了,并没有真的“等于 500”那个瞬间被你捕捉到。
所以模拟量判断,工程里更常用的是:
大于
小于
大于等于
小于等于
区间判断
延时确认
回差控制
这个要尽早养成习惯。
等于更适合这种数据:
步骤号
故障码
模式编号
产品编号
配方编号
命令字
状态字里的某个特定编码
八 什么叫区间判断
比较指令学到后面,一定会进入“区间判断”。
区间判断,说白了就是:
不是只看一个上限或者一个下限,而是看某个值是不是落在一段范围里。
例如:
温度在 20 到 30 之间
压力在 0.35 到 0.55 之间
液位在高低限之间
频率设定必须在 10 到 50 之间
电流值如果落在危险区间内,就报警
所以区间判断本质上是两个比较条件的组合。
比如:
D100 大于等于 20
并且
D100 小于等于 30
两个条件同时成立,就表示 D100 在 20 到 30 的区间内。
这个思路非常重要。
因为现场绝大多数“范围合格”“范围允许”“区间报警”都是这么来的。
九 区间判断最常见的三种用法
1 合格区间判断
比如某工艺要求温度必须在 65 到 75 之间,才允许进入下一步。
那么逻辑就是:
实际温度大于等于 65
并且
实际温度小于等于 75
满足后,置位“温度合格”标志。
这种判断常见于:
工艺允许启动
参数合格放行
产品尺寸判断
到位误差判断
速度稳定区判断
2 危险区间判断
比如某设备在 40 到 50 之间是正常,低于 30 或高于 60 就危险。
这时候可以做成多级判断:
小于 30,低低报警
30 到 40,低报警
40 到 50,正常
50 到 60,高报警
大于 60,高高报警
这在温度、压力、液位、浓度、电流这些场景里都非常常见。
3 禁止区间判断
有些场合不是允许在范围内,而是禁止落在某个范围里。
比如某机械共振区间在 18 到 22 赫兹之间,不允许停留。
或者某温度段不适合切换工艺。
又或者某模拟量值落在某区间时,判断传感器异常。
那么就可以写成:
如果值大于等于 18,并且小于等于 22,则报警或跳过该区间。
这类判断在进阶项目里很有用。
十 用一个液位控制例子,把比较和区间讲清楚
咱们举一个很典型的液位控制案例。
现场要求
有一个储液罐,需要自动补液。
液位过低时启动补液泵。
液位升到高位时停止补液泵。
液位低到危险值时报警。
液位高到溢出风险值时也报警。
正常工作液位希望保持在一个合理范围内。
变量假设
D100 表示当前液位
D200 表示低液位启动值
D201 表示高液位停泵值
D202 表示低低液位报警值
D203 表示高高液位报警值
逻辑分析
当 D100 小于等于 D200 时,启动补液泵
当 D100 大于等于 D201 时,停止补液泵
当 D100 小于等于 D202 时,发低低液位报警
当 D100 大于等于 D203 时,发高高液位报警
你会发现,这里比较关系已经用了好几层。
而且 D200、D201、D202、D203 这些最好都做成可调参数,而不是写死。
这样触摸屏就可以改。
进一步优化
如果再增加一个“正常液位区间”判断,比如:
液位在 D204 到 D205 之间时,点亮“液位正常”指示
那么这就是典型区间判断:
D100 大于等于 D204
并且
D100 小于等于 D205
这样程序立刻就更完整了。
十一 为什么启动值和停止值不要设成一样
这里要讲一个非常重要的工程思维:
回差,也叫滞回。
很多初学者在做比较控制时,会这样想:
压力低于 0.30 启动
压力高于 0.30 停止
看起来很简单,实际很容易抖动。
因为现场压力是波动的。
它可能在 0.29 和 0.31 之间来回跳。
那你的泵就会一会儿开,一会儿关,来回抽动,设备根本不稳定。
更合理的做法是:
压力小于等于 0.30 启动
压力大于等于 0.40 停止
这样中间就形成了一个区间。
泵启动后,不会因为刚一抬升到 0.31 就停,而是要等它真正升到 0.40 才停。
这个 0.30 到 0.40 之间的差值,就是回差。
回差为什么重要
因为现场数据不是静止的。
它有波动,有噪声,有惯性,有采样误差。
没有回差,设备就会频繁抖动。
有了回差,系统才稳。
所以以后你做这类开关控制,一定要记住:
启动值和停止值尽量不要设成同一个值。
上限和下限最好留出合理间隔。
这在水泵、风机、加热、降温、液位、压力等场景里都特别重要。
十二 比较逻辑和延时配合,才更像现场程序
再往前走一步。
现场很多故障和报警,不是“一超限就立刻报警”,而是要“连续超限一段时间才报警”。
为什么?
因为很多波动只是瞬间干扰,不是真故障。
比如:
压力瞬间掉了一下
温度采样抖了一下
液位晃动了一下
电流尖峰闪了一下
如果你一比较就立刻报警,现场就会觉得设备“特别敏感,老误报”。
所以工程上更常见的写法是:
先比较
再延时确认
最后再报警
举个例子。
当 D100 小于低压阈值 D200 时,不是马上报警,而是先启动定时器 T0。
只有当低压状态持续 5 秒,T0 到时后,才置位低压报警 M10。
这样就稳很多。
你看,这里已经把三类元件串起来了:
D 负责数值
比较负责判断
T 负责确认时间
M 负责报警状态
这就是一套很典型的工程写法。
十三 一个温度控制例子,帮你把逻辑层级再拉高一点
现场要求
某加热箱需要维持温度。
操作员在触摸屏上设定目标温度。
当实际温度低于设定值时启动加热。
当温度高于设定值上限时停止加热。
超过高温报警值时报警。
超过超高温值时强制停机。
温度传感器异常时也要报警。
变量假设
D100 实际温度
D200 目标温度
D201 停止加热上限
D202 高温报警值
D203 超高温停机值
D204 传感器最小合理值
D205 传感器最大合理值
逻辑分层
第一层,正常控制
当 D100 小于 D200 时,启动加热
当 D100 大于等于 D201 时,停止加热
第二层,报警
当 D100 大于等于 D202 时,高温报警
第三层,保护停机
当 D100 大于等于 D203 时,强制停机
第四层,传感器异常判断
当 D100 小于 D204 或 D100 大于 D205 时,判定传感器异常
你看,这里面已经不是一个简单比较了,而是一整套数值判断体系。
而且这里最关键的一点是:
不同判断的等级要分开。
不是所有温度高都立刻停机。
有的是提示,有的是报警,有的是强制保护。
这就是工程逻辑的层次感。
十四 比较指令在步骤控制里怎么用
很多人以为比较只和模拟量有关,其实顺控里也经常用。
比如一个包装设备:
步骤 1,进料
步骤 2,夹紧
步骤 3,封口
步骤 4,出料
你在程序里常常会用一个 D 寄存器表示当前步骤号,比如 D10。
这时候就会有很多“等于”判断:
当 D10 等于 1 时,执行进料逻辑
当 D10 等于 2 时,执行夹紧逻辑
当 D10 等于 3 时,执行封口逻辑
当 D10 等于 4 时,执行出料逻辑
再比如计数达到某值时跳步骤:
当当前计数值大于等于 10 时,步骤号加 1
所以比较在顺控里一样重要。
十五 参数合法性判断,也是比较的一个大用处
这块特别适合和触摸屏配合。
很多时候,操作员可以在 HMI 上修改参数。
但并不是所有参数都可以随便填。
比如:
温度设定不能低于 20,也不能高于 120
变频器频率不能低于 5,也不能高于 50
运行延时不能小于 1 秒,也不能大于 60 秒
目标计数不能小于 1,也不能超过 9999
这时候 PLC 程序就要做参数合法性判断。
例如:
如果 D300 小于 20,则自动修正为 20
如果 D300 大于 120,则自动修正为 120
或者:
如果参数不在合法区间内,则置位参数错误报警,不允许启动
这种写法很实用,也很工程化。
因为它能防止误操作,减少现场问题。
十六 为什么同样是比较,现场程序还要考虑“单位一致”
这点很容易被忽略。
比如触摸屏上显示压力单位是兆帕,操作员设定 0.45。
但 PLC 内部为了避免小数处理,可能把这个数放大了 1000 倍,存成 450。
而模拟量换算后的实际值,也可能是 438、442、451 这种整数。
这时候你做比较是没问题的。
但如果你一边拿 0.45 的概念去想,一边程序里其实存的是 450,就很容易写乱。
再比如温度画面显示 68.5,PLC 内部可能存的是 685。
如果你比较阈值时写成 68,而不是 685,逻辑就全错了。
所以做比较前,必须确认两边单位一致、缩放一致、格式一致。
这一点在模拟量、通讯、触摸屏参数中尤其关键。
十七 一个特别容易出错的地方:比较的是原始值,还是工程值
咱们把这个坑单独拎出来讲。
很多模拟量信号进 PLC 后,会经历两个阶段:
第一阶段,原始采样值
比如 0 到 4000、0 到 32000
第二阶段,工程换算值
比如 0 到 100 度、0 到 1.0 兆帕
这时候你程序里到底拿哪个值做比较,非常重要。
如果你的报警值写的是“80 度”,那比较对象就应该是工程值,不是原始值。
否则你得先把 80 度换算成对应的采样数,再比较。
为了程序更直观、更好维护,工程上通常建议:
尽量用工程值做控制和报警判断
原始值只用于采集与换算
也就是说:
D100 存原始值
D110 存实际温度值
后面所有高温报警、加热控制,都尽量用 D110 来比较
这样别人一看程序就明白。
否则全是原始数,维护非常痛苦。
十八 多级比较,是把程序写得更像设备的重要方法
初学者写程序,常常只有“正常”和“异常”两档。
但现场设备往往需要多级判断。
例如温度:
低于 20,低温报警
20 到 60,正常
60 到 80,偏高预警
80 到 90,高温报警
90 以上,超温停机
又比如压力:
低于 0.20,低低压停机
0.20 到 0.30,低压预警
0.30 到 0.60,正常
0.60 到 0.70,高压预警
0.70 以上,高高压停机
这种分层判断的好处是:
操作员知道当前处于哪个风险等级
程序不会“一刀切”
设备可以先提示,再报警,再保护
用户体验更专业,控制策略也更合理
这种层级感,本质上也是比较逻辑堆出来的。
十九 一个完整的小案例:恒压供水的比较逻辑怎么设计
咱们用一个特别经典的场景来讲,比较指令在项目里到底怎么落地。
现场要求
有一台水泵负责供水。
压力低时自动启动。
压力高时自动停机。
压力过低报警。
压力过高报警。
连续低压一段时间还升不上去,则判定系统异常。
触摸屏可设置启动压力、停机压力、低压报警值、高压报警值。
变量假设
D100 当前压力
D200 启动压力
D201 停机压力
D202 低压报警值
D203 高压报警值
M10 水泵运行命令
M11 低压报警
M12 高压报警
M13 压力异常报警
T0 低压持续确认定时器
逻辑拆解
第一层,启停控制
当 D100 小于等于 D200 时,置位 M10,启动水泵
当 D100 大于等于 D201 时,复位 M10,停止水泵
这里 D200 和 D201 不设成一样,就是为了留回差。
第二层,低压报警
当 D100 小于等于 D202 时,置位 M11
第三层,高压报警
当 D100 大于等于 D203 时,置位 M12
第四层,异常确认
如果水泵已经运行,但 D100 仍持续低于 D202,说明可能漏水、泵打不上压或系统故障。
这时启动 T0。
如果低压状态持续 10 秒,T0 到时,置位 M13。
你看,这里其实就是把比较用到了四个层面:
控制
报警
保护
故障诊断
这就是工程逻辑,而不只是“会写一个大于”。
二十 初学者写比较逻辑时最容易踩的坑
这一段你要认真看,很多现场问题都出在这些地方。
1 只写一个阈值,没有回差
前面说过,最容易引起抖动。
特别是泵、风机、加热这类控制。
2 模拟量直接用等于判断
几乎一定会踩坑。
除非你特别确定这个值是稳定的离散值。
3 比较边界没想清楚
该用大于还是大于等于
该用小于还是小于等于
很多程序问题都出在这里。
4 参数单位不一致
一个是放大 10 倍的值
一个是真实单位
写到一起比较,结果必错。
5 原始值和工程值混用
采样值 2760 和实际温度 68.5 混着比,程序就乱。
6 没有延时确认,导致误报警
现场波动一下就报警,设备体验很差。
7 区间判断时只写了一半
比如你本来想判断“在 20 到 30 之间”,结果只写了“大于 20”,忘了“小于 30”。
这种错误现场也特别常见。
8 多级报警没有分优先级
高温报警和超高温停机一起乱套,最后不知道哪个该先处理。
所以多级判断要分层。
二十一 这一讲真正要建立的,不只是“会比较”,而是“会设规则”
你学到这里,其实可以发现,比较指令本身并不复杂。
复杂的是:你到底想让设备按什么规则运行。
也就是说,写比较逻辑前,你脑子里要先想清楚:
什么情况下算正常
什么情况下算预警
什么情况下算报警
什么情况下要停机
什么情况下只是瞬时波动
什么情况下必须持续成立才算故障
什么情况下要留回差
什么情况下要做区间放行
这些才是工程思维。
PLC 只是把这个思维写出来。
比较指令只是工具。
所以以后你接到一个项目,不要急着问“这个用哪个指令”。
先问自己:
这个量我要怎么判断
边界在哪里
要不要回差
要不要延时
要不要分级
参数要不要可调
你这么想,程序水平会提升很快。
二十二 本课小结
这一课你至少要真正吃透下面这些点。
第一,比较指令就是对两个数据关系进行判断,常见有大于、小于、等于、大于等于、小于等于、不等于。
第二,比较最常用于温度、压力、液位、频率、计数、故障码、步骤号、参数设定值这些数据逻辑里。
第三,模拟量判断尽量少用“等于”,更常用“大于等于”“小于等于”“区间判断”。
第四,区间判断本质上是两个比较条件同时成立,比如“大于等于下限,并且小于等于上限”。
第五,工程现场里很多控制都需要回差,也就是启动值和停止值不要设成同一个数。
第六,比较逻辑经常要和延时确认配合,避免波动导致误报警。
第七,做比较之前,一定要确认单位一致、缩放一致,分清原始值和工程值。
第八,真正好的程序,不是只会比较,而是会把“正常、预警、报警、保护”分层设计出来。
二十三 学完这一课后,你应该能做到什么
学完这一课,你应该至少可以做到这些事情:
知道什么时候用大于,什么时候用大于等于
知道模拟量为什么不适合直接用等于
会写一个基本的上下限报警逻辑
会写一个简单的区间判断
知道回差为什么重要
知道比较逻辑为什么常和定时器配合
知道触摸屏参数为什么通常要和 D 寄存器比较
知道一个工程量判断,不能只盯着“指令写法”,还要看边界和规则设计
如果这些你顺了,后面的运算、参数修正、模拟量处理就会更好学。
二十四 下节预告
下一课我们继续往下走,讲的是:
PLC 基础课 第11讲
数学运算与工程量换算:加减乘除、比例缩放、显示修正怎么做
这一课会把模拟量换算、温度显示、压力换算、频率给定、触摸屏参数处理这些常见场景慢慢讲透。
它和这一讲是直接衔接的,因为比较解决的是“怎么判断”,而运算解决的是“数据怎么变成能判断、能显示、能控制的样子”。
推荐阅读:
PLC 基础课 第16讲 程序分段与结构化:主程序、子程序、功能块,怎么让程序更好维护
PLC 基础课 第14讲 掉电保持、上电初始化、首次扫描:设备重启后,程序为什么会乱?
PLC 基础课 第10讲 比较指令与区间判断:大于、小于、等于,现场逻辑怎么写更稳妥
PLC 基础课 第9讲 PLC 数据类型与寄存器:位、字节、字、双字,M X Y D T C 怎么分工
PLC 基础课 第 8 讲|一个完整小项目:水泵控制柜,从电气原理图到 PLC 梯形图
PLC 基础课 第 7 讲|报警与状态:怎么写出一个好用的报警逻辑 + 保留最后一次故障