第四节:位逻辑指令(二)——上升沿/下降沿检测、取反指令、中间变量使用技巧

各位同学,咱们接着聊位逻辑。上一节我们把常开常闭、置位复位这些基本功捋了一遍。今天要讲的这几个指令,说实话,才是真正让程序“活”起来的关键。

你想想看,一个按钮按下去,PLC扫描周期那么快,可能你手还没抬起来,程序已经跑了几百遍了。如果没有边沿检测,你的计数器可能一次就加了上百个数。嗯,这就是我们今天要解决的第一个问题。

一、上升沿与下降沿检测

什么叫上升沿?说白了就是信号从0变1的那一瞬间。下降沿就是信号从1变0的那一瞬间。PLC只认这个“瞬间”,其他时间它都不理你。

在西门子博图里,上升沿指令是R_TRIG,下降沿是F_TRIG。在三菱PLC里,是LDPLDF。用法大同小异,核心逻辑是一样的。

核心要点:边沿检测必须搭配一个“边沿存储位”来使用。这个存储位用来记住上一次的信号状态。

我举个例子。你有一个启动按钮接在I0.0上,想让它按一下,Q0.0就亮;再按一下,Q0.0就灭。用普通常开触点写,你会发现灯一闪一闪的,根本停不下来。为什么?因为PLC扫描太快了,你按一次按钮,它可能检测到了几十次。

正确的写法是这样的:

// 上升沿检测示例(结构化文本)
R_TRIG_Instance(CLK := I0.0, Q => M0.0);
IF M0.0 THEN
    Q0.0 := NOT Q0.0;
END_IF;

这里R_TRIG_Instance就是系统自动生成的背景数据块,用来存储上一次的I0.0状态。M0.0是输出,只在I0.0从0变1的那个扫描周期里为TRUE。

我的个人习惯:给边沿检测指令命名时,我会加上“_Trig”后缀,比如“Start_Trig”、“Stop_Trig”。这样看程序一目了然,知道这是个边沿触发的信号。

二、取反指令

取反指令,符号就是一个圈儿,或者一个感叹号。在梯形图里,你可以在触点前面加个小圆圈,表示“非”。在SCL里,就是NOT关键字。

取反的作用很简单:把1变成0,把0变成1。但它的应用场景其实挺多的。

我记得有一次做项目,客户要求一个风机在“手动模式”下按启动按钮就转,在“自动模式”下由上位机控制。但上位机给的信号是0表示启动,1表示停止。你说这怎么办?加个取反指令就解决了。

// 取反指令示例
Auto_Start := NOT Auto_Stop;  // 上位机给的停止信号,取反后变成启动信号

你看,就这么简单。取反指令虽然基础,但用好了能省不少事。

我曾经踩过的坑:取反指令不要滥用。有些新手喜欢在程序里到处加NOT,结果逻辑绕来绕去,自己都看不懂了。能用常闭触点解决的问题,就别用取反。保持程序的可读性,比炫技重要得多。

三、中间变量的使用技巧

中间变量,说白了就是M点、DB块里的临时数据。它们不直接连外部设备,但却是程序的“粘合剂”。

我见过很多初学者,写程序时把所有逻辑都堆在输出线圈前面。一个Q点前面串了十几个条件,密密麻麻的。这样写,调试的时候改一个条件,可能影响一大片。

正确的做法是什么?用中间变量把复杂的逻辑拆开。

举个例子。一个风机启动的条件有五个:

  • 急停未按下
  • 电源正常
  • 温度未超限
  • 手动模式或自动模式允许
  • 前级设备已运行

如果你把这五个条件直接串在Q点前面,那程序看起来就像一长串火车。我建议这样写:

// 用中间变量拆分逻辑
Start_Permit := NOT E_Stop AND Power_OK AND NOT Temp_Alarm;
Mode_Permit := Manual_Mode OR (Auto_Mode AND上位机允许);
Pre_Condition := Pre_Device_Running;

// 最终输出
Fan_Start := Start_Permit AND Mode_Permit AND Pre_Condition;

这样写的好处是什么?

  • 每个条件独立成行,调试时监控中间变量就能快速定位问题
  • 修改某个条件时,不会影响其他逻辑
  • 别人看你的程序,一眼就能明白你的设计思路

我建议:给中间变量命名时,用“_Permit”、“_Ready”、“_Fault”这样的后缀。比如“Start_Permit”、“Motor_Ready”、“System_Fault”。这样别人一看就知道这个变量是干什么用的。

四、知识体系图

下面这张图,我把今天讲的三个知识点串起来了。你可以看到,边沿检测、取反、中间变量,它们之间是怎么配合的。

位逻辑指令(二)知识体系 上升沿/下降沿检测 取反指令 中间变量使用技巧 按钮防抖、计数触发 信号极性转换、逻辑取反 复杂逻辑拆分、调试辅助 三者配合:边沿检测触发 → 中间变量传递 → 取反调整极性 最终输出到风机启停控制

五、实战中的避坑指南

最后,我分享几个实际项目中容易踩的坑。

第一个坑:边沿存储位重复使用。 我曾经见过一个同事,在程序里用了同一个M点作为两个不同边沿检测的存储位。结果两个信号互相干扰,设备乱动。记住,每个边沿检测指令必须有自己的独立存储位,不能共用。

第二个坑:取反指令放在输出前。 有些新手喜欢在输出线圈前面加取反,比如Q0.0 := NOT M0.0。这样写没问题,但如果你在别的地方也用了Q0.0,逻辑就乱了。我建议把取反放在中间变量阶段完成,输出线圈只做最终赋值。

第三个坑:中间变量命名混乱。 我见过用M0.0、M0.1、M0.2这样命名的程序,根本不知道每个变量是干什么的。后来设备出故障,查了两天才找到问题。从那以后,我要求团队必须用有意义的变量名,哪怕多写几个字,也比事后查错强。

总结一下今天的内容:

  • 上升沿/下降沿检测,用来捕捉信号的瞬间变化,必须搭配存储位
  • 取反指令,用来翻转信号极性,但不要滥用
  • 中间变量,用来拆分复杂逻辑,提高程序可读性和可维护性

好了,这节课就到这里。这些指令虽然基础,但用好了,你的程序会变得清晰、稳定、好调试。下次我们聊定时器指令,那个更有意思。

专注资料整理