如何解决仅当从高到低时为真
我试图想出一种通用的方法来编程一些只有当有点从高到低时才为真(做一些逻辑)的事情。
编程语言无关紧要,但我更喜欢 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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。