Отлавливание переднего фронта по счетчику


#1

пытаюсь сделать это таким правилом:

defineRule(“push”, {
whenChanged: “wb - mio - gpio_77: 5 / Counter 10”,
then: function(newValue, devName, cellName) {
if (newValue % 2 !== 0) {
log("Передний фронт " + newValue);
} else {
log("Задний фронт " + newValue);
}
}
});

вижу следующее:
2019-04-25 15:36:06 Задний фронт 494
2019-04-25 15:36:09 Задний фронт 496
2019-04-25 15:36:11 Задний фронт 498
2019-04-25 15:36:12 Передний фронт 499
2019-04-25 15:36:14 Задний фронт 500
2019-04-25 15:36:16 Задний фронт 502
2019-04-25 15:36:18 Передний фронт 503
2019-04-25 15:36:19 Задний фронт 504
Нечеты фиксируются правилом только при относительно длинном нажатии, также как и при контроле за изменением состояния. что я делаю не так?


#2

Добрый день, alexey1950!
Все у вас так, просто за промежутки между двумя опросами по Modbus модуля контроллером вы успеваете нажать и отпустить кнопку, и при следующем опросе контроллер получает сразу значение счетчика, увеличенное на 2. Собственно, это и означает, что кнопка была нажата.


#3

а как зафиксировать нечет для переключения реле? хочется убрать задержку опроса на MIO, скорости порта и устройств подняты до 115200, но далеко не все нажатия выключателя вызывают реакцию реле.
где-то читал предложение контролировать счетчик для этих целей, но и он не панацея получается.


#4

А не важно же — четный или нечетный: изменился счетчик — значит, что кнопку нажали, значит, переключаем реле. Или вы хотите более сложную логику реализовать?


#5

сложная логика не нужна.
если я переключаю реле по состоянию, то пропуски имеют место быть.
по счетчику, то наоборот - бывает вкл/выкл, если зафиксировались оба фронта.
в поиске оптимального алгоритма до сих пор.


#6

Может, стоит переключать реле когда счетчик изменился и его значение — чётное? Так, кажется, надежнее отрабатывает.


#7

сегодня тоже об этом подумал - так и сделаю.