Стартовая страница › Форумы › Понять, как работает ПО › Формулы › Функции (формулы) для Rapid SCADA
- В этой теме 149 ответов, 17 участников, последнее обновление 1 год, 3 месяца назад сделано
Oleg.
-
АвторСообщения
-
12.02.2024 в 21:45 #31051
Algomus
УчастникОднако, люто дорого..
13.02.2024 в 08:50 #31054
manjey73Участник13.02.2024 в 08:56 #31056
manjey73УчастникВот это вот. А так то находил и другие softPLC решения, но за большие деньги.
Итальянцы — 800 евро
CodeSys лицензия на Raspberry 50 евро + налог.
Дальше как-то не искал.13.02.2024 в 12:35 #31060Algomus
Участник13.02.2024 в 20:30 #31069Algomus
УчастникА что по поводу формулы генератора?
14.02.2024 в 09:44 #31070
manjey73Участник@Algomus ну делать генератор импульса каждый цикл глупо. Ибо все формулы и так выполняются каждый цикл по умолчанию.
Генератор импульса в каждом цикле будет выглядеть примерно так.
в канале №1 импульс
в канале END — обнуление канала №1Все что между можно привязать к импульсу канала №1 — но это то же самое, как просто выполнение формул в цикле самой Scada.
А если с задержкой по таймеру TON то на выход таймера привязывать триггер переднего фронта.
з.ы. надо бы переписать таймеры на словари а не через массивы, руки не доходят…
Вы бы более точно задачу описали с примерами, чтобы понятно стало.14.02.2024 в 13:14 #31071Algomus
Участник__—————-_____ Вх
_____-___-___-______ ВыхТак понятно?) Периодический опрос.
Кстати, под словарем что подразумевается?14.02.2024 в 13:53 #31079
manjey73УчастникСловарь — Dictionary в C#
Вместо массивов для сохранения промежуточных состояний, которые я использовал для формул TON, TOFF и так далее.Не совсем понятно 🙂 или оберните в CODE если положение знаков важно, ну или картинкой нарисуйте и на обменник общедоступный киньте а тут ссылку.
Чтобы формула выполнялась с нужной периодичностью один раз, надо на выходе TON использовать R-Trig и по нему выполнять формулу.
14.02.2024 в 13:55 #31080
manjey73УчастникНу вот что-то типа этого, если запуск таймера и последующий перезапуск пока контролируемый сигнал в лог 1.
Тут вроде даже детектор переднего фронта не нужен.
Больше проблема реализовать автосброс таймера будет. С одной стороны используется обычный TON, с другой стороны формулами надо еще дополнительный вход реализовать.
14.02.2024 в 13:58 #31081
manjey73УчастникВообще в рамках Scada можно написать и сложнее формулы, но к сожалению теряется универсальность применения.
Сейчас в версии 6-ть появились массивы каналов. Возможно применяя их получится сделать более универсальные формулы для таймеров, если описывать определенные правила при их использовании.
Но я еще не пробовал, если честно.14.02.2024 в 15:00 #31082
manjey73УчастникВопрос Михаилу. Как можно получить доступ к элементу массива одного канала из другого канала?
Например есть канал Х, состоящий из 3-х элементов массива (0-1-2). Как из другого канала Y обратиться к элементу 2 канала Х.
Например этот элемент должен быть доступен для записи?14.02.2024 в 16:01 #31083Algomus
Участник14.02.2024 в 16:50 #31087
manjey73Участник14.02.2024 в 17:50 #31089
manjey73УчастникНу собственно вот.
TON Добавил в Скрипты под именем Timers и включил туда сразу Ticks
public static long Ticks() { DateTime now = DateTime.Now; long time = now.Ticks/10000; return time; } int[] TonNum = new int[1]; long[] TonST = new long[1]; bool[] TonFlag = new bool[1]; public double Ton(double TonIn, double TonPT) { long ET = 0L; long ton_pt = Convert.ToInt64(TonPT); bool q = Val(CnlNum) > 0; bool ton_in = TonIn > 0; int res = Array.IndexOf(TonNum, CnlNum); if (res == -1) { res = TonNum.Length; Array.Resize(ref TonNum, res+1); Array.Resize(ref TonST, res+1); Array.Resize(ref TonFlag, res+1); TonNum[res] = CnlNum; } if (!ton_in) { q = false; TonFlag[res] = false; TonST[res] = 0L; } else { if (!TonFlag[res]) { TonFlag[res] = true; TonST[res] = Ticks(); } else { if (!q) ET = Ticks() - TonST[res]; } if (ET >= ton_pt) q = true; } return Convert.ToDouble(q); }NOT скрипт NOT для инвертирования, добавил в Скрипты под общим именем Logic
public double NOT(double val) { bool boolVal = val > 0; return Convert.ToDouble(!boolVal); } public double AND(double in1, double in2) { bool q = false; bool i1 = in1 > 0; bool i2 = in2 > 0; q = i1&&i2; return Convert.ToDouble(q); }Test Ton Timer
Делаем Расчетный/Выходной канал (110 на скрине) для задания времени в миллисекундах
Входная/Выходная формулыVal()/SetVal(CnlNum, Cmd)
Расчетный канал таймера с авто сбросом через NOT
Входная формулаTon(NOT(Val()), Val(110))-
Ответ изменён 2 года, 4 месяца назад пользователем
manjey73.
14.02.2024 в 17:51 #31090
manjey73УчастникВсе скрипты старые из 5-ки. Не переделывал на Словари или иное. Остались на массивах.
-
Ответ изменён 2 года, 4 месяца назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.