Кейс - часто нажимаю на две кнопки одновременно
Ожидаю, что выходы реле 1 и 2 будут в одинаковом состоянии
На практике, через некоторое количество нажатия получаю рассинхрон: 1 - включен, 2 - выключен
Для того чтобы исключить физическое залипание самой кнопки, кнопки дополнительно подключены к 5 и 6 входам реле, которые переключают выходы 5 и 6 минуя контроллер.
Так как выходы 5 и 6 включены, делаю вывод, что обе кнопки были прожаты одинаковое количество раз, то есть проблема на стороне контролера.
Видео эксперимента
Переключение каналов 1 и 2 реализовано, через wb-rules 10 инпут управляет реле 1, а 9 - 2, подробности в коде (это кстати единственное правило на контролер, поэтому конфликтов быть не должно)
Смотри motion.js ниже (с удовольстивем прикрепил бы файлом, но нельзя)
В скрипте есть логи, из которых становится понятно, что последнее нажатие не детектируется нажатие на EXT1_IN10, в логах видно, что сработал только EXT1_IN9 (первые 3 строки).
См logs.txt ниже (В логи добавил свои комментарии)
Дальнейшее исследование:
-
Попробовал повесить входы 10 и 9 на одну кнопку (поставил перемычку 10 и 9). Далее часто жму на кнопку 2. Нет никаких расхождений - все работает идеально - реле 1, 2, 5, 6 - все либо включены либо выключены одновременно.
-
Попробовал убрать управление реле 1 и 2, но оставил контроль на реле 5 и 6. Вместо управления выходами реле, стал просто менять состояние переменных в памяти. В результате в памяти состояния переменных расходятся. В конце кейса button1.isOn != button2.isOn при этом светодиоды 5 и 6 горят
Скрипт есть, но платформа не разрешает приложить больше 2 ссылок
Схема
Система
Batch No 7.3.4L/9 1D/G-1GC
DTS Version 733
HW Revision 7.3.4
Manufacturing Date 2023-08-30 12:45:56
Release name wb-2307
Release suite stable
Temperature Grade industrial
Можно приложить только 2 ссылки, поэтому придется оформлять как-то
motion.js
//Реагирует на 2 инпута от кнопок, включает/выключает 1 и 2 выходы реле подключеного по модбасу
//Отсылает 2 пакет по модбасу в одном одном обработчике (надеюсь что контроллер их сможет объеденить в один пакет, но это не точно)
//Логика объядинения пакетов была написана в попытке борьбы с рассинхроном
function MyTestModbus2()
{
var button1 = {};
button1.isOn = false;
button1.doSwitch = function()
{
log("doSwitch 1, rnd: ", Math.random());
dev["wb-mr6c_44/K1"] = button1.isOn;
};
var button2 = {};
button2.isOn = false;
button2.doSwitch = function()
{
log("doSwitch 2, rnd: ", Math.random());
dev["wb-mr6c_44/K2"] = button2.isOn;
};
var callback = 0;
var doSwitchBoth = function()
{
log("doSwitchBoth, rnd: ", Math.random());
dev["wb-mr6c_44/K1"] = button1.isOn;
dev["wb-mr6c_44/K2"] = button2.isOn;
}
var action = function(my)
{
return function(newValue, devName, cellName)
{
log("devName:{}, cellName:{}, newValue:{}, rnd: ", devName, cellName, newValue, Math.random());
if (newValue)
{
if (newValue)
{
//Когда кнопку отпустят, применется новое состояние
my.isOn = !my.isOn;
//тут самое интересное
//callback - это то что сделает кнопка при отпускании
// - если callback не установлен, значит другая кнопка не нажата,
// поэтому планируем изиенить только свое состояние
// - но если callback уже установлен, значит другая кнопка уже нажата, но не отжата (тк callback при отжатии сбрасывается)
// поэтому в качестве callback указывается doSwitchBoth
// первая отжатая кнопка выполнит callback и сбросит его
// вторая отжатая кнопка увидит callback == 0 и ничего не будет делать
callback = callback ? doSwitchBoth : my.doSwitch;
}
return;
}
var fn = callback;
callback = 0;
if (fn)
{
fn();
}
}
}
defineRule({
whenChanged: "wb-gpio/EXT1_IN9",
then: action(button1)
});
defineRule({
whenChanged: "wb-gpio/EXT1_IN10",
then: action(button2)
});
}
MyTestModbus2();
logs.txt
//-----КОНЕЦ------
//Конец 3 цикла нажатия
06-10-2023 11:53:37.151 INFO: [rule info] doSwitch 1, rnd: 0.5374596404490535
//-- Зарегистрировано нажатие/отжатие на кнопку 2 (EXT1_IN9) callback = button1.doSwitch
06-10-2023 11:53:37.150 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN9, newValue:false, rnd: 0.498003186977639
//-- ПРОБЛЕМА ТУТ: не заренистрировано нажатие на кнопку 1 (EXT1_IN10)
//-- ожидаю тут ивент "devName:wb-gpio, cellName:EXT1_IN9, newValue:true", но его нет
06-10-2023 11:53:36.692 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN9, newValue:true, rnd: 0.28606293889131895
//Конец 2 цикла нажатия
//-- Отжата кнопка 1 (EXT1_IN10), callback == 0 - ничего не делаем
06-10-2023 11:53:36.014 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN10, newValue:false, rnd: 0.13134387116051938
06-10-2023 11:53:36.012 INFO: [rule info] doSwitchBoth, rnd: 0.18822204755706717
//-- Отжата кнопка 2 (EXT1_IN9), выполнен callback == doSwitchBoth (строчка выше)
06-10-2023 11:53:36.009 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN9, newValue:false, rnd: 0.8231331161462524
//--- Нажата кнопка 1 (EXT1_IN10) callback = doSwitchBoth
06-10-2023 11:53:35.496 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN10, newValue:true, rnd: 0.24481479672704098
//--- Нажата кнопка 2 (EXT1_IN9) callback = button1.doSwitch
06-10-2023 11:53:35.491 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN9, newValue:true, rnd: 0.13787682651964672
//--- Конец 1 цикла нажатия
//-- Отжата кнопка 1 (EXT1_IN10), callback == 0 - ничего не делаем
06-10-2023 11:53:34.769 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN10, newValue:false, rnd: 0.4059453534465999
06-10-2023 11:53:34.762 INFO: [rule info] doSwitchBoth, rnd: 0.9313848723365667
//-- Отжата кнопка 2 (EXT1_IN9), выполнен callback == doSwitchBoth (строчка выше)
06-10-2023 11:53:34.761 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN9, newValue:false, rnd: 0.10404331039606052
//--- Нажата кнопка 1 (EXT1_IN10) callback = doSwitchBoth
06-10-2023 11:53:34.631 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN10, newValue:true, rnd: 0.5071934871149298
//--- Нажата кнопка 2 (EXT1_IN9) callback = button1.doSwitch
06-10-2023 11:53:34.123 INFO: [rule info] devName:wb-gpio, cellName:EXT1_IN9, newValue:true, rnd: 0.7528331248253234
//-----НАЧАЛО------
06-10-2023 11:53:22.329 INFO: reloading file: /etc/wb-rules/motion.js