4. 位逻辑指令(下):SET、RST、PLS、PLF、MPS、MRD、MPP堆栈指令

好,咱们接着聊位逻辑指令。上一节讲了触点、线圈这些基础指令,这一节要上点硬菜了——SET、RST、PLS、PLF,还有堆栈指令MPS、MRD、MPP。这些指令在实际项目里用得特别多,尤其是做顺序控制和信号处理的时候。

4.1 SET与RST:自锁与复位

先说SET和RST。这俩指令说白了就是“置位”和“复位”。

SET:把指定的位元件置为ON,并且保持住。哪怕驱动条件断开了,它也不会自己掉下来。

RST:把指定的位元件复位为OFF。

我刚开始学PLC那会儿,总觉得SET和普通的线圈输出没啥区别。后来在项目里吃过亏才明白——SET是带记忆的,普通线圈是随动的。

核心区别:

  • 普通线圈(Y0):驱动条件ON→Y0 ON;驱动条件OFF→Y0 OFF
  • SET Y0:驱动条件ON→Y0 ON并保持;驱动条件OFF→Y0保持ON
  • RST Y0:驱动条件ON→Y0 OFF

来看个典型例子:

X0    SET   Y0
X1    RST   Y0

按下X0,Y0亮起来,手松开Y0也不灭。只有按下X1,Y0才灭。这就是自锁电路的精髓。

我的习惯:做单按钮启停控制时,我特别喜欢用SET和RST。一个按钮按一下启动,再按一下停止,逻辑清晰,不容易出错。

4.2 PLS与PLF:上升沿与下降沿脉冲

PLS和PLF是脉冲生成指令。它们的作用是:当检测到信号的边沿变化时,产生一个扫描周期的脉冲。

PLS:上升沿检测。输入信号从OFF→ON时,输出一个扫描周期的ON。

PLF:下降沿检测。输入信号从ON→OFF时,输出一个扫描周期的ON。

为什么要用这个?你想想看,有时候我们只需要一个瞬间的信号去触发某个动作,比如计数器加1。如果直接用长信号,计数器可能会一直加个不停。

X0    PLS   M0
M0    INC   D0

X0每接通一次,M0就产生一个扫描周期的脉冲,D0加1。这样就不会出现按一下按钮,计数器跳好几下的情况。

注意:PLS和PLF生成的脉冲宽度等于一个扫描周期。如果程序扫描时间很长,这个脉冲可能比你想象的要宽。我在一个老设备上遇到过这个问题,扫描周期50ms,结果脉冲宽度50ms,导致后续逻辑误动作。后来我改用上升沿检测指令(LDP)才解决。

4.3 堆栈指令:MPS、MRD、MPP

堆栈指令是很多初学者觉得头疼的地方。其实没那么复杂,我换个说法你就明白了。

PLC执行梯形图时,是从左到右、从上到下扫描的。当遇到分支电路时,需要记住当前的状态,等分支处理完再恢复。这个“记住”的动作,就是堆栈指令干的活。

MPS(Push):把当前运算结果压入堆栈,相当于“存一下”。

MRD(Read):读取堆栈最上层的数据,但不弹出,相当于“看一眼”。

MPP(Pop):从堆栈弹出数据,相当于“取出来”。

堆栈深度是11层,也就是说最多可以连续用11次MPS。不过说实话,我做了这么多年项目,最多用到3层就顶天了。超过3层的逻辑,建议用辅助继电器M来过渡,否则程序可读性太差。

来看个典型的多分支电路:

    X0    X1    Y0
    |--||--||--( )--|
    |    X2    Y1   |
    |--||--||--( )--|
    |    X3    Y2   |
    |--||--||--( )--|

用堆栈指令实现:

LD   X0
MPS
AND  X1
OUT  Y0
MRD
AND  X2
OUT  Y1
MPP
AND  X3
OUT  Y2

你看,MPS把X0的状态存起来,然后处理第一个分支。MRD读取之前存的状态,处理第二个分支。MPP取出状态,处理第三个分支。这样X0的状态被复用了三次。

避坑指南:我曾经在调试一个包装机程序时,发现某个输出死活不对。查了半天,原来是MPS和MPP没配对——多了一个MPS少了一个MPP,堆栈乱套了。记住:MPS和MPP必须成对出现,MRD可以单独用。

4.4 指令对比与选用建议

指令 功能 适用场景 注意事项
SET 置位并保持 自锁、状态保持 必须用RST复位
RST 复位 清除状态、计数器清零 可复位位元件和字元件
PLS 上升沿脉冲 单次触发、计数 脉冲宽度=扫描周期
PLF 下降沿脉冲 停止检测、下降沿触发 同上
MPS 压栈 多分支电路 最多11层,建议≤3层
MRD 读栈 中间分支 不改变堆栈内容
MPP 出栈 最后一个分支 必须与MPS配对

4.5 实战经验总结

最后说几点我的个人体会:

  • SET/RST比自锁电路更可靠。用普通触点做自锁,万一程序跑飞或者扫描异常,状态可能丢失。SET是硬件级别的保持,稳得很。
  • PLS/PLF在高速场合要慎用。如果输入信号变化很快,一个扫描周期内可能多次变化,PLS可能漏掉。这时候要用高速计数器或者中断。
  • 堆栈指令能不用就不用。不是说它不好,而是用多了程序难读。我一般用辅助继电器M代替堆栈,虽然多几个元件,但维护的人看了不骂娘。

嗯,这一节的内容就这些。SET、RST、PLS、PLF、MPS、MRD、MPP,每个指令都有它的脾气。多练练,自然就熟了。下一节我们讲定时器指令,那个更实用,几乎每个程序都离不开它。