PDA

Просмотр полной версии : Ton не сбрасывается!



kanava
01.10.2008, 13:49
пишу такой код:
myTON(IN:= TRUE ,PT:=t#5s);

IF myTON.Q=TRUE THEN

(* Vikl *)
DO2e:= 0; DO2f:= 0; ; (* Wo2*)
DO3e:=0; DO3f:= 0; ; DO3i:= 0; (* Wo3*)
DO4a:= 0; DO4b:= 0; DO4c:= 0; DO4d:= 0; DO4e:= 0; DO4k:= 0; (* Wo4*)
myTON.IN:= FALSE;
END_IF;


в начале запускается счетчик, выход Q через 5 секунд переходит в TRUE, но при IN = FALSE счетчик должен сбрасыватся. А он не сбрасывается ... В чем косяк ? Запускаю прогу режиме симуляции .

Kirill
01.10.2008, 14:32
В чем косяк ? Запускаю прогу режиме симуляции .

Ошибка в том, что вы изменяете только состояние входа, а к самому экземпляру ФБ более не обращаетесь, потому он и не сбрасывается. Правильнее было бы так:

myTON(IN:= TRUE ,PT:=t#5s);

IF myTON.Q=TRUE THEN

(* Vikl *)
DO2e:= 0; DO2f:= 0; ; (* Wo2*)
DO3e:=0; DO3f:= 0; ; DO3i:= 0; (* Wo3*)
DO4a:= 0; DO4b:= 0; DO4c:= 0; DO4d:= 0; DO4e:= 0; DO4k:= 0; (* Wo4*)
myTON(IN:= false ,PT:=T#5s);
END_IF;

kanava
01.10.2008, 15:02
Ошибка в том, что вы изменяете только состояние входа, а к самому экземпляру ФБ более не обращаетесь, потому он и не сбрасывается. Правильнее было бы так:

myTON(IN:= TRUE ,PT:=t#5s);

IF myTON.Q=TRUE THEN

(* Vikl *)
DO2e:= 0; DO2f:= 0; ; (* Wo2*)
DO3e:=0; DO3f:= 0; ; DO3i:= 0; (* Wo3*)
DO4a:= 0; DO4b:= 0; DO4c:= 0; DO4d:= 0; DO4e:= 0; DO4k:= 0; (* Wo4*)
myTON(IN:= false ,PT:=T#5s);
END_IF;


А щас в чем ошибка ?

CASE RO OF
0: (* Vkl*)
CH1:=CH1+1; // CH переменная нужна для не повторения запуска таймера
DO8a:= 1; DO8b:= 1;


IF CH1=1 THEN // Запуск таймера если CH1=1
myTON(IN:= TRUE ,PT:=t#5s);
END_IF;
IF myTON.Q THEN

(* Vikl *)
DO2e:= 0; DO2f:= 0; ; (* Wo2*)
myTON(IN:= FALSE) ; // сбрасываем счетчик

END_IF
IF CH1>20 THEN CH1:=2 END_IF;
1: (*Vkl*)
CH1:=0;
DO8a:= 1;
END_CASE;

Логвиненко Андрей
02.10.2008, 23:08
Значение выходных переменных обновляется только после вызова ФБ,
таймер запускается по фронту IN, повторный вызов с IN:=true к перезапуску не приводит. Для перезапуска надо сначала выполнить вызов с
IN:=false, затем снова с IN:=true.

Должно быть так:

CASE RO OF
0: (* Vkl*)
CH1:=CH1+1; // CH переменная нужна для не повторения запуска таймера
DO8a:= 1; DO8b:= 1;


IF CH1=1 THEN // Запуск таймера если CH1=1
myTON(IN:= TRUE ,PT:=t#5s);
END_IF;

myTON(); (*вызов ФБ для обновления переменных *)

IF myTON.Q THEN

(* Vikl *)
DO2e:= 0; DO2f:= 0; ; (* Wo2*)
myTON(IN:= FALSE) ; // сбрасываем счетчик

END_IF
IF CH1>20 THEN CH1:=2 END_IF;
1: (*Vkl*)
CH1:=0;
DO8a:= 1;
END_CASE;