自己动手写一个FB实现上升沿检测功能 点击:1307 | 回复:4



deelde

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 23回
  • 年度积分:1
  • 历史总积分:29
  • 注册:2011年1月10日
发表于:2021-08-08 08:28:34
楼主






PLC编程经常用到上升沿下降沿指令,今天写个FB,自己实现上升沿检测功能

上升沿时根据输入信号CLK从0到1的跳变,Q输出一个脉冲信号。为此需要一个变量Last记录上一次扫描周期的输入信号,再与输入信号比较,只有当Last为0,CLK为1时Q才为1。出卡诺图如下:


Snipaste_2021-05-23_18-06-48.png

得出Q=AB'


现在实现程序,新建一个FB,输入信号CLK,输出信号Q,内部static变量Last,如下图所示:

Snipaste_2021-05-23_15-05-04.png

用SCL语言编写,程序逻辑如下,Q的值为输入信号CLK与上Last的非值,然后更新Last的值。程序很简单就两行。

Snipaste_2021-05-23_15-06-10.png

编写一个程序,测试一下。

Snipaste_2021-05-23_15-07-29.png

测试结果:

222.gif



感兴趣的小伙伴,可以想一想下降沿程序该怎么写。






楼主最近还看过



找森

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 378回
  • 年度积分:3
  • 历史总积分:213
  • 注册:2015年9月24日
发表于:2021-08-09 15:34:39
1楼

你这写的太复杂了,想的也复杂

yzzzzz

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:85
  • 注册:2021年8月12日
发表于:2021-08-13 09:01:53
2楼

FUNCTION_BLOCK "RisingEdgeAndFallingEdge"

S7_Optimized_Access := 'TRUE' }

VERSION : 0.1

   VAR_INPUT 

      iRisingOrFallingSignal : Bool;   // 上升沿或下降沿信号

   END_VAR


   VAR_OUTPUT 

      oRisingEdge : Bool;   // 上升沿

      oFallingEdge : Bool;   // 下降沿

   END_VAR


   VAR 

      sRisingEdgeOld : Bool;

   END_VAR



BEGIN

    //=============================================================================

    //This sample program shows the basic approach only.

    //I don't accept legal or other liability for

    //incorrect program functions and their consequences!

    //-----------------------------------------------------------------------------

    //*Target:Test!

    //*Author:XuHang

    //*Email:zlqss@hotmail.com

    //*Version:1.0.0.191117_Release

    //*Date:2019/11/17

    //=============================================================================

    

    //上升沿与下降沿输出结果为一个扫描周期

    #oRisingEdge := 0;

    #oFallingEdge := 0;

    //PROCESS

    IF #sRisingEdgeOld XOR #iRisingOrFallingSignal THEN

        IF #iRisingOrFallingSignal THEN

            //RISINGEDGE PROCESS

            #oRisingEdge := 1;

        ELSE

            //FALLINGEDGE PROCESS

            #oFallingEdge := 1;

        END_IF;

        #sRisingEdgeOld := #iRisingOrFallingSignal;

    END_IF;

    

    

    

END_FUNCTION_BLOCK




deelde

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 23回
  • 年度积分:1
  • 历史总积分:29
  • 注册:2011年1月10日
发表于:2021-08-14 09:27:10
3楼

引用 "yzzzzz" 的回复,发表在2楼
        内容: FUNCTION_BLOCK "RisingEdgeAndFallingEdge"{ S7_Optimized_Access := 'TRUE' }VERSION : 0.1   VAR_INPUT ...

deelde

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 23回
  • 年度积分:1
  • 历史总积分:29
  • 注册:2011年1月10日
发表于:2021-08-14 09:32:18
4楼

引用 "找森" 的回复,发表在1楼
        内容: 你这写的太复杂了,想的也复杂

主要是写一下,具体的实现过程,怎么来的

热门招聘
相关主题

官方公众号

智造工程师