PLC编程经常用到上升沿下降沿指令,今天写个FB,自己实现上升沿检测功能。
上升沿时根据输入信号CLK从0到1的跳变,Q输出一个脉冲信号。为此需要一个变量Last记录上一次扫描周期的输入信号,再与输入信号比较,只有当Last为0,CLK为1时Q才为1。出卡诺图如下:
得出Q=AB'
现在实现程序,新建一个FB,输入信号CLK,输出信号Q,内部static变量Last,如下图所示:
用SCL语言编写,程序逻辑如下,Q的值为输入信号CLK与上Last的非值,然后更新Last的值。程序很简单就两行。
编写一个程序,测试一下。
测试结果:
感兴趣的小伙伴,可以想一想下降沿程序该怎么写。
楼主最近还看过
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