Доброго времени суток!
Для контроля состояний автоматических выключателей (далее АВ) я использую модуль WBIO-DI-HVD-16. Каждый АВ имеет доп контакт, который подаёт дежурное напряжение при определенных положениях на данный модуль.
Так как у меня волшебная щитовая с HMI панелью от EKF (https://support.wirenboard.com/t/wb7-ekf-pro-screen-schetchik-merkurij/26208/30), я на ней отобразил состояние АВ.
- создаю устройство с протоколом Modbus.
- создаю каналы под необходимые мне АВ.
- создаю правило (кусок примера) :
defineRule("EKF control panel QF monitor", {
whenChanged: ["wb-gpio/EXT1_IN1"],
then: function () {
if(dev["wb-gpio/EXT1_IN1"] == true) { // читаем данные (есть 220 или нет) со входа WBIO-DI-HVD-16. QF1 (B14) - аварийный доп. контакт
dev["wb-modbus-1-1/QF1_B14"] = true;
}
else {
dev["wb-modbus-1-1/QF1_B14"] = false;
}
}});
Всё отлично работает, но проблема (скорее дискомфорт) вот в чем:
При перезагрузке панели, сам WB при этом работает, графическое отображение состояния АВ в начальном (выключенном состоянии). Отображение происходит корректно только тогда, когда откроешь щитовую и вкл/выкл любой из АВ (у нас же правило реагирует на изменения, которых, по факту, не происходит при перезагрузке HMI панели, а она при включении отображает начальное значение).
Вопрос: как подать сигнал с WBIO-DI-HVD-16 на “обновление” не прибегая к физической перезагрузке?
Заранее спасибо!
P.S. Пока только одна “топорная” идея - это поставить реле в WB и через него “перезапускать” дежурное напряжение.
Добрый день.
Можно записать как
if(dev["wb-gpio/EXT1_IN1"]) { // читаем данные (есть 220 или нет) со входа WBIO-DI-HVD-16. QF1 (B14) - аварийный доп. контакт
Довольно просто. Так как вся логика - событийная - достаточно отследить ошибку “отсутствия устройства”.
То есть если устройство сменило статус на “онлайн” (сбросился топик ошибки - то просто записать в него один раз значения.
Ну и делать по правилу на каждый топик руками - как-то не очень красиво.
Я б так описал:
//04_28_test_02.js
var topicks = {"in1":{"inTopick":"wb-gpio/A1_OUT", "outTopick":"outDevForIN/in1"},
"in2":{"inTopick":"wb-gpio/A2_OUT", "outTopick":"outDevForIN/in2"},
"in3":{"inTopick":"wb-gpio/A3_OUT", "outTopick":"outDevForIN/in3"}}
function makeRule(name, inTopick, outTopick ){
//создадим правило
defineRule(name+"rule_topiks", {
whenChanged: inTopick, // топик, при изменении которого сработает правило
then: function (newValue, devName, cellName) {
log.debug("devName:{}, cellName:{}, newValue:{}", devName, cellName, newValue); // вывод сообщения в лог
//установка текущего уровня
dev[outTopick] = newValue //устанавливаем прямое значение
}
});
}
for (i in topicks){
log.info ("i=", i)
log.info ("i.inTopick=", topicks[i].inTopick)
makeRule(i, topicks[i].inTopick, topicks[i].outTopick )
//log.info ("i.inTopick=", topicks[i].inTopick)
}
//А тут можно сделать правило которое обработает ошибку связи с устройством. Точнее не ошибку а состояние когда ошибка пропала. Появление связи!
//Ну и выполнить банальный цикл:
/*
for (i in topicks){
dev[topicks[i].outTopick] = dev[topicks[i].inTopick]
//log.info ("i.inTopick=", topicks[i].inTopick)
}
*/
Ну, так себе. Лишнее реле - да и зачем, если решается программно?
У меня, например по такому ж принципу переписывается конфиг openhasp панели, если она долго не обновляет свои топики и потом появляется на связи.