Отсутствие связи с Modbus устройством

Добрый день.
Подскажите как можно реализовать следующую задачу.

Есть прибор учёта 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

супер, спасибо, всё работает отлично

Когда нет связи 3, когда есть связь 2

defineVirtualDevice("MB", { 
    title: "MB",
    cells: {
      "s_2": {
        type: "value",
        value: 1,
      },
	}
});


defineRule("MB", {
  whenChanged: "mercury230ar02_68/Total consumption#error",
  then: function (newValue, devName, cellName) {
    if(newValue !== "") {
      dev["MB"]["s_2"] = 3;
    } else {
      dev["MB"]["s_2"] = 2;
    }
  }
});

Хорошо, рад что смог помочь.

defineVirtualDevice("MB", { 
    title: "MB",
    cells: {
        "s_2": {
            type: "value",
            value: 1,
        },
    }
});

defineRule("CheckConnection", {
    whenChanged: "mercury230ar02_68/Total consumption#error",
    then: function (newValue) {
        if (newValue !== "") {
            dev["MB"]["s_2"] = -100; // нет связи
        } else {
            // Если связь есть, обновляем s_2 значением Total consumption
            dev["MB"]["s_2"] = dev["mercury230ar02_68"]["Total consumption"];
        }
    }
});

defineRule("Update_s2", {
    whenChanged: "mercury230ar02_68/Total consumption",
    then: function (newValue) {
        
            dev["MB"]["s_2"] = newValue; // Сохраняем значение в s_2
        
    }
});
1 лайк