Debounce (антидребезг)

Добрый день! Подскажите а как то можно отсеить дребезг дискретного выхода. Проблема состоит в том что у меня есть датчик давления и модуль овен 2ас. С датчика приходит сигнал 4-20ма. Далее данные получаю по rs485 modbus rtu с модуля овен. Данные вроде корректные. Но для имитации датчика пока подключён генератор токовой петли. Данные периодически имеют скачкообразный вид. У меня есть 2 уставки более 200 - вкл реле, менее 100 выкл реле. Сейчас у меня при этих условиях включается таймер который через 1000мсек проверяет значение ещё раз и только после этого меняем значение на дискретный выход. Нужен пример метода подсчёта числа совпадающих значений сигнала замкнутости — программа многократно считывает значение переменной , и, если последовало определённое количество подтверждений определённого значения (выше уставки 1, либо ниже уставки 2) в течение заданного промежутка времени (определяется экспериментально и выбирается в пределах от 10 до 1000), и только после этого условия изменить значение дискретного выхода.

Отправлено с моего телефона Huawei

Добрый день.
Надеюсь - я правильно понял задачу, вот код:

//01_08_test_1.js

//Идея в том, чтобы определить переключение только после того как знчение в течении заданного
// времени находится БОЛЬШЕ уставки.

var devInput = "01_08_Test0/test0"; // устройство-источник значений.
var compValue = 10; //Значение, превышение которого отслеживаем
var debounceTime = 2000; //Время "дребезга" в миллисекундах

var timerId = null; //тут будем сохранять идентификатор таймера

log.info("start")

defineRule( "debounceTime" ,{
  whenChanged: "01_08_Test0/test0",
  then: function (newValue, devName, cellName){
    log.info("I’m here!", newValue)
    if(newValue > compValue) { //Если значение БОЛЬШЕ
      log.info("Compare BIGGER", newValue)
      if (timerId){ //Если таймер УЖЕ есть
        log.info("Timer started BEFORE", newValue)
      }
      else{ //Запускаем таймер
        log.info("Timer NEED started", newValue)
        timerId = setTimeout(function () { //Начинаем описывать таймер
          log.info("VALUE BIGGER over", debounceTime, " ms") //тут можно описать требуемое действие
          timerId = null; //Сбрасываем идентификатор отработавшего таймера
        }, debounceTime);
      }
    }
    else{ //Если значение МЕНЬШЕ уставки
      if (timerId){ //Если таймер УЖЕ есть
        log.info("Kill timer", timerId);
        clearTimeout(timerId); //останавливем таймер
        timerId = null; //Сбрасываем идентификатор таймера
      }
    }
  }
})

“log.info” можно удалить или закомментировать

Спасибо вроде меньше стало дребезжать.

На всякий случай скину наш код. У нас просто 2 уставки на мин и макс.

И правильно ли я работаю со счетчиком… Есть подозрение что я что то криво сделал… Небольшие дребезги проходят.

//Идея в том, чтобы определить переключение только после того как знчение в течении заданного

// времени находится БОЛЬШЕ уставки.

var devInput = “wb-modbus-1-0/pressure”; // устройство-источник значений.

var maxP = 200; //Значение, превышение которого отслеживаем

var minP = 100;

var debounceTime = 1000; //Время “дребезга” в миллисекундах

var timerId = null; //тут будем сохранять идентификатор таймера

log.info(“start”)

defineRule( “control_pressure” ,{

whenChanged: “wb-modbus-1-0/pressure”,

then: function (newValue, devName, cellName){

log.info(“I’m here!”, newValue)

if(newValue > maxP) { //Если значение БОЛЬШЕ

log.info(“Compare BIGGER”, newValue)

if (timerId){ //Если таймер УЖЕ есть

log.info(“Timer started BEFORE”, newValue)

}

else{ //Запускаем таймер

log.info(“Timer NEED started”, newValue)

timerId = setTimeout(function () { //Начинаем описывать таймер

log.info(“VALUE BIGGER over”, debounceTime, " ms")

//тут можно описать требуемое действие

dev[“wb-gpio”][“A2_OUT”] = true; // on A2 (DO2

timerId = null; //Сбрасываем идентификатор отработавшего таймера

}, debounceTime);

}

}

if(newValue < minP) { //Если значение БОЛЬШЕ

log.info(“Compare LOWER”, newValue)

if (timerId){ //Если таймер УЖЕ есть

log.info(“Timer started BEFORE”, newValue)

}

else{ //Запускаем таймер

log.info(“Timer NEED started”, newValue)

timerId = setTimeout(function () { //Начинаем описывать таймер

log.info(“VALUE LOWER over”, debounceTime, " ms")

//тут можно описать требуемое действие

dev[“wb-gpio”][“A2_OUT”] = false; // on A2 (DO2

timerId = null; //Сбрасываем идентификатор отработавшего таймера

}, debounceTime);

}

}

}

})

···

С уважением,

Ведущий инженер ЦСА

АО «ЭЛКАМ-нефтемаш»

Мыслин Виктор Валерьевич,

тел. +7-951-948-28-85

image003.png

From: Андрей Радионов через Wiren Board Support [mailto:info@wirenboard.ru]
Sent: Friday, January 8, 2021 8:43 PM
To: Мыслин Виктор Валерьевич
Subject: Re:Debounce







BrainRoot Wiren Board Team
08 Январь

Добрый день.
Надеюсь - я правильно понял задачу, вот код:

//01_08_test_1.js

//Идея в том, чтобы определить переключение только после того как знчение в течении заданного
// времени находится БОЛЬШЕ уставки.

var devInput = "01_08_Test0/test0"; // устройство-источник значений.
var compValue = 10; //Значение, превышение которого отслеживаем
var debounceTime = 2000; //Время "дребезга" в миллисекундах

var timerId = null; //тут будем сохранять идентификатор таймера

log.info("start")

defineRule( "debounceTime" ,{
  whenChanged: "01_08_Test0/test0",
  then: function (newValue, devName, cellName){
    log.info("I’m here!", newValue)
    if(newValue > compValue) { //Если значение БОЛЬШЕ
      log.info("Compare BIGGER", newValue)
      if (timerId){ //Если таймер УЖЕ есть
        log.info("Timer started BEFORE", newValue)
      }
      else{ //Запускаем таймер
        log.info("Timer NEED started", newValue)
        timerId = setTimeout(function () { //Начинаем описывать таймер
          log.info("VALUE BIGGER over", debounceTime, " ms") //тут можно описать требуемое действие
          timerId = null; //Сбрасываем идентификатор отработавшего таймера
        }, debounceTime);
      }
    }
    else{ //Если значение МЕНЬШЕ уставки
      if (timerId){ //Если таймер УЖЕ есть
        log.info("Kill timer", timerId);
        clearTimeout(timerId); //останавливем таймер
        timerId = null; //Сбрасываем идентификатор таймера
      }
    }
  }
})

“log.info” можно удалить или закомментировать

Участники: support (7), Myslin_Viktor_Valere