Создал программу как функциональный блок.
добавил в тело программы входы и выходы - не работает.
Подскажите балбесу - что не так?
FUNCTION_BLOCK Cicle_TiMeR
VAR_INPUT
start: BOOL;
interval: TIME;
END_VAR
VAR_OUTPUT
//Прошедшее время таймера - индикация
Time_See:TIME;
// Выход 1
OUT1:BOOL;
// Выход 2
OUT2: BOOL;
END_VAR
VAR
TON_gen: TON;
switch: BOOL;
R_TRIG_start: R_TRIG;
END_VAR
_______________________
R_TRIG_start(CLK:= start);
IF R_TRIG_start.Q THEN
TON_gen(IN:= FALSE);
switch:=FALSE;
END_IF
TON_gen(IN:= NOT TON_gen.Q, PT:= interval);
IF TON_gen.Q THEN
switch:=NOT switch;
END_IF
OUT1:=start AND NOT switch;
OUT2:=start AND switch;
Time_See:=TON_gen.ET;
______________________________
Программа
ADSL:=Timer1.OUT1;
ADSR:=Timer1.OUT2;
Timer1.interval:=REAL_TO_TIME (TimeIn)*1000;
Timer1.start:=TRUE;
// Вывод пройденого времени
TimeSee:=TIME_TO_REAL(Timer1.Time_see/1000);
// Правое направление в работе
IF ADSR=TRUE THEN RL1:=FALSE;
END_IF
// Левое направление в работе
IF ADSL=TRUE THEN RL1:=TRUE;
END_IF
Прежде чем обращаться к переменным ФБ, нужно это ФБ вызвать на выполнение, т.е.
сначала
Timer1();
и только потом
ADSL:=Timer1.OUT1;
ADSR:=Timer1.OUT2;
TimeSee:=TIME_TO_REAL(Timer1.Time_see/1000);
Кое что можно совместить, например
Timer1(start:= TRUE, interval:=REAL_TO_TIME (TimeIn)*1000 , OUT1=>ADSL , OUT2=>ADSR );
Захват-1.png
Все в точности как Вы делаете при использовании ФБ из библиотек
Сначала Вы вызываете ФБ
R_TRIG_start(CLK:= start);
А уже затем анализируете выход ФБ
IF R_TRIG_start.Q THEN
..........
Последний раз редактировалось petera; 28.06.2016 в 11:27.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Понял! Все заработало.
Огромная благодарность!
Насколько я понял - данная реализация переключения построена на изменении "ЗНАКА" переменной, посредством подачи сигнала на запуск таймера TON, а затем, как только (через заданный интервал) на выходе Q таймера TON появляется сигнал, происходит сброс входа IN и происходит смена "знака" переменной. И мгновенно снова подается сигнал на вход таймера TON. и так цикл повторяется. Все верно я понял?
Усложнил задачу.
Ситуация следующая:
Необходимо чтобы при включении питания сработал таймер включающий функцию отдувки на заданное время. По окончании данного цикла, включилась левая сторона, по окончании работы левой стороны включился цикл отдувки, затем правая сторона и т.д. (главное чтобы после каждого цикла отдувки включались разные стороны.
ЧТО я опять сделал неправильно и наверное через Ж... реализовал задачу???
Вот функц. блок таймера:
____________________________
FUNCTION_BLOCK Timer_CCL
VAR_INPUT
Start:BOOL;
Interval:TIME;
SwitchIN:BOOL;
END_VAR
VAR_OUTPUT
Signal:BOOL;
CicleON:BOOL;
SwitchOUT:BOOL;
TimeSee:REAL;
END_VAR
VAR
//Триггер
R_TRIG_start: R_TRIG;
//Таймер TON
TON_GEN:TON;
END_VAR
_____________________________
TON_gen(IN:= Start, PT:= interval);
IF TON_gen.Q THEN (*если пришел импульс от таймера*)
Start:=FALSE;
SwitchOUT:=NOT SwitchIN; (* Переключение входной функции на противоположный знак*)
END_IF
// Вывод пройденного времени
TimeSee:=TIME_TO_REAL(TON_gen.ET/1000);
//Включение Цикла во время работы таймера
CicleON:=start AND NOT TON_gen.Q; (*Сигнал пока таймер работает*)
//Подача сигнала из выхода таймера на вывод "Signal" из блока
Signal:=TON_GEN.Q;
______________________________
Само тело программы
IF PWR THEN
IF Start=FALSE THEN Timer_SDUV(Start:=NOT Start, Interval:=REAL_TO_TIME(TimeInSduv*1000), SwitchIN:=Start, Signal=>SignalC, CicleON=>Otduv, SwitchOUT=>Start, TimeSee=>TimeSeeSduv);
ELSE
Cicle(Start:=SignalC, Interval:=REAL_TO_TIME(TimeInCicle*1000), SwitchIN:=Switch, Signal=>SignalO, CicleON=>ADS, SwitchOUT=>Switch, TimeSee=>TimeSeeCicle);
Timer_SDUV(Start:=SignalO, Interval:=REAL_TO_TIME(TimeInSduv*1000), Signal=>SignalC, CicleON=>Otduv, TimeSee=>TimeSeeSduv);
END_IF
ADSL:=ADS AND switch;
ADSR:=ADS AND NOT switch;
ELSE START:=FALSE; RL1:=FALSE; RL2:=FALSE; RL3:=FALSE; RL4:=FALSE; RL5:=FALSE; RL6:=FALSE; RL7:=FALSE;
END_IF
_____________________________
так подойдет?
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Заменил в теле программы "IF PWR THEN
IF Start=FALSE THEN Timer_SDUV(Start:=NOT Start, Interval:=REAL_TO_TIME(TimeInSduv*1000), SwitchIN:=Start, Signal=>SignalC, CicleON=>Otduv, SwitchOUT=>Start, TimeSee=>TimeSeeSduv);
на
R_TRIG_START.CLK:=FALSE;
IF PWR THEN
R_TRIG_START(CLK:=PWR, Q=>SignalC);
Cicle(Start:=SignalC, Interval:=REAL_TO_TIME(TimeInCicle*1000), SwitchIN:=Switch, Signal=>SignalO, CicleON=>ADS, SwitchOUT=>Switch, TimeSee=>TimeSeeCicle);
Timer_SDUV(Start:=SignalO, Interval:=REAL_TO_TIME(TimeInSduv*1000), Signal=>SignalC, CicleON=>Otduv, TimeSee=>TimeSeeSduv);
ADSL:=ADS AND NOT switch;
ADSR:=ADS AND switch;
ENF_IF
....
Все равно циклы не запускаются....
Последний раз редактировалось Ger4sim; 28.06.2016 в 21:26.
в простом редакторе откройте
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран