Вход

Просмотр полной версии : время задержки выполнения программы



Artyom
08.12.2010, 01:06
Добрый день!

Только начинаю осваивать CoDeDys.
Пишу простенькую программу для обработки аварий с дискретных датчиков и выдачу аварий (с запоминанием и сбросом) на языке ST.
=========
PROGRAM PLC_PRG
VAR
avr1: BOOL := FALSE; (*Температура воды высокая*)
...
END_VAR

IF Hot=FALSE AND avr1=FALSE
THEN avr1:=TRUE; KL8:=FALSE; HA:=TRUE;
ELSIF SA2=TRUE AND Hot=TRUE THEN avr1:=FALSE; HA:=FALSE;
END_IF
...
IF avr1=TRUE OR avr2=TRUE OR avr3=TRUE OR avr4=TRUE OR avr5=TRUE
THEN KL3:=TRUE;
ELSE KL3:=FALSE;
END_IF
...
=========

Но вот какой момент:
Некоторые датчики (к, примеру, напоромеры) после подачи питания
(включения щита) некоторое время "очухиваются" и соответственно пока там нули на контроллере идёт авария.
Хоть и некритично, но всё же для приличия хочется обойти этот момент.
В связи с этим вопросы:
1. Можно ли сделать задержку выполнения основной программы где-то на 6 секунд после начала выполнения? Если да, то как (желательно на языке ST)?
2. Существуют ли фильтры обработки дискретных сигналов?
Ну, например, что бы если дискретных вход был замкнут в течении 1-2 секунды, это была бы авария. Или это пишется вручную?
И есть ли вообще в этом необходимость (из практики)?

Flomaster
08.12.2010, 05:32
почему бы не вынести этот код для обработки аварий в отдельную функцию или фб?
в основной программе сделать таймер, который по завершении 6 секунд будет устанавливать определенный флаг (логическую переменную). если флаг не установлен, то функция (фб) не вызывается. если установлен - то вызывается.

Николаев Андрей
08.12.2010, 11:57
Согласен с flomaster - прелесть ПЛК в том, что изначально не надо закладываться на "расчухивание" датчиков...
В своей программе отслеживаете: если начало программы - запускаю таймер, что то делаю или ничего не делаю... До окончания таймера значение с датчиков считаю таким то. По окончанию таймера проверяю: "датчик расчухался" - использую данные с него... Датчик показывает неправду - авария датчика. Ну и соответственно делаю то то или то то...

Artyom
28.12.2010, 00:26
Итак, шкаф собран (на объект пока не идёт).
Программу (на данный момент) не менял, ждал момента, когда можно будет "вживую" опробовать. Потихоньку испытываю (путём имитации). Так вот, при включении шкафа контроллер секунды 2-3 задумывается, а потом мне выдаёт все те аварии, которые происходят при размыкании.
Хотя:
1. В настройке проекта я все выхода ставил в положение FALSE при запуске.
2. Установил перемычки на все эти аварии (т.е. при включении уже всё
хорошо безо всякой задержки).

lara197a
28.12.2010, 15:02
Установите к при запуске сброс аврий.
VAR
M:BOOL:=TRUE;
M_TRIG:R_TRIG;
END_VAR

В первой строке своей проги инициализируйте функцию
M_TRIG(CLK:= M);
В последней строке
когда M_TRIG.Q равно True,произведите сброс аварий.

Crusash
29.12.2010, 13:19
простейший способ


Var
Power:TON;
END_VAR

Power(IN:=Power_ON,PT:=T#30s);
IF Power.Q THEN
Cheсk_error(); (*проверка датчиков*)
END_IF
....

Power_ON это булева переменная Power status из модуля Statistic в конфигураторе ПЛК, показывающая наличие питания ПЛК...

Можно конечно использовать просто флаг, как предлогал Flomaster или lara197a, и после включения ПЛК, по прошествии некоторого времени его взводить, например так:


VAR
Power:ton;
Power_ON:BOOL:=False;
END_VAR

Power(IN:=TRUE,PT:=T#30s);
Power_ON:=Power.Q;
IF Power_ON Then
Check_error();
end_If
....

но при кратковременном выключении питания ПЛК, менее 10 минут (полагаю что при тестировании интервалы небыли больше), ни флаг, ни таймер не сбросится, программа будет продолжать жить своей жизнью и сигнализировать ошибки (ведь питания на датчиках нет), и при включении ПЛК будет радостно сообщать вам о найденых ошибках..