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,每个指令都有它的脾气。多练练,自然就熟了。下一节我们讲定时器指令,那个更实用,几乎每个程序都离不开它。