Написание программы с простой логикой

Стартовая страница Форумы Понять, как работает ПО Использование формул Написание программы с простой логикой

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

    Здравствуйте!
    В SCADA как реализовать следующее.
    Задача. Есть двигатель, его включают и выключают. И бывает он сгорает. Необходимо учесть время, которое отработал двигатель. И при замене обнулить счетчик.
    На канал связи подается значение тока двигателя.
    Решение.
    Тут все просто и понятно
    ЕСЛИ Ток> 0 запустить секунда мер.
    Когда Ток = 0 остановить секунда мер.
    Величину что получили Присвоить переменной «Время Работы»
    При замене передать сигнал управления и обнулить переменную «Время Работы»
    Вопрос, SCADA Как в Рапид задать все это?

    #1422
    MikhailMikhail
    Модератор

    Добрый день!
    Подход зависит от того, насколько часто включается и выключается двигатель.
    Опишу вариант, когда это происходит не очень часто — каждый период работы может давать погрешность в 1 минуту.

    Итак, нужно завести входной канал типа Минутный ТИ. Он будет хранить время наработки в минутах. Указать для канала формулу:
    Val(100)>0?Cnl+1:Cnl
    Где 100 — номер канала для измерения тока. Формулу не проверял, если не заработает, напишите здесь.

    Сбросить счётчик можно из интерфейса SCADA-Сервера с помощью генератора текущих значений.

    Если двигатель постоянно включается и отключается, то формулы будут сложнее. Нужно будет отслеживать время включений-отключений и считать разность.

    #1423
    EvgenEvgen
    Участник

    двигатель включают несколько раз в 2 часа.
    Для ПЛК программа выглядит примерно так:
    VAR
    I: REAL;
    R_TRIG_1: R_TRIG;
    Start: TIME;
    F_TRIG_1: F_TRIG;
    Tim_work: TIME;
    END_VAR

    R_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_VAR

    R_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
    Программу еще не подгоняли для реальных условий.

    #1424
    MikhailMikhail
    Модератор

    В Rapid SCADA можно сначала сделать простейший вариант, который я указал выше. Если не устроит по точности, тогда усложнять.

    #1444
    EvgenEvgen
    Участник

    Здравствуйте!
    простая формула не подходит, поскольку двигатель за одни сутки влк/выкл от 10 до 20 раз! а необходимо почитать сколько он наработал за месяц!
    формула подсчета проста.

    Как я понял в администраторе необходимо создать минутный или часовой ТС(в зависимости от того что считаем). Но как сделать что бы время суммировалось и запускался счетчик времени при значении с канала больше «1»?
    Грубо говоря как записать:
    Если «Ток»>1 тогда «Время»=»старт».
    «Время1″=»Время1″+»Время».
    Формула приведенная выше я запустил и буду тестировать, после обеда посмотрю что покажет!

    #1445
    EvgenEvgen
    Участник

    1 как правильно создавать каналы для подсчета времени? он должен быть «до расчетный» или можно и телеизмерения?
    поскольку мы с канала берем значения тока. и анализируем их если двигатель вышел из строя. Когда я изменил c «Телеизмерение» на «До расчетный ТИ» у меня перестали обновляться данные с каналов.

    Основная идея модуля — у Вас срабатывают триггеры, которые Вы создаёте в конфигурации модуля, а в качестве реакции на сработку триггера вызываются любые команды, которые Вы укажете.
    Для учета времени работы двигателя на месяц необходимо сложить все время его работы за период. Как вычислить время работы в каждом цикле пуска? и как сложить временные циклы?
    Триггер срабатывает по переднему фронту изменения канала? или есть возможность измерять по какому фронту выбирать (передний/задний)
    Если так то время работы в цикле посчитать можно по след формуле:
    «Триггер ПрФ»>X «секундомер старт» Триггер ЗДФ» =<X «секундомер стоп»
    а потом просто сложить время за месяц. сутки

    #1446
    MikhailMikhail
    Модератор

    По формуле:
    Если данные канала приходят от устройства — это канал типа Телесигнал или Телеизмерение.
    Если данные канала только вычисляются и не берутся с устройства — это дорасчётный канал.

    Если использовать подход с вычислением разности: время выключения минус время включения, то выбирайте тип канала Дорасчётный ТИ для расчёта времени наработки по каждому агрегату.

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

    Было бы намного проще написать готовые формулы для Вас, но это платная услуга.

    По поводу модуля автоматического управления — заведите, пожалуйста, отдельную тему на форуме. Одна проблема — одна тема. Иначе возникнет путаница.

    #1447
    MikhailMikhail
    Модератор

    Модуль автоматического управления никак не связан с подсчётом времени наработки. Для подсчёта наработки нужны только формулы.

    Модуль автоматического управления позволяет подать команду на устройство, например, что-то включить или выключить при определённых условиях.

    #1448
    EvgenEvgen
    Участник

    а есть подробное описание использования формул?

    #1452
    MikhailMikhail
    Модератор

    Есть в техническом описании http://rapidscada.ru/download/scada_guide_3_ru.pdf на странице 6. Там не очень подробно. Задавайте на форуме конкретные вопросы, например, «Как сделать отдельную функцию, чтобы её можно было использовать в формулах?» или «Как сгенерировать случайное число?», а я отвечу.

    Имею ввиду, что я не придумаю алгоритм за Вас, но разобраться, как в Rapid SCADA записать те или иные математические или логические выражения всегда помогу.

    #1457
    EvgenEvgen
    Участник

    Здравствуйте!
    Есть каналы связи, по ним отслеживаем данные по тону с насосов, двигателей, и др. эл. приборов.
    я создал в администраторе каналы «Часовой ТС» эти каналы считают время работы эл. оборудования.
    необходимо некоторые каналы «Часовой ТС» обнулять раз в месяц, а некоторые раз в месяц и некоторые необходимо обнулять по команде. Как это задать автоматически?
    https://yadi.sk/i/iiHVX7POnmSP2

    #1458
    MikhailMikhail
    Модератор

    Используйте Часовой ТИ, а не Часовой ТС.

    Чтобы обнулить входной канал раз в месяц, умножьте существующую для канала формулу на MonthBeg()
    Для проверки можно умножить на DayBeg() — обнуляет раз в сутки.

    Сбрасывать по команде сложнее:
    1. Нужно завести в таблице формул массив. Для каждого сбрасываемого значения будет отдельный элемент массива.
    2. Для канала управления (для команды) должна быть формула, которая поднимает в этом массиве флаг для нужного сбрасываемого входного канала.
    3. Нужно создать в таблице формул свою функцию для входного канала, которая будет равна 1, если флаг не поднят, и 0, если поднят и сразу сбрасывать флаг.
    4. На созданную в п.3 функцию Вам нужно умножить свой входной канал.

    #1461
    EvgenEvgen
    Участник

    Часовой ТС заменил на Часовой ТИ
    я записывал форму такими способами:
    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> Нормальная работа программы невозможна.

    #1462
    EvgenEvgen
    Участник

    Как правильно умножить

    #1463
    MikhailMikhail
    Модератор

    Прошу меня извинить. Правильно так
    DayBeg() ? 0 : Val(291)>1 ? Cnl+1:Cnl

    Раньше DayBeg возвращала число, но потом стала возвращать bool

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