Стартовая страница › Форумы › Понять, как работает ПО › Модуль Автоуправления — возможности?
- В этой теме 26 ответов, 3 участника, последнее обновление 2 года, 5 месяцев назад сделано
Mikhail.
-
АвторЗаписи
-
26.04.2023 в 14:52 #28347
MikhailМодераторИспользовать out можно в своих вспомогательных методах. Для формулы канала out не подойдёт.
Пожелания записал.10.05.2023 в 11:16 #28487
manjey73УчастникЧто по поводу передачи значения в double представлении с указанием размерности ?
{n} посылает только целое число канала и не указывает «Градусы» например, хотя установлено что 2 знака после запятой показывать в таблице10.05.2023 в 11:20 #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 каждый цикл, то и МАУ должен ловить сработку все время, но он строго повторяет отправку раз в минуту.10.05.2023 в 15:15 #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.
11.05.2023 в 08:46 #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.
11.05.2023 в 13:56 #28501
MikhailМодераторЗначение канала, которое подставляется модулем в текст сообщения, форматируется в соответствии со свойствами канала. Если этого не происходит, нужно проверять актуальность версий Rapid SCADA и модуля, а также создать простейший проект на основе HelloWorld, который воспроизводит проблему.
11.05.2023 в 14:11 #28507
manjey73УчастникТак все последнее, особенно после ложки дегтя с предыдущим МАУ 🙂
Вставляю в текст {n} где в канале установлены Градусы и формат D.D а присылает только целое число. например 22 вместо 22,5(или 22.5)Канал Расчетный/Выходной
11.05.2023 в 14:33 #28510
manjey73УчастникТо, что присылает Телеграм
Температура превышена 22 - 11.05.2023 14:26:09Настройка расчетного канала n (111), данные которого отправляются
Входная формула Val()
Выходная формула SetVal(CnlNum, Cmd)
Формат D.D
Размерность — C (градусы)
Маска архивов и Событий пустоВ канал устанавливает верхняя уставка
В МАУ отправка строкиГРУППА; Температура превышена {111} - {Now}
МАУ реагирует на 1-цу в канале с формулой гистерезиса 0/1 при 1-це выполняет отправку12.05.2023 в 15:00 #28518
MikhailМодераторОшибка при форматировании подтвердилась. Сейчас берётся формат канала, на который реагирует триггер, вместо канала в переменной. Спасибо, что заметили.
Исправление планируется на следующей неделе.19.05.2023 в 11:11 #28604
manjey73УчастникПо поводу {n}, этот момент исправлен? можно уже скачивать снова?
19.05.2023 в 12:14 #28605
MikhailМодераторДа, можно скачать обновление.
22.02.2024 в 12:49 #31192
MikhailМодераторОбновление Модуля автоматического управления, которое пока не выложено на сайт, можно скачать по ссылке. Модуль совместим с Rapid SCADA 6.2.0.
Изменения:
— Переход на .NET 8.0
— Триггер на данные нескольких каналов
— Генерация событий по триггерам
— Добавлен параметр частоты сработки в триггере на изменение данных
— Добавлены переменные для вывода границ канала
— Улучшены фильтры каналов в триггерах на данные и на событие -
Ответ изменён 3 года, 3 месяца назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.