Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Написание программы с простой логикой
- В этой теме 54 ответа, 3 участника, последнее обновление 8 лет назад сделано Mikhail.
-
АвторСообщения
-
14.01.2016 в 06:54 #1421EvgenУчастник
Здравствуйте!
В SCADA как реализовать следующее.
Задача. Есть двигатель, его включают и выключают. И бывает он сгорает. Необходимо учесть время, которое отработал двигатель. И при замене обнулить счетчик.
На канал связи подается значение тока двигателя.
Решение.
Тут все просто и понятно
ЕСЛИ Ток> 0 запустить секунда мер.
Когда Ток = 0 остановить секунда мер.
Величину что получили Присвоить переменной «Время Работы»
При замене передать сигнал управления и обнулить переменную «Время Работы»
Вопрос, SCADA Как в Рапид задать все это?14.01.2016 в 07:43 #1422MikhailМодераторДобрый день!
Подход зависит от того, насколько часто включается и выключается двигатель.
Опишу вариант, когда это происходит не очень часто — каждый период работы может давать погрешность в 1 минуту.Итак, нужно завести входной канал типа Минутный ТИ. Он будет хранить время наработки в минутах. Указать для канала формулу:
Val(100)>0?Cnl+1:Cnl
Где 100 — номер канала для измерения тока. Формулу не проверял, если не заработает, напишите здесь.Сбросить счётчик можно из интерфейса SCADA-Сервера с помощью генератора текущих значений.
Если двигатель постоянно включается и отключается, то формулы будут сложнее. Нужно будет отслеживать время включений-отключений и считать разность.
14.01.2016 в 08:15 #1423EvgenУчастникдвигатель включают несколько раз в 2 часа.
Для ПЛК программа выглядит примерно так:
VAR
I: REAL;
R_TRIG_1: R_TRIG;
Start: TIME;
F_TRIG_1: F_TRIG;
Tim_work: TIME;
END_VARR_TRIG_1(CLK:= I>0, Q=> );
IF R_TRIG_1.Q THEN
Start:=TIME();
END_IF
F_TRIG_1(CLK:=I>0 , Q=> );
IF F_TRIG_1.Q THEN
Tim_work:=TIME()-Start;
END_IF
VAR
VAR
I: REAL;
R_TRIG_1: R_TRIG;
Start: TIME;
F_TRIG_1: F_TRIG;
Tim_Cycle: TIME; (*Время работы двигателя от последнего пуска*)
END_VAR
VAR RETAIN
Time_Sum: UDINT; (*Время работы двигателя, ИТОГО*)
Cycle: UDINT; (*Число пусков двигателя*)
END_VARR_TRIG_1(CLK:= I>0, Q=> );
IF R_TRIG_1.Q THEN
Start:=TIME();
Cycle:=Cycle+1;
END_IF
F_TRIG_1(CLK:=I>0 , Q=> );
IF F_TRIG_1.Q THEN
Tim_Cycle:=TIME()-Start;
Time_Sum:=Time_Sum + TIME_TO_UDINT(Tim_Cycle)/1000;
END_IF
Программу еще не подгоняли для реальных условий.14.01.2016 в 08:37 #1424MikhailМодераторВ Rapid SCADA можно сначала сделать простейший вариант, который я указал выше. Если не устроит по точности, тогда усложнять.
25.01.2016 в 07:55 #1444EvgenУчастникЗдравствуйте!
простая формула не подходит, поскольку двигатель за одни сутки влк/выкл от 10 до 20 раз! а необходимо почитать сколько он наработал за месяц!
формула подсчета проста.Как я понял в администраторе необходимо создать минутный или часовой ТС(в зависимости от того что считаем). Но как сделать что бы время суммировалось и запускался счетчик времени при значении с канала больше «1»?
Грубо говоря как записать:
Если «Ток»>1 тогда «Время»=»старт».
«Время1″=»Время1″+»Время».
Формула приведенная выше я запустил и буду тестировать, после обеда посмотрю что покажет!25.01.2016 в 09:27 #1445EvgenУчастник1 как правильно создавать каналы для подсчета времени? он должен быть «до расчетный» или можно и телеизмерения?
поскольку мы с канала берем значения тока. и анализируем их если двигатель вышел из строя. Когда я изменил c «Телеизмерение» на «До расчетный ТИ» у меня перестали обновляться данные с каналов.Основная идея модуля — у Вас срабатывают триггеры, которые Вы создаёте в конфигурации модуля, а в качестве реакции на сработку триггера вызываются любые команды, которые Вы укажете.
Для учета времени работы двигателя на месяц необходимо сложить все время его работы за период. Как вычислить время работы в каждом цикле пуска? и как сложить временные циклы?
Триггер срабатывает по переднему фронту изменения канала? или есть возможность измерять по какому фронту выбирать (передний/задний)
Если так то время работы в цикле посчитать можно по след формуле:
«Триггер ПрФ»>X «секундомер старт» Триггер ЗДФ» =<X «секундомер стоп»
а потом просто сложить время за месяц. сутки25.01.2016 в 10:17 #1446MikhailМодераторПо формуле:
Если данные канала приходят от устройства — это канал типа Телесигнал или Телеизмерение.
Если данные канала только вычисляются и не берутся с устройства — это дорасчётный канал.Если использовать подход с вычислением разности: время выключения минус время включения, то выбирайте тип канала Дорасчётный ТИ для расчёта времени наработки по каждому агрегату.
В таблице Формулы, необходимо добавить формулу для массива, который будет хранить время последнего включения. Также нужна формула, которая будет проверять значение тока и если зафиксировано включение, то сохранять время включения в массив. Если двигатель работает, то рассчитывать время наработки.
Было бы намного проще написать готовые формулы для Вас, но это платная услуга.
По поводу модуля автоматического управления — заведите, пожалуйста, отдельную тему на форуме. Одна проблема — одна тема. Иначе возникнет путаница.
25.01.2016 в 10:19 #1447MikhailМодераторМодуль автоматического управления никак не связан с подсчётом времени наработки. Для подсчёта наработки нужны только формулы.
Модуль автоматического управления позволяет подать команду на устройство, например, что-то включить или выключить при определённых условиях.
26.01.2016 в 10:36 #1448EvgenУчастника есть подробное описание использования формул?
26.01.2016 в 12:28 #1452MikhailМодераторЕсть в техническом описании http://rapidscada.ru/download/scada_guide_3_ru.pdf на странице 6. Там не очень подробно. Задавайте на форуме конкретные вопросы, например, «Как сделать отдельную функцию, чтобы её можно было использовать в формулах?» или «Как сгенерировать случайное число?», а я отвечу.
Имею ввиду, что я не придумаю алгоритм за Вас, но разобраться, как в Rapid SCADA записать те или иные математические или логические выражения всегда помогу.
26.01.2016 в 14:06 #1457EvgenУчастникЗдравствуйте!
Есть каналы связи, по ним отслеживаем данные по тону с насосов, двигателей, и др. эл. приборов.
я создал в администраторе каналы «Часовой ТС» эти каналы считают время работы эл. оборудования.
необходимо некоторые каналы «Часовой ТС» обнулять раз в месяц, а некоторые раз в месяц и некоторые необходимо обнулять по команде. Как это задать автоматически?
https://yadi.sk/i/iiHVX7POnmSP226.01.2016 в 14:28 #1458MikhailМодераторИспользуйте Часовой ТИ, а не Часовой ТС.
Чтобы обнулить входной канал раз в месяц, умножьте существующую для канала формулу на MonthBeg()
Для проверки можно умножить на DayBeg() — обнуляет раз в сутки.Сбрасывать по команде сложнее:
1. Нужно завести в таблице формул массив. Для каждого сбрасываемого значения будет отдельный элемент массива.
2. Для канала управления (для команды) должна быть формула, которая поднимает в этом массиве флаг для нужного сбрасываемого входного канала.
3. Нужно создать в таблице формул свою функцию для входного канала, которая будет равна 1, если флаг не поднят, и 0, если поднят и сразу сбрасывать флаг.
4. На созданную в п.3 функцию Вам нужно умножить свой входной канал.27.01.2016 в 10:01 #1461EvgenУчастникЧасовой ТС заменил на Часовой ТИ
я записывал форму такими способами:
Val(291)>1?Cnl+1:Cnl*DayBeg()
Val(291)>1?(Cnl+1:Cnl)*DayBeg(721) (скрин выше)
Val(291)>1?DayBeg(Cnl+1:Cnl)
Val(291)>1?Cnl+1:Cnl?Cnl*DayBeg()
Val(291)>1?Cnl+1:Cnl?Val(721)*DayBeg()
и еще разные варианты рассматривал, каждый раз сервер выдавал следующее
2016-01-27 11:58:39 <PROMETEY><СИСТЕМА><ERR> Нормальная работа программы невозможна.27.01.2016 в 10:01 #1462EvgenУчастникКак правильно умножить
27.01.2016 в 11:20 #1463MikhailМодераторПрошу меня извинить. Правильно так
DayBeg() ? 0 : Val(291)>1 ? Cnl+1:CnlРаньше DayBeg возвращала число, но потом стала возвращать bool
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.