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
[16427]
[21351]
[12568]
[7363]
[7207]
[22049]
[7174]
[9783]
[11911]
[12148]

客服
小程序
公众号