PLC 边沿检测原理

还记得许久以前 LT 曾有篇日志对ABB的编程语言 RAPID 有无边沿检测功能作过讨论《RAPID 编程中对边沿检测》,当时 LT 对PLC 还不是很熟悉,所以未寻到答案。近期通过对PLC原理的学习,对此有些认识,笔记之。

所谓的边沿检测,就是检测某个信号从0变为1或从1变为0的这个过程,通常用于输入只需要一次的情况的,比如某个输入信号到来时只触发一次操作。

西门子PLC 的  S7  里,其提供了上升沿或下降沿的检测,STL语言里即 FP 或FN,可以在一个扫描周期内输出一个信号1。用法如下。

A      I0.1       // I0.1 输入信号
FP     M0.1       //检测 I0.1从0到1
=      Q4.0       // 输出

但是在 S5里面 ,并没提供这个指令,我们在S7里面也可以自行编写。原理是需要有一个存储位来存储信号前后的状态,比较即可输出。通常思路如下,以上升沿检测为例:

A     I0.1    //输入信号
AN    M0.0    //存储信号上一个状态
=     M0.1    // 输出
A     I0.1    //输入信号
=     M0.0    //存储当前信号状态

分析工作过程:当I0.1为0时,M0.1输出为0;当I0.1变为1时,M0.1输出为1,此时M0.0变为1;下一个扫描周期时,由于I0.1为1,M0.0为1,所以M0.1输出变为0;以下过程看官自行分析。

同理,下降沿检测如下:

AN   I0.1
A    M0.0
=    M0.1
A    I0.1
=    M0.0

请看官自行验证是否工作。

再回到高级语言如何检测信号跳变呢,有了上面的思路,也就有答案了,但由于考虑到ABB工业机器人对于RAPID程序的执行方式是逐条解释的,并不是象PLC那样快速循环扫描,所以下面语句保证不了实时性,即是否能捕捉到跳变的问题。仅仅说明原理。

 b_output := 0;
 b_tmp    := 0;
...
WHILE TRUE DO
    b_output := di AND NOT b_tmp;
    b_tmp    := di;
    IF b_output THEN
        ...
    ELSE
        ...
    ENDIF
ENDWHILE

除非上述两条语句快速循环执行,否则 LT 觉得毫无意义,所以对于RAPID来说还是用中断 Interrupt (参考文章《初识 RAPID 中的 Interrupts》)并按照上面的思路来处理这些跳变好些。不过这个思路可以用于PLC的编程,如西门子的 SCL 语言。

扩展阅读:

关键字:上升沿, 下降沿, 跳沿, 边沿

5 thoughts on “PLC 边沿检测原理

  1. Pingback: 总线通讯中的看门狗 | LT

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.