Добрый день.
Подскажите как можно реализовать следующую задачу.
Есть прибор учёта Modbus.
ПУ опрашивается контроллером WB по Modbus TCP.
Контроллер WB опрашивает SCADA по Modbus TCP.
В случае отсутствия связи ПУ - WB на вкладке WB карточка устройства становится красной
Но SCADA опрашивая WB по прежнему получает последнее показание и “не догадывается” что ПУ уже “вышел из чата”.
Задача.
Создать Modbus регистр который при пропадании связи с ПУ менял бы своё состояние на 0.
SCADA считывала бы данный регистр и подтверждала актуальность данных из считываемого регистра ПУ.
Ну или другой вариант решения задачи передачи информации об отсутствии связи с ПУ на SCADу.
Буду благодарен за любую помощь.
Добрый день.
При отсутствии связи драйвер (служба) создающая топики пишет в meta/errror значения, описанные в конвенции, “r” и “w”, напримере при ошибках чтения или записи соответственно.
И, конечно, это значение можно обработать. Описание обработки есть тут: GitHub - wirenboard/wb-rules: Rule engine for Wiren Board
Да, это “типовой” способ, то есть создается витруальное устройстово, в топик кторого при пропадании связи записывается значение, при появлении - сбрасывается или наоборот.
И да, вариант реализации "записать в сам топик какое-то значение, описывающее “ошибочное” состояние - тоже видел и он обсуждался.
То есть записывать в топик самого устройства 0xffff например.
Он, несмотря на кажущуюся простотуу менее удобен и требует большей обработки на другой стороне. В общем именно отдельный топик (modbus TCP регистр) контроля связи - оптимален.
Спасибо за ответ.
К сожалению тяжеловато даётся rules
Подскажите что не так
(прибор /devices/46275347/controls/Total consumption на связи, s_2 должно быть 1, а оно 3)
defineVirtualDevice("MB", {
title: "MB",
cells: {
"s_2": {
type: "value",
value: 1,
},
}
});
defineRule("MB", {
whenChanged: "/devices/46275347/controls/Total consumption#error",
then: function (newValue, devName, cellName) {
if(newValue !== "") {
dev["MB"]["s_2"] = 3;
} else {
dev["MB"]["s_2"] = 1;
}
}
});
devices и controls - подразумаваются, их не надо указывать.
Предполагаю так:
whenChanged: "46275347/Total consumption#error",
Вот тут описано.
И да, сравнение "не равно"выполняется так:
if(newValue != "")
Тут немного про это: Написание скриптов для начинающих — Wiren Board