PDA

Просмотр полной версии : Таймеры TON TOF в ST



Veronik
09.12.2018, 18:54
Подскажите, пожалуйста, Что не так делаю, почему не происходит задержка по времени?

IF y<200 THEN
MY_TON(IN:=Start, PT:= T#2000MS);
MY_TOF(IN:=Start,PT:= T#2000MS);
IF MY_TON.Q OR MY_TOF.Q THEN
IF x<20 THEN
x:=x+2;
ELSE
y:=y+20;
x:=0;
END_IF
END_IF
Start:=NOT Start;
END_IF

lara197a
09.12.2018, 19:14
В эмуляции или онлайн проверьте. У Вас там куча условий. Видимо какие-то взаимоисключают следующие. Если условие не исполняется, то, что внутри не обрабатывается.
К примеру второй иф никогда не наступит.
Вы Start все время сбрасываете

Veronik
09.12.2018, 21:01
Второй иф срабатывает, и срабатывает когда нужно, в этом то как раз проблем нет)
просто я проверяю и, мне кажется, что все должно работать и именно с задержкой, но почему т нет

lara197a
09.12.2018, 22:11
Я же вам написал. что после того, как условие не выполняется, то, что внутри (таймер в т.ч) внутри больше не обрабатывается.
т.е. таймер остается в состоянии неопределенном. Или продолжает отсчет до заданного или не начинает.
смотрите в отладке. там все видно.

Точнее остается в состоянии последнего вызова.

Veronik
10.12.2018, 20:09
может, я совсем не понимаю таймеры, но я не понимаю почему не срабатывает, независимо от того выполняется условие первый раз или нет таймер ни разу не срабатывает.
Если Вас не очень затруднит, может, Вы подскажите как исправить код, чтобы сработало?

Andrew_Stranger
10.12.2018, 21:16
может, я совсем не понимаю таймеры, но я не понимаю почему не срабатывает, независимо от того выполняется условие первый раз или нет таймер ни разу не срабатывает.
Если Вас не очень затруднит, может, Вы подскажите как исправить код, чтобы сработало?

Какую задержку вы хотите получить? Что есть такое Start:=NOT Start?; Лучше вообще таймеры за условия выносить.
К примеру
TON();
If (условие старта ) then
Ton.in:=True;
end_if;
If (условие стопа) then
Ton.in:=False;
end_if;

Veronik
10.12.2018, 21:45
Какую задержку вы хотите получить? Что есть такое Start:=NOT Start?; Лучше вообще таймеры за условия выносить.
К примеру
TON();
If (условие старта ) then
Ton.in:=True;
end_if;
If (условие стопа) then
Ton.in:=False;
end_if;

мне необходимо чтобы ВСЕГДА при выполнении условия вызывалась задержка, программа работает циклически
как я это вижу
IF y<200 THEN(*если y<200, то срабатывают таймеры TON, TOF и происходит задержка*)
MY_TON(IN:=Start, PT:= T#2000MS);
MY_TOF(IN:=Start,PT:= T#2000MS);
IF MY_TON.Q OR MY_TOF.Q THEN(*если таймеры сработали выполняется *)
IF x<20 THEN
x:=x+2;
ELSE
y:=y+20;
x:=0;
END_IF
END_IF
Start:=NOT Start;(*как я понимаю чтобы в следующем цикле сработали снова таймеры необходимо false на true поменять и наоборот*)
END_IF

Andrew_Stranger
10.12.2018, 23:46
Если вам сложно разобраться, начните сперва с одного условия и одного таймера, зачем себя в тупик заводить. False на true надо менять по какому то условию, к примеру y>200.