Требовалось обработать одновременное переключение двух клавиш выключателя. Задействованы два входа на WBIO-DI-WD-14, контроллер HW 6.6.0. События наблюдаю в node-red по MQTT.
Реакция на одиночное переключение быстрая, субъективно менее 100 мс.
Реакция на одновременное переключение двух клавиш странная. Одно событие без задержки, второе тормозит до примерно секунды.
Вот что показали исследования:
В режиме поллинга файлов значения в /sys/class/gpio/gpio262/value /sys/class/gpio/gpio263/value изменяются за миллисекунды, тут все нормально. А вот прерывания приходят явно не на каждое переключение. Краткий лог изменений (в колонках gpio262, gpio263, irq224, irq225):
на два изменения приходит одно прерывание, или вообще не приходит.
Как временное решение уменьшил epoll timeout в wb-homa-gpio/main.cpp.
100 мс уже позволяет отделить одновременное переключение от поочередного (с точки зрения человека), но CPU usage ожидаемо подскочил.
Так в итоге же вы работаете черзе wb-homa-gpio? Если да, то похоже на баг в wb-homa-gpio. Совсем скоро будет новая бета, там как раз переделывали кусок работы с прерываниями. Должно стать лучше.
Судя по всему ничего не изменилось. В последней прошивке такая-же долгая реакция на переключение группы контактов, первый переключается сразу, следующие с задержкой до секунды
В данном случае ваш контроллер WB6 эмулирует своего более старого собрата ADAM 5510 с управлением через сеть PLCNET. Да наверное надо было вам дать видео с веб-морды WB6, но поверьте там реакция такая-же. Модуль реле DO-R10A-8, модуль дискретных входов DI-WD-14. Сигнал с реле8 размыкает сухой контакт EXT1_IN9, на видео видно, что при переключении Relay8 сигнал на EXT1_IN9 меняется быстро. (Я с клавиатуры записываю в поле “Значение переменной” 0 или 1. Сам момент записи виден по смене текста на True, False) Relay2 размыкает сухой контакт на входах EXT1_IN1, EXT1_IN3, EXT1_IN5 и EXT1_IN7. Тут видно что после переключения реле один из контактов мгновенно меняет свое состояние, остальные меняют состояние с задержкой до секунды. Веб
Сетап такой: двухклавишный выключатель, два входа DI-WD-14 в nodered привязаны к двум реле, управляют LED лентами.
Клац по двум клавишам сразу - одно реле сразу щелкает, второе тупит.
Workaround все тот же, поставил поменьше интервал в gpio_driver.cpp:
const auto EPOLL_TIMEOUT_MS = 100;