仅当从高到低时为真

问题描述

我试图想出一种通用的方法来编程一些只有当有点从高到低时才为真(做一些逻辑)的事情。

编程语言无关紧要,但我更喜欢 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_TRIGR_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 值。这意味着如果我们在该行之前使用ёШАё,我们可能会发现xStartTRUExStartM仍然不是,因此这是我们切换的时刻。

在 JAVA 中,为了使您使用相同的技术,但您必须在一段时间内完成所有工作。我不懂 JAVA,但这里是它在 PHP 中的样子。

<?php
$am = false;
while(true) {
    $a = getA();
    if ($a && !$am) {
        // rise edge
    }
    if (!$a && $am) {
        // fall edge
    }
    $am = $a;
    sleep(1);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...