PDA

Просмотр полной версии : Использование таймеров



alex1963
20.12.2008, 16:49
Подскажите, как правильно пользоваться таймерами CodeSys в такой ситуации: после выполнения некоторой операции А операция В должна выполняться не ранее чем через 10 с, причем сама операция А может выполняться повторно до истечения этого интервала. Использовать TP не получается: согласно описанию, он, будучи раз запущен, уже ни на что не реагирует.
Если написать так:

delay: TOF:=(PT:=T#10s);

delay(IN:=FALSE);

if condition_for_A then
do_A;
delay(IN:=TRUE);
delay(IN:=FALSE);
end_if
if not delay.Q then
do_B;
end_if

это будет работать? Или delay(IN:=TRUE) / delay(IN:=FALSE) нужно разносить по разным циклам?

Назаров Александр
20.12.2008, 17:49
Естественно разносить, иначе он так и незапустится. При операции А его, когда необходимо, нада запускать и тикакать:

delay: TON:=(PT:=T#10s);

if condition_for_A then
do_A;
delay(IN:=TRUE);
end_if

а в В контролировать и отключать:

if delay.Q then
do_B;
delay(IN:=FALSE);
end_if

alex1963
21.12.2008, 10:58
...
При этом он запустится на первой операции А и отработает, а мне нужно обеспечить задержку от последней ;). Возможно, я не очень понятно объяснил в первом посте - сейчас подредактировал его.

Jeck
21.12.2008, 16:12
А если так?
PROGRAM PLC_PRG
VAR
R_TRIG1: R_TRIG;
RS1: RS;
TON1: TON;
condition_for_A: BOOL;
PUSK_TIME_B: BOOL;
PUSK_B: BOOL;
STOP_B: BOOL:=1;
END_VAR
__________________________

R_TRIG1(CLK:=PUSK_TIME_B );
RS1(SET:=R_TRIG1.Q , RESET1:=STOP_B );
TON1(IN:=RS1.Q1 , PT:=T#10s , Q=>PUSK_B );

IF condition_for_A THEN
TON1(IN:=FALSE );(*это если требуется, что б запуск В был только по последнему А*)
do_A;
IF STOP_B THEN
PUSK_TIME_B:=1;
STOP_B:=0;
END_IF
END_IF

IF PUSK_B THEN
do_B;
PUSK_TIME_B:=0;
STOP_B:=1;
END_IF