Значения разных каналов на один тревожный.

Стартовая страница Форумы Понять, как работает ПО Значения разных каналов на один тревожный.

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Автор
    Сообщения
  • #18766
    advirds
    Участник

    Ситуация следующая:
    В плагине «Карты» есть такой параметр, как <StatusCnlNum>.
    Он позволяет менять цвет маркера объекта на карте при значении, отличном от нуля. Это дает зрительную индикацию, например, аварии.
    Канал для этого параметра можно выставить один и только.

    Внимание, вопрос. Каким образом можно собрать «тревожный» канал, который будет менять свое значение в случае изменения значений других каналов на определенные.
    Например:
    Открытый геркон, значение = 0
    Датчик протечки, значение = 1
    Включенный свет, значение = 1
    Отсутствие питания на ЭМ замок, значение = 0

    Плагин автоматизации должен исправить ситуацию, но очень так костыльно, на мой взгляд.
    Хотелось бы узнать у опытных как это реализовать с помощью формул.

    • Эта тема была изменена 3 года, 1 месяц назад от advirds.
    #18771
    a80808
    Участник

    Я правильно понимаю, что каждая из тревог на своем канале ТС?
    Тогда (например):
    Открытый геркон, канал 101;
    Датчик протечки, канал 102;
    Включенный свет, канал 103;
    Отсутствие питания на ЭМ замок, канал 104;
    «Результирующий» канал, канал 100:
    — канал 101 = 0 — канал 100 = 1ххх, канал 101 = 1 — канал 100 = 2ххх;
    — канал 102 = 0 — канал 100 = х1хх, канал 101 = 1 — канал 100 = х2хх;
    — канал 103 = 0 — канал 100 = хх1х, канал 101 = 1 — канал 100 = хх2х;
    — канал 104 = 0 — канал 100 = ххх1, канал 101 = 1 — канал 100 = ххх2

    Формула (очень корявая, писал навскидку :)):

    double SetAlarmEx(int RedSwitch, int Leak, int Light, int Power, int Result)
    {
    double Alarm = 0;
    switch(RedSwitch)
    {
    case 0:
    Alarm = 1000;
    break;
    case 1:
    Alarm = 2000;
    break;
    default:
    Sum = 0;
    break;
    }
    switch(Leak)
    {
    case 0:
    Alarm = Alarm + 100;
    break;
    case 1:
    Alarm = Alarm + 200;
    break;
    default:
    Sum = Sum;
    break;
    }
    switch(Light)
    {
    case 0:
    Alarm = Alarm + 10;
    break;
    case 1:
    Alarm = Alarm + 20;
    break;
    default:
    Sum = Sum;
    break;
    }
    switch(Power)
    {
    case 0:
    Alarm = Alarm + 1;
    break;
    case 1:
    Alarm = Alarm + 2;
    break;
    default:
    Sum = Sum;
    break;
    }
    SetVal(Result, Alarm);
    }

    Вызов в любом из каналов (101, 102, 103, 104):

    SetAlarmEx(101, 102, 103, 104, 100)

    Как то так…

    #18772
    manjey73
    Участник

    В идеале бы написать формулу, которая была бы универсальной.

    Например один результирующий канал, привязанный к карте (метка1) скажем номер 100
    Проверяемые каналы 97, 98, 99
    Формула для канала 100 выглядит SetAlarmEx(Val(97), Val(98), Val(99))

    Следующая метка для карты №2 канал 110, проверяемые каналы 101, 102, 103, 104, 105
    Формула SetAlarmEx(Val(101), Val(102), Val(103), Val(104), Val(105))

    Может я чего не знаю, но вроде в функциях языка нельзя объявить неизвестное количество переменных.

    Можно было бы сделать так SetAlarmEx(double[]) а в канале объявлять как
    SetAlarmEx(new double[] {Val(101), Val(102), Val(103), Val(104), Val(105) })

    Тогда формула была бы универсальной, но каждый раз придется объявлять массив. Может есть какой-то способ обойти это и вводить как в первом варианте ?

    #18776
    a80808
    Участник

    Я в таких случаях каждый раз писал свою формулу 🙁

    #18777
    manjey73
    Участник

    double AlarmMap(params double[] values)
    {
    Тут делаем проверки массива параметров каналов и возвращаем 1 если хоть один из параметров говорит об ошибке
    }

    #18778
    a80808
    Участник

    Тело формулы каждый раз переписывать придется, а так мне идея нравится 🙂
    Вот еще бы привязать как то исполнение формулы к изменению параметра…чтобы лишнего не считать

    #18779
    manjey73
    Участник

    Не придется, там массив, если принять, что 1 для любого входного канала это ошибка, то и на выходе 1.

    Если каналы при ошибке имеют значение 0, то предварительно их надо инвертировать.
    Все. Маленькая универсальная формула для битовых вариантов.

    А вот если надо по цифровым значениям, то уже будет сложнее

    #18780
    a80808
    Участник

    Там похоже цифры…хотя никто не мешает сразу на входном канале поиграть со статусами

    #18788
    manjey73
    Участник

    Да, можно сделать формулу как под значение так и под статус. Смысл моего предложения был в том, чтобы формула была одна, или две (или одна но с настройкой под каналы или под статусы)
    И не пришлось городить под каждый маркер свою формулу.

    Еще момент, карты еще не ставил на посмотреть, только скрины advirds показывал.
    Суть. Статус Аварии должен быть гибридным.
    1. Понимать канал
    2. понимать статусы каналов, которые мы добавляем к маркеру
    3. Иметь настройку — только аварийный канал, аварийный и статусы каналов, только статусы каналов
    Каналы, добавляемые к маркеру должны иметь статусы Предупреждение, Авария
    То есть указываем на каких значениях больше или меньше зажечь предупреждение «Желтый маркер» и на каких аварию «Красный маркер»

    Ну это больше разработчику, добавить в плагин карт и не городить кучу формул…

    #18800
    Mikhail
    Модератор

    Добавлю от себя:
    1. Нужно создать канал типа Дорасчётный ТИ.
    2. Для канала потребуется написать формулу, например, double MyLocationStatus()
    3. Что будет внутри формулы, зависит от логики расчёта. Вряд ли получится сделать одну формулу на все случаи жизни.

    #18801
    Mikhail
    Модератор

    Из документации:
    StatusCnlNum — номер входного канала, который означает статус данного объекта; 0 — канал не задан; положительное значение канала — объект в норме, иначе — объект требует внимания,

    #18821
    a80808
    Участник

    Коллеги, может поздно, но я не совсем понимаю — а зачем сводить все тревоги в один канал? Если потом на схеме отображать состояние этих датчиков (например динамическим рисунком с коллекцией) то удобнее разные каналы…

    #18822
    manjey73
    Участник

    a80808 потому что канал, на который реагирует маркер плагина Карты, если я правильно понял, в единственном числе. 🙂

    #18823
    a80808
    Участник

    Ну если для Карт… 🙂

    #18833
    advirds
    Участник

    Цвет метки меняется при статусе «Обратить внимание» только при значении, отличном от нуля ОДНОГО канала.
    Грубо говоря, диспетчеру необходимо обращать внимание на красные метки на карте.
    А вот причин «Покраснеть» у каждой метки может быть несколько.

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Вы должны авторизироваться для ответа в этой теме.