Верно только при переходе от High к Low

Я пытаюсь придумать обобщенный способ запрограммировать что-то, что будет True (использует некоторую логику), только когда бит переходит от высокого к низкому.

Язык программирования не имеет значения, но я предпочитаю JAVA или структурированный текст.

Любая помощь будет оценена по достоинству.


person Picky33    schedule 18.03.2021    source источник
comment
Ваш вопрос не ясен. Вы говорите об обнаружении переднего края? Если да, то нужно отслеживать состояние. Обычно это делается с помощью регистра сдвига. Подтолкните значение A к регистру 2 и возьмите новое значение B в регистр 1, затем сравните.   -  person wbg    schedule 19.03.2021


Ответы (2)


В мире IEC61131-3 с использованием ST это может быть достигнуто с помощью 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
person Jakob    schedule 18.03.2021

Чтобы обнаружить нарастающий или спадающий фронт, программа должна работать циклически. В ПЛК IEC 61131-3 это уже работает циклами. Существует 2 способа обнаружения края. Один уже описан @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);
}
person Sergey Romanov    schedule 19.03.2021