Сообщение от
igkondrat
Похоже я где-то не до конца уловил логику циклов и таймеров.(Язык ST)
Элементарная программа -
PROGRAM PLC_PRG
VAR
IN_0 AT %IX0.0.0:BOOL;
OUT_0 AT %QX1.0:BOOL;
TIME_OFF:TOF;
END_VAR
Программа -
TIME_OFF(IN:=IN_0, PT:= T#5s);
OUT_0:=TIME_OFF.Q;
При кратковременном сигнале на IN_0 - на 5 секунд загорается OUT_0
Но программа
IF IN_0 THEN
TIME_OFF(IN:=IN_0, PT:= T#5s);
OUT_0:=TIME_OFF.Q;
END_IF;
При замыкании IN_0 - OUT_0 и TIME_OFF.Q постоянно TRUE
Почему OUT_0 через 5 секунд не становится FALSE?
Работа с ПЛК для меня в новику и видимо где то туплю...
Почему? Да по тому, что ФБ TIME_OFF это программа(подпрограмма, если хотите). А так как в Вашей программе нет многозадачности, то и программный код подпрограммы ФБ TIME_OFF будет выполняться и соответственно будут обновляться его внутренние, входные и выходные переменные только в том случае, если в каждом цикле основной программы будет вызываться подпрограмма ФБ TIME_OFF.
А в варианте
Код:
IF IN_0 THEN
TIME_OFF(IN:=IN_0, PT:= T#5s);
OUT_0:=TIME_OFF.Q;
END_IF;
если переменная IN_0:=FALSE, то обращения к таймеру не происходят и он будет в "замороженном" состоянии.
З.Ы. Хотя IF IN_0 THEN... здесь вовсе не нужен, но если все таки хотите его использовать, то хотя бы так
Код:
PROGRAM PLC_PRG
VAR
TIME_OFF:TOF:=(PT:=T#5s);
IN_0: BOOL;
OUT_0: BOOL;
END_VAR
IF IN_0 THEN
TIME_OFF(IN:=1);
ELSE
TIME_OFF(IN:=0);
END_IF;
OUT_0:=TIME_OFF.Q;