PDA

Просмотр полной версии : TON в St



wecand0it
12.06.2015, 23:14
не понимаю , как правильно сделать таймер TON
вычитал нечто подобное
IN:=Bool;
PT:=Time;
TONInst(IN := VarBOOL1, PT:= T#5s);

Как правильно написать ?(

_Mikhail
12.06.2015, 23:59
Ты что хочешь? создать свой вариант блока TON, или не знаешь как использовать его в ST

wecand0it
13.06.2015, 09:40
Не знаю как правильно его использовать .

Игорюня
13.06.2015, 13:27
Не знаю как правильно его использовать .

var
tm: TON;
end_var

tm(IN := TRUE, PT := T#5s);
IF tm.Q then
...
END_IF;

Вместо TRUE используй любую переменную типа BOOL.

wecand0it
13.06.2015, 14:38
Спасибо Большое за разъяснение!

wecand0it
13.06.2015, 14:43
Еще один нубский вопрос , ругается на тип TON;
что можно сделать ?

Yegor
13.06.2015, 14:55
Для начала сказать как именно ругается.

wecand0it
13.06.2015, 15:09
Ошибка 3740: PLC_PRG : Неизвестный тип 'TON'

Yegor
13.06.2015, 15:11
Добавить библиотеку Standard.lib в проект.

yadro
26.12.2016, 22:49
Глючит таймер. Вроде делаю все ок, ставлю таймер, ставлю время, но когда in становится true, прогресс не идет, переменная et стоит, но иногда проскакивает пара ms. Создание таймера происходит один раз, не в цикле.

Timer: TON;
Timer(IN:=TRUE, PT:=T#10s);

ferret_maybe
27.12.2016, 05:44
Глючит таймер. Вроде делаю все ок, ставлю таймер, ставлю время, но когда in становится true, прогресс не идет, переменная et стоит, но иногда проскакивает пара ms. Создание таймера происходит один раз, не в цикле.

Timer: TON;
Timer(IN:=TRUE, PT:=T#10s);

Видимо в параметр IN, где-то кроме TRUE проскакивает и FALSE;
Вообще вызов функционального блока должен быть один раз, например,
Timer() или Timer(IN:=???) или Timer(IN:=???,PT:=T#10s) и т.д.
а далее можно задавать параметры в виде
Timer.IN:=bool;
Timer.PT:=timeOfTimer;

yadro
29.12.2016, 19:56
в том то и дело, что один единственный раз устанавливаю и все, таймер не идет

capzap
29.12.2016, 20:02
в том то и дело, что один единственный раз устанавливаю и все, таймер не идет

F5 нажимали?

yadro
29.12.2016, 20:48
f5 не нажимал, переменные вроде и так обновляются, зато повесил IN:=true на кнопку, те при нажатии true присваивается, и как раз в момент нажатия значение Q и ET обновляется, те работает как f5.

yadro
20.03.2017, 12:42
Лол, в общем таймер был в глобальных переменных. Те нужно было каждый раз в начале кода вызывать Timer(PT:=T#10s); ну и когда надо делать Timer_(IN:=TRUE); Похоже на костыль, но препод сказал так надо)

RomanB
21.03.2017, 05:40
Валенок, я хоть и не очередная девица... но у меня тоже остались проблемы с таймером ТОН (см. тему "Почему не работает TON внутри FB" ) :(( Мне просто кажется что в кодесис есть какой то глюк, который выявить пока не удаётся...

RomanB
21.03.2017, 05:43
две недели безрезультатно биться с куском кода, который то работает, то нет при том что остальные таймеры в программе заработали сразу без всяких проблем

Вольд
21.03.2017, 08:37
Валенок, я хоть и не очередная девица... но у меня тоже остались проблемы с таймером ТОН (см. тему "Почему не работает TON внутри FB" ) :(( Мне просто кажется что в кодесис есть какой то глюк, который выявить пока не удаётся...

Людей не смешите.

ferret_maybe
21.03.2017, 08:38
две недели безрезультатно биться с куском кода, который то работает, то нет при том что остальные таймеры в программе заработали сразу без всяких проблем
Выложите исходный код программы. Или она настолько "большая"? Какая версия Codesys?

ferret_maybe
21.03.2017, 09:55
http://www.owen.ru/forum/showthread.php?t=26294
Выложено и разжевано. Сами же отметились.
Версии КДС применительно к вопросу вообще никаким боком
Хотел посмотреть что же там такого удивительного) и два раза устанавливать Codesys не хотелось т.к. не знаю поддерживает ли 3-я версия 2-ю.

RomanB
22.03.2017, 16:27
CH_time:=T#10s;



IF workpomp=12 AND
status1.15=FALSE AND (*H1 - Remote*)
status2.15=FALSE (*H2 - Remote*)

(*AND bakurov>urovfiremin_ret*) (*ïðîâåðêà îñóù-ñÿ â äðóãîì áëîêå*)
THEN
CH_timer();
(*-------------------------- ïóñê èç ïîëíîãî îñòàíîâà ---------------------------------*)
IF narab1+narabotkaK<=narab2 AND
status1.1=FALSE AND (*&#224;&#226;&#224;&#240;&#232;&#233; &#205;1- &#237;&#229;&#242; *)
status1.10=FALSE AND (* &#205;1- &#241;&#242;&#238;&#239; *)
status2.10=FALSE (* &#205;2- &#241;&#242;&#238;&#239;*)

THEN
START_INV(nomer_INV:=1 ); (*&#231;&#224;&#239;&#243;&#241;&#242;&#232;&#236; &#207;&#215;1*)


ELSIF narab1+narabotkaK>narab2 AND
status2.1=FALSE AND (*&#205;2- &#237;&#229;&#242; &#224;&#226;&#224;&#240;&#232;&#233;*)
status2.10=FALSE AND (* &#205;2- STOP *)
status1.10=FALSE (*&#205;1- STOP *)

THEN
START_INV(nomer_INV:=2 ); (*&#231;&#224;&#239;&#243;&#241;&#242;&#232;&#236; &#207;&#215;2*)

(*-------------------------- &#239;&#243;&#241;&#234; &#241; &#245;&#238;&#228;&#224; (&#239;&#229;&#240;&#229;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229;) ----------------------------*)
ELSIF TRIG_CH12.Q1=TRUE OR (*&#243;&#230;&#229; &#232;&#228;&#184;&#242; &#239;&#229;&#240;&#229;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229;
narab1>(narab2+24) AND *)
(narab1+narabotkaK)>(narab2+1) AND (*&#226;&#240;&#229;&#236;&#229;&#237;&#237;&#238; &#205;&#192;&#203;&#192;&#196;&#202;&#192;*)
status2.1=FALSE AND (*&#205;2- &#237;&#229;&#242; &#224;&#226;&#224;&#240;&#232;&#233;*)
status2.10=FALSE AND (* &#205;2- STOP *)
status1.10=TRUE AND (*&#205;1- run *)
pomptimer.IN=FALSE (*&#237;&#229; &#226;&#234;&#235;&#254;&#247;&#229;&#237; &#226;&#242;&#238;&#240;&#238;&#233; &#237;&#224;&#241;&#238;&#241;*)

THEN TRIG_CH12(SET:=TRUE , RESET1:=FALSE); (*&#244;&#235;&#224;&#227; &#239;&#229;&#240;&#229;&#234;&#235;-&#255;*)
(*POMP_CH12();
&#239;&#235;&#224;&#226;&#237;&#238;&#229; &#239;&#229;&#240;&#229;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229; &#237;&#224;&#241;&#238;&#241;&#238;&#226; &#241; 1-&#227;&#238; &#237;&#224; 2*)

(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
UST_INV (invustavka:=invust , dk:= Pinv2k, Pinv:=Pinv2, ustavka=>invust2 );

(*&#199;&#224;&#239;&#243;&#241;&#242;&#232;&#236; &#207;&#215;2 &#241; &#231;&#224;&#228;&#224;&#237;&#237;&#238;&#233; &#243;&#241;&#242;&#224;&#226;&#234;&#238;&#233; *)
CH_time:=T#10s;
IF status2.10=FALSE (* &#205;2- &#241;&#242;&#238;&#239; *)
THEN CH_ch:=9;

END_IF
IF status2.1=FALSE AND (*&#224;&#226;&#224;&#240;&#232;&#233; &#205;2- &#237;&#229;&#242;*)
status2.10=FALSE (* &#205;2- &#241;&#242;&#238;&#239; *)
THEN CH_timer(IN:=FALSE);(**)
comword2.14:=TRUE;
comword2.15:=TRUE;
comword2.10:=TRUE; (*&#231;&#224;&#239;&#243;&#241;&#242;&#232;&#236; &#207;&#215;2*)
(*
CH_timer.IN:=FALSE;
CH_timer.PT:=CH_time; (*start timer*)
CH_timer.IN:=TRUE;*)

CH_timer(IN:=TRUE, PT:=CH_time); (* start timer*)

ELSE comword2.10:= comword2.10; (*&#209;&#206;&#206;&#193;&#217;&#200;&#210; &#238;&#225; &#192;&#194;&#192;&#208;&#200;&#200;*)
END_IF

(*&#209;&#237;&#232;&#230;&#224;&#229;&#236; &#239;&#238;&#253;&#242;&#224;&#239;&#237;&#238; &#243;&#241;&#242;&#224;&#226;&#234;&#243; &#207;&#215;1 (&#234;&#224;&#230;&#228;&#251;&#233; &#240;&#224;&#231; &#237;&#224; 10%) *)
CHtimerPT:=CH_timer.ET;
IF
CH_ch >=8 AND CH_timer.Q=TRUE

OR
CH_ch >=2 AND
CH_ch <8 AND
CH_timer.Q=TRUE AND
( (invust2-200)<PIDfeedback2 AND PIDfeedback2<(invust2+100) )

THEN
CH_timer(IN:=FALSE); (*, pt:=CH_time)*)
CH_invust:=(invust-invust/100*(100-CH_ch*10));(*ust:= &#234;&#238;&#240;&#238;&#247;&#229; (100-CH-ch*10)% :-) *)
CH_ch:=CH_ch-1;
UST_INV (invustavka:=CH_invust , dk:= Pinv1k, Pinv:=Pinv1, ustavka=>invust1 );


(* Pvalue:=invust-Pinv2k ; (*&#208;&#231;&#224;&#228;&#239;&#247;*)
Pvalue:=Pvalue*50/Pinv2 ; (*&#243;&#241;&#242;&#224;&#226;&#234;&#224; &#228;&#235;&#255; &#207;&#215; 2*)
invust2:= REAL_TO_WORD (Pvalue*100);
*)
IF CH_ch<8
THEN CH_timer (PT:=CH_time);
ELSE CH_timer (PT:=CH_time*10);
END_IF
CH_timer (IN:=status2.10); (*TRUE start timer*)
CH_timer (IN:=TRUE); (* start timer*)
END_IF
(*
IF
CH_ch >=2 AND
CH_ch <8 AND
CH_timer.Q=TRUE AND
( (invust2-200)<PIDfeedback2 AND PIDfeedback2<(invust2+100) )

THEN
CH_timer(IN:=FALSE); (*, pt:=CH_time)*)
CH_invust:=(invust-invust/100*(100-CH_ch*10));(*ust:= &#234;&#238;&#240;&#238;&#247;&#229; (100-CH-ch*10)% :-) *)
CH_ch:=CH_ch-1;
UST_INV (invustavka:=CH_invust , dk:= Pinv1k, Pinv:=Pinv1, ustavka=>invust1 );

CH_timer (IN:=TRUE, PT:=CH_time); (*start timer*)
END_IF
*)
IF (CH_ch <2 AND CH_timer.Q=TRUE)
THEN
(*CH_timer.IN:=FALSE;*)
comword1.14:=FALSE;
comword1.15:=FALSE;
comword1.10:=FALSE; (*STOP &#207;&#215;1*)
TRIG_CH12(SET:=FALSE , RESET1:=TRUE); (*&#241;&#225;&#240;&#238;&#241;&#232;&#236; &#244;&#235;&#224;&#227; &#239;&#229;&#240;&#229;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255;*)
CH_timer(IN:=FALSE);
osnovpomp:=2; (*&#231;&#224;&#239;&#238;&#236;&#237;&#232;&#236; &#237;&#238;&#236;&#229;&#240; &#237;&#238;&#226;&#238;&#227;&#238; &#238;&#241;&#237;&#238;&#226;&#237;&#238;&#227;&#238; &#237;&#224;&#241;&#238;&#241;&#224;*)

END_IF
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)








(*________________________________________________ ________________*)


ELSIF TRIG_CH21.Q1=TRUE OR
(*narab2> (narab1+24) AND*)
(narab1+narabotkaK)<(narab2) AND (*&#226;&#240;&#229;&#236;&#229;&#237;&#237;&#238; &#205;&#192;&#203;&#192;&#196;&#202;&#192;*)
status1.1=FALSE AND (*&#205;1- &#237;&#229;&#242; &#224;&#226;&#224;&#240;&#232;&#233;*)
status1.10=FALSE AND (*&#205;1- STOP *)
status2.10=TRUE AND (* &#205;2- run*)
pomptimer.IN=FALSE (*&#237;&#229; &#226;&#234;&#235;&#254;&#247;&#229;&#237; &#226;&#242;&#238;&#240;&#238;&#233; &#237;&#224;&#241;&#238;&#241;*)

THEN TRIG_CH21(SET:=TRUE , RESET1:=FALSE); (*&#244;&#235;&#224;&#227; &#239;&#229;&#240;&#229;&#234;&#235;-&#255;*)
(* POMP_CH21();
&#239;&#235;&#224;&#226;&#237;&#238;&#229; &#239;&#229;&#240;&#229;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229; &#237;&#224;&#241;&#238;&#241;&#238;&#226; &#241;&#238; 2-&#227;&#238; &#237;&#224; 1*)

(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
UST_INV (invustavka:=invust , dk:= Pinv1k, Pinv:=Pinv1, ustavka=>invust1 );

(*&#199;&#224;&#239;&#243;&#241;&#242;&#232;&#236; &#207;&#215;1 &#241; &#231;&#224;&#228;&#224;&#237;&#237;&#238;&#233; &#243;&#241;&#242;&#224;&#226;&#234;&#238;&#233; *)
CH_time:=t#10s;
IF status1.10=FALSE (*&#205;1- STOP *)
THEN CH_ch:=9;

END_IF
IF status1.1=FALSE AND (*&#224;&#226;&#224;&#240;&#232;&#233; &#205;1- &#237;&#229;&#242;*)
status1.10=FALSE AND (*&#205;1- &#241;&#242;&#238;&#239;*)
status1.15=FALSE (*&#205;1- &#226; &#228;&#232;&#241;&#242;.&#240;&#229;&#230;&#232;&#236;&#229;*)
(**)
THEN CH_timer();
(*CH_timer(IN:=FALSE);*)
comword1.14:=TRUE;
comword1.15:=TRUE;
comword1.10:=TRUE; (*&#231;&#224;&#239;&#243;&#241;&#242;&#232;&#236; &#207;&#215;1*)
(* CH_timer.IN:=FALSE;*)
CH_timer(IN:=TRUE, PT:=CH_time); (*start timer*)


ELSE comword1.10:= comword1.10; (*&#209;&#206;&#206;&#193;&#217;&#200;&#210; &#238;&#225; &#192;&#194;&#192;&#208;&#200;&#200;*)
END_IF

(*&#209;&#237;&#232;&#230;&#224;&#229;&#236; &#239;&#238;&#253;&#242;&#224;&#239;&#237;&#238; &#243;&#241;&#242;&#224;&#226;&#234;&#243; &#207;&#215;2 (&#234;&#224;&#230;&#228;&#251;&#233; &#240;&#224;&#231; &#237;&#224; 10%) *)
IF
(CH_ch >=8 AND CH_timer.Q=TRUE)

THEN CH_timer();
CH_timer(IN:=FALSE); (*, pt:=CH_time)*)
CH_invust:=(invust-invust/100*(100-CH_ch*10));(*ust:= &#234;&#238;&#240;&#238;&#247;&#229; (100-CH-ch*10)% :-) *)
CH_ch:=CH_ch-1;
UST_INV (invustavka:=CH_invust , dk:= Pinv2k, Pinv:=Pinv2, ustavka=>invust2 );


(* Pvalue:=invust-Pinv2k ; (*&#208;&#231;&#224;&#228;&#239;&#247;*)
Pvalue:=Pvalue*50/Pinv2 ; (*&#243;&#241;&#242;&#224;&#226;&#234;&#224; &#228;&#235;&#255; &#207;&#215; 2*)
invust2:= REAL_TO_WORD (Pvalue*100);
*)
CH_timer (IN:=TRUE, PT:=CH_time*10); (*start timer*)

END_IF

IF
CH_ch >=2 AND
CH_ch <8 AND
CH_timer.Q=TRUE AND
( (invust1-200)<PIDfeedback1 AND PIDfeedback1<(invust1+100) )

THEN CH_timer();
CH_timer(IN:=FALSE); (*, pt:=CH_time)*)
CH_invust:=(invust-invust/100*(100-CH_ch*10));(*ust:= &#234;&#238;&#240;&#238;&#247;&#229; (100-CH-ch*10)% :-) *)
CH_ch:=CH_ch-1;
UST_INV (invustavka:=CH_invust , dk:= Pinv2k, Pinv:=Pinv2, ustavka=>invust2 );

CH_timer (IN:=TRUE, PT:=CH_time); (*start timer*)

END_IF

IF (CH_ch <2 AND CH_timer.Q=TRUE)
THEN CH_timer();
(*CH_timer(IN:=FALSE);*)
comword2.14:=FALSE;
comword2.15:=FALSE;
comword2.10:=FALSE; (*STOP &#207;&#215;2*)
TRIG_CH21(SET:=FALSE , RESET1:=TRUE); (*&#241;&#225;&#240;&#238;&#241;&#232;&#236; &#244;&#235;&#224;&#227; &#239;&#229;&#240;&#229;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255;*)
CH_timer(IN:=FALSE);
osnovpomp:=1; (*&#231;&#224;&#239;&#238;&#236;&#237;&#232;&#236; &#237;&#238;&#236;&#229;&#240; &#237;&#238;&#226;&#238;&#227;&#238; &#238;&#241;&#237;&#238;&#226;&#237;&#238;&#227;&#238; &#237;&#224;&#241;&#238;&#241;&#224;*)

END_IF

RomanB
22.03.2017, 16:36
ferret, вот тот участок, который не работает :(. Суть его это останов одного ПЧ, который работает под ПИД и включение другого ПЧ тоже под ПИД (ротация насосов). Таймер отсчитывает время между выдачей пониженой уставки на останавливаемый ПЧ. ПЧ управляются по модбас. К каждому ПЧ подключен свой датчик давления. В этом коде два (зеркальных) переключения С ПЧ на ПЧ. Первый работает когда в режиме отладки "вручную" запускаешь таймер CH_timer. Обратное переключение не работает (тоже пока понять не могу почему)... А так вообще переключение работает. Вставлял одну часть кода в другую часть программы (часть для тестирования) и всё нормально работало.

RomanB
22.03.2017, 16:42
версия Codesys v2.3.9.41 сборка июль 26,2013

capzap
22.03.2017, 17:44
покуда выполнение таймера будет внутри условий, ошибки в его работе будут всегда

RomanB
22.03.2017, 18:08
Почему? Если программа постоянно заходит в это условие до его полного исполнения
Тогда куда нужно в общей программе вставить вот это CH_timer(); ? Поместить в самом начале?

ferret_maybe
22.03.2017, 18:24
Почему? Если программа постоянно заходит в это условие до его полного исполнения
Тогда куда нужно в общей программе вставить вот это CH_timer(); ? Поместить в самом начале?
Меня смущают вызовы в стиле:
CH_timer();
CH_timer(IN:=FALSE);
Получается по два раза вызывается функциональный блок. А что нельзя было в конце кода написать
CH_timer();
А в условиях делать в виде
CH_timer.IN:=TRUE или CH_timer.IN:=FALSE;
Только есть вероятность, что в разных участках кода будут разные значения записываться CH_timer.IN при передаче в таймер тут уж логику нужно подключать или Cross References смотреть...в общем задачка.

RomanB
22.03.2017, 18:38
ferret, В вашем комментарии ощущается какая то не уверенность... Я делал по разному... Вот это последний вариант, после того как мне дали рекомендацию в моей ветке "Почему не работает TON внутри FB ". Изначально этот зеркальный код планировалось поместить в отдельный ФБ и его вызывать (использовать как подпрограмму), так как этот код понадобиться ещё в паре мест. Но ФБ не заработал вообще :(( И дабы не тратить время, я тупо начал вставлять копии в основную прогу... Длинно, неудобно... А он всё равно не работает :(

ferret_maybe
22.03.2017, 21:52
ferret, В вашем комментарии ощущается какая то не уверенность...
Неуверенность только в организации вашей программы и она заключается в том, что нет гарантии, что не выполнится два условия IF. В одном будет команда на запуск таймера, а ниже по коду выполнится другой IF в котором будет команда на останов таймера. В результате будет передаваться в вызов последнее выполненное условие...Как-то так) Но проблема точно не в Codesys.

RomanB
23.03.2017, 08:55
... грубите, хамите. "А ТС уверен. Уверено копипастит неработающее"- я написал что этот же алгоритм в другой части (в той части где я проверяю разные алгоритмы без работы основного кода) проги этот алгоритм работает. Поэтому я его начал вставлять в основную часть проги. А тут даже в самом начале таймер не запускается. Есть подозрение что проблема связана с задержками при опросе ПЧ по модбас. Не в самом модбасе, а в задержках внутри ПЧ. где то что то не успевает

RomanB
23.03.2017, 08:57
(*AND bakurov>urovfiremin_ret*) (*&#239;&#240;&#238;&#226;&#229;&#240;&#234;&#224; &#238;&#241;&#243;&#249;-&#241;&#255; &#226; &#228;&#240;&#243;&#227;&#238;&#236; &#225;&#235;&#238;&#234;&#229;*)
THEN" здесь вызов в х.з. каком условии с х.з. каким IN"
Все эти условия долгоиграющие. В данном случае идёт речь о наполненности бака выше минимума. А он однозначно выше....

RomanB
23.03.2017, 09:11
... не уловил мысль.
CH_timer(); //здесь вызов в х.з. каком условии с х.з. каким IN, вот и начни проверять
Выше писал что уже пробую по разному. Как рекомендуют, что бы вызов блока был всегда пока требуется работа таймера. Уже не знаю как эксперементировать

melky
23.03.2017, 09:16
Попробуйте свой код с таймером сделать на CFC например отдельным POU и вызвать из основной программы.

RomanB
09.04.2017, 19:21
Всё разобрался! Проблема была в том, что действительно надо продумывать куда вставлять таймер, что бы он постоянно вызывался если он должен отсчитывать время (для меня это было не привычно), так же я не учитывал задержки при управлении частотниками по Модбасу. Были места в программе когда ПЧ ещё не запустился, а я считал что он уже "давно работает". За то время пока разбирался написал более простой код смены насосов. В этом коде как раз и заметил задержки при управлении ПЧ по модбасу. С моей стороны тему можно закрыть. Всем СПАСИБО за помощь!