我正在尝试一种通用的方法来编程只有当位从高到低时才为真(做一些逻辑)的东西。
编程语言无关紧要,但我更喜欢 JAVA 或结构化文本。
任何帮助,将不胜感激。
我正在尝试一种通用的方法来编程只有当位从高到低时才为真(做一些逻辑)的东西。
编程语言无关紧要,但我更喜欢 JAVA 或结构化文本。
任何帮助,将不胜感激。
在使用 ST 的 IEC61131-3 世界中,这可以使用F_TRIG(下降触发器)来实现。
只需声明一个 F_TRIG 并使用布尔值调用它并检查是否启用了 F_TRIG (Q):
VAR
yourFTrig : F_TRIG;
END_VAR
------------------------
yourFTrig(CLK := yourBoolean);
IF yourFTrig.Q THEN
// Your code that shall be executed only when we have a falling trigger
END_IF
为了检测上升沿或下降沿,程序必须循环工作。在 PLC IEC 61131-3 中,它已经在循环中工作。有两种检测边缘的方法。@Jacob 已经描述了一个。它是使用F_TRIG
和R_TRIG
功能块。
让我演示一下这个逻辑的基本原理。
PROGRAM demo
VAR
xStart : BOOL; (* Bit that we detect edge on *)
xStartM: BOOL; (* Bit to store value from last cycle *)
END_VAR
IF xStart AND NOT xStartM THEN
(* Rising edge detected *)
END_IF
IF NOT xStart AND xStartM THEN
(* Falling edge detected *)
END_IF
xStart := xStartM;
END_PROGRAM;
注意xStart := xStartM;
。这条线上方的所有内容都将xStartM
等于上xStart
一个周期的值。这意味着如果我们在该行之前使用ёШАё,我们可能会发现它xStart
是TRUE
但xStartM
仍然不是,因此这是我们切换的时刻。
在 JAVA 中,您使用相同的技术,但您必须在一段时间内完成所有操作。我不知道 JAVA,但这是它在 PHP 中的样子。
<?php
$am = false;
while(true) {
$a = getA();
if ($a && !$am) {
// rise edge
}
if (!$a && $am) {
// fall edge
}
$am = $a;
sleep(1);
}