Модуль Автоуправления — возможности?

Стартовая страница Форумы Понять, как работает ПО Модуль Автоуправления — возможности?

Просмотр 12 сообщений - с 16 по 27 (из 27 всего)
  • Автор
    Записи
  • #28347
    Mikhail
    Модератор

    Использовать out можно в своих вспомогательных методах. Для формулы канала out не подойдёт.
    Пожелания записал.

    #28487
    manjey73
    Участник

    Что по поводу передачи значения в double представлении с указанием размерности ?
    {n} посылает только целое число канала и не указывает «Градусы» например, хотя установлено что 2 знака после запятой показывать в таблице

    #28488
    manjey73
    Участник

    Возможно что-то изменилось в работе формул..
    Вот была старая формула Hysteresys на массивах каналов.

    int[] HysNum = new int[1];
    bool[] Hys = new bool[1];
    public double Hysteresis(double inCnl, double low, double high)
    {
    bool q = Val(CnlNum) > 0;
    
    int res = Array.IndexOf(HysNum, CnlNum);
    if (res == -1)
    {
    res = HysNum.Length;
    Array.Resize(ref HysNum,  res+1);
    Array.Resize(ref Hys,   res+1);
    HysNum[res] = CnlNum;
    Hys[res] = q;
    }
    
    if (inCnl < low) Hys[res] = false;
    if (inCnl > high) Hys[res] = true;
    
    return Convert.ToDouble(Hys[res]);
    }

    Но МАУ почему то срабатывает каждую минуту, никаких повторов нет, задержек нет.
    Формула должна возвращать либо 0, либо 1. Если принять во внимание какую-то ошибку формулы, что происходит изменении значения с 0 в 1 каждый цикл, то и МАУ должен ловить сработку все время, но он строго повторяет отправку раз в минуту.

    #28489
    manjey73
    Участник

    Изменил формулу под словари. ситуация не изменилась…

    // Формула Гистерезиса, возвращает 0 или 1 в канал
    // rezhim = true - Нагрев (по умолчанию), = false - Охлаждение
    
    protected Dictionary<int, bool> ResHys = new Dictionary<int, bool>();
    
    public double Hysteresis(double inCnl, double low, double high, bool rezhim = true)
    {
       bool res = Val() > 0; // получение значения из канала
       if (!ResHys.ContainsKey(CnlNum))
       {
          ResHys.Add(CnlNum, res);
       }
       else
       {
         // res = ResHys[CnlNum];
         if (rezhim)
         {
           if (inCnl < low) res = true;
           if (inCnl > high) res = false;
         }
         else
         {
           if (inCnl < low) res = false;
           if (inCnl > high) res = true;
         }
        ResHys[CnlNum] = res;
        }
        return Convert.ToDouble(ResHys[CnlNum]);
    }
    

    На одном Orange где в качестве входного канала расчетный, типа я сам задаю значение, модуль срабатывает один раз.
    На другом канале, где в качестве входного значения данные из файла, предоставляемые при помощи crontab сработка происходит строго раз в минуту…
    Уже пляшу с бубном и так и эдак. Например формула в канале Гистерезиса

    Hysteresis(Val(150), Val(139), Val(140), false); Stat(150) где Стат(150) это статус входного канала, куда передается температура из файла скрипта.
    В настройках МАУ Значение = 1, Статус 1
    То есть если сам канал будет ноль, но его статус зависит от канала скрипта и не будет 1, то триггер не должен сработать. Но строго раз в минуту он срабатывает…

    • Ответ изменён 3 года, 3 месяца назад пользователем manjey73.
    #28492
    manjey73
    Участник

    Нашел причину такого поведения. Датчик 1Wire читается при помощи скрипта в Linux с записью данных в файл и при помощи формулы в канале, вычитывающие данные из этого файла. Строго раз в минуту происходит смена состояния канала в неактивное состояние.
    В результате МАУ ловит триггер на данные канала и отсылает сообщение в Телегу.

    Модернизировал формулу к виду

    
    // Формула Гистерезиса, возвращает 0 или 1 в канал
    // rezhim = true - Нагрев (по умолчанию), = false - Охлаждение
    
    protected Dictionary<int, bool> ResHys = new Dictionary<int, bool>();
    
    public double Hysteresis(int inCnl, int low, int high, bool rezhim = true)
    {
       bool res = Val() > 0; // получение значения из канала
    
       if (!ResHys.ContainsKey(CnlNum))
       {
          ResHys.Add(CnlNum, res);
       }
       else
       {
          if(Stat(inCnl) == 1)
          {
          res = ResHys[CnlNum];
          if (rezhim)
          {
             if (Val(inCnl) < Val(low)) res = true;
             if (Val(inCnl) > Val(high)) res = false;
          }
          else
          {
             if (Val(inCnl) < Val(low)) res = false;
             if (Val(inCnl) > Val(high)) res = true;
          }
          }
          ResHys[CnlNum] = res;
       }
       return Convert.ToDouble(ResHys[CnlNum]);
    }

    Изменил входные переменные на int для ввода номеров канала и контроль статуса канала.

    В общем МАУ какой-то примитивный, нет настройки фильтрации данных канала, чтобы делать отправку строго определенного состояния триггера и приходится извращаться внутри формул. А значение может пропасть и при чтении датчика например по Modbus.

    По поводу передачи в виде 22,5 С то есть показать и значение как указано в таблице и вывести сразу размерность остается в силе. {n} передает всегда целое число и без размерности.

    • Ответ изменён 3 года, 3 месяца назад пользователем manjey73.
    #28501
    Mikhail
    Модератор

    Значение канала, которое подставляется модулем в текст сообщения, форматируется в соответствии со свойствами канала. Если этого не происходит, нужно проверять актуальность версий Rapid SCADA и модуля, а также создать простейший проект на основе HelloWorld, который воспроизводит проблему.

    #28507
    manjey73
    Участник

    Так все последнее, особенно после ложки дегтя с предыдущим МАУ 🙂
    Вставляю в текст {n} где в канале установлены Градусы и формат D.D а присылает только целое число. например 22 вместо 22,5(или 22.5)

    Канал Расчетный/Выходной

    • Ответ изменён 3 года, 3 месяца назад пользователем manjey73.
    • Ответ изменён 3 года, 3 месяца назад пользователем manjey73.
    #28510
    manjey73
    Участник

    То, что присылает Телеграм

    Температура превышена 22 - 11.05.2023 14:26:09

    Настройка расчетного канала n (111), данные которого отправляются
    Входная формула Val()
    Выходная формула SetVal(CnlNum, Cmd)
    Формат D.D
    Размерность — C (градусы)
    Маска архивов и Событий пусто

    В канал устанавливает верхняя уставка
    В МАУ отправка строки ГРУППА; Температура превышена {111} - {Now}
    МАУ реагирует на 1-цу в канале с формулой гистерезиса 0/1 при 1-це выполняет отправку

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

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

    #28604
    manjey73
    Участник

    По поводу {n}, этот момент исправлен? можно уже скачивать снова?

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

    Да, можно скачать обновление.

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

    Обновление Модуля автоматического управления, которое пока не выложено на сайт, можно скачать по ссылке. Модуль совместим с Rapid SCADA 6.2.0.

    Изменения:
    — Переход на .NET 8.0
    — Триггер на данные нескольких каналов
    — Генерация событий по триггерам
    — Добавлен параметр частоты сработки в триггере на изменение данных
    — Добавлены переменные для вывода границ канала
    — Улучшены фильтры каналов в триггерах на данные и на событие

Просмотр 12 сообщений - с 16 по 27 (из 27 всего)
  • Для ответа в этой теме необходимо авторизоваться.