在SCL编程中,检测信号的上升沿和下降沿通常使用特定的指令来实现。以下是几种常见的方法:
使用库指令R_TRIG和F_TRIG
`R_TRIG`用于检测信号从“0”到“1”的变化,即上升沿。
`F_TRIG`用于检测信号从“1”到“0”的变化,即下降沿。
使用背景DB块
在SIMATIC S7-1500和S7-1200 PLC中,可以使用TIA Portal软件自带的R_TRIG和F_TRIG指令。这些指令会自动生成一个背景DB块,用于存放检测信号的边沿存储位。但是,这种方法在信号较多时会占用较多的CPU存储区。
自定义FC或FB块
可以编写自定义的FC(函数块)或FB(功能块)来检测上升沿和下降沿。这种方法不需要生成背景DB块,但需要引入第三方变量作为边沿存储位。
使用变量名后缀
在某些情况下,可以在变量名后面加上“_pos”来表示上升沿,例如`I1_pos`。这种写法较为简洁,但需要确保变量不是临时变量。
使用位逻辑运算
通过比较当前信号状态与上一次扫描的信号状态,可以判断是否出现了上升沿或下降沿。具体实现时,可以在程序循环的结尾记录当前变量的值,在循环开头检测上次保存的值是否与当前值不同,从而判断是否有跳变。
示例代码
```scl
VAR
signal: BOOL; // 待检测的信号
thirdVariable: BOOL; // 用于记忆的信号状态
END_VAR
METHOD RisingEdgeDetection: BOOL
BEGIN
IF signal = FALSE THEN
IF thirdVariable = FALSE THEN
thirdVariable := signal;
RETURN TRUE;
END_IF;
END_IF;
RETURN FALSE;
END_METHOD
```
在这个示例中,`signal`是待检测的信号,`thirdVariable`用于记忆上一个周期的信号状态。当`signal`从`FALSE`变为`TRUE`时,表示检测到了上升沿,函数返回`TRUE`。
建议
选择合适的方法:根据实际需求和系统资源情况选择最合适的检测方法。如果信号较多,建议使用自定义FC或FB块,并引入第三方变量作为边沿存储位,以减少背景DB块的使用。
注意变量类型:用于记忆的变量必须是静态变量或全局变量,不能是临时变量,以确保在多个扫描周期内能够正确检测沿信号。
避免多次执行:确保在程序循环的结尾记录当前变量的值,并在循环开头检测上次保存的值是否与当前值不同,从而避免因多次执行导致的错误。