не понимаю , как правильно сделать таймер TON
вычитал нечто подобное
IN:=Bool;
PT:=Time;
TONInst(IN := VarBOOL1, PT:= T#5s);
Как правильно написать ?(
Вид для печати
не понимаю , как правильно сделать таймер TON
вычитал нечто подобное
IN:=Bool;
PT:=Time;
TONInst(IN := VarBOOL1, PT:= T#5s);
Как правильно написать ?(
Ты что хочешь? создать свой вариант блока TON, или не знаешь как использовать его в ST
Не знаю как правильно его использовать .
Спасибо Большое за разъяснение!
Еще один нубский вопрос , ругается на тип TON;
что можно сделать ?
Для начала сказать как именно ругается.
Ошибка 3740: PLC_PRG : Неизвестный тип 'TON'
Добавить библиотеку Standard.lib в проект.
Глючит таймер. Вроде делаю все ок, ставлю таймер, ставлю время, но когда in становится true, прогресс не идет, переменная et стоит, но иногда проскакивает пара ms. Создание таймера происходит один раз, не в цикле.
Timer: TON;
Timer(IN:=TRUE, PT:=T#10s);
в том то и дело, что один единственный раз устанавливаю и все, таймер не идет
f5 не нажимал, переменные вроде и так обновляются, зато повесил IN:=true на кнопку, те при нажатии true присваивается, и как раз в момент нажатия значение Q и ET обновляется, те работает как f5.
Лол, в общем таймер был в глобальных переменных. Те нужно было каждый раз в начале кода вызывать Timer(PT:=T#10s); ну и когда надо делать Timer_(IN:=TRUE); Похоже на костыль, но препод сказал так надо)
Валенок, я хоть и не очередная девица... но у меня тоже остались проблемы с таймером ТОН (см. тему "Почему не работает TON внутри FB" ) :(( Мне просто кажется что в кодесис есть какой то глюк, который выявить пока не удаётся...
две недели безрезультатно биться с куском кода, который то работает, то нет при том что остальные таймеры в программе заработали сразу без всяких проблем
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 (*àâàðèé Í1- íåò *)
status1.10=FALSE AND (* Í1- ñòîï *)
status2.10=FALSE (* Í2- ñòîï*)
THEN
START_INV(nomer_INV:=1 ); (*çàïóñòèì ; Ï×1*)
ELSIF narab1+narabotkaK>narab2 AND
status2.1=FALSE AND (*Í2- íåò àâàðèé*)
status2.10=FALSE AND (* Í2- STOP *)
status1.10=FALSE (*Í1- STOP *)
THEN
START_INV(nomer_INV:=2 ); (*çàïóñòèì ; Ï×2*)
(*-------------------------- ïóñê ñ õîäà (ïåðåêëþ÷& #229;íèå) ----------------------------*)
ELSIF TRIG_CH12.Q1=TRUE OR (*óæå èä¸ò ïåðåêëþ÷&# 229;íèå
narab1>(narab2+24) AND *)
(narab1+narabotkaK)>(narab2+1) AND (*âðåìåííî ; ÍÀËÀÄÊÀ*)
status2.1=FALSE AND (*Í2- íåò àâàðèé*)
status2.10=FALSE AND (* Í2- STOP *)
status1.10=TRUE AND (*Í1- run *)
pomptimer.IN=FALSE (*íå âêëþ÷åí âòîðîé íàñîñ*)
THEN TRIG_CH12(SET:=TRUE , RESET1:=FALSE); (*ôëàã ïåðåêë-ÿ*)
(*POMP_CH12();
ïëàâíîå ïåðåêëþ÷&# 229;íèå íàñîñîâ ñ 1-ãî íà 2*)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
UST_INV (invustavka:=invust , dk:= Pinv2k, Pinv:=Pinv2, ustavka=>invust2 );
(*Çàïóñòèì ; Ï×2 ñ çàäàííîé ; óñòàâêîé ; *)
CH_time:=T#10s;
IF status2.10=FALSE (* Í2- ñòîï *)
THEN CH_ch:=9;
END_IF
IF status2.1=FALSE AND (*àâàðèé Í2- íåò*)
status2.10=FALSE (* Í2- ñòîï *)
THEN CH_timer(IN:=FALSE);(**)
comword2.14:=TRUE;
comword2.15:=TRUE;
comword2.10:=TRUE; (*çàïóñòèì ; Ï×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; (*ÑÎÎÁÙÈÒ îá ÀÂÀÐÈÈ*)
END_IF
(*Ñíèæàåì ïîýòàïíî ; óñòàâêó Ï×1 (êàæäûé ðàç íà 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:= êîðî÷å (100-CH-ch*10)% :-) *)
CH_ch:=CH_ch-1;
UST_INV (invustavka:=CH_invust , dk:= Pinv1k, Pinv:=Pinv1, ustavka=>invust1 );
(* Pvalue:=invust-Pinv2k ; (*Ðçàäï÷*)
Pvalue:=Pvalue*50/Pinv2 ; (*óñòàâêà äëÿ Ï× 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:= êîðî÷å (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 Ï×1*)
TRIG_CH12(SET:=FALSE , RESET1:=TRUE); (*ñáðîñèì ôëàã ïåðåêëþ÷&# 229;íèÿ*)
CH_timer(IN:=FALSE);
osnovpomp:=2; (*çàïîìíèì ; íîìåð íîâîãî îñíîâíîã&# 238; íàñîñà*)
END_IF
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(*________________________________________________ ________________*)
ELSIF TRIG_CH21.Q1=TRUE OR
(*narab2> (narab1+24) AND*)
(narab1+narabotkaK)<(narab2) AND (*âðåìåííî ; ÍÀËÀÄÊÀ*)
status1.1=FALSE AND (*Í1- íåò àâàðèé*)
status1.10=FALSE AND (*Í1- STOP *)
status2.10=TRUE AND (* Í2- run*)
pomptimer.IN=FALSE (*íå âêëþ÷åí âòîðîé íàñîñ*)
THEN TRIG_CH21(SET:=TRUE , RESET1:=FALSE); (*ôëàã ïåðåêë-ÿ*)
(* POMP_CH21();
ïëàâíîå ïåðåêëþ÷&# 229;íèå íàñîñîâ ñî 2-ãî íà 1*)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
(************************************************* ************************************************** ******)
UST_INV (invustavka:=invust , dk:= Pinv1k, Pinv:=Pinv1, ustavka=>invust1 );
(*Çàïóñòèì ; Ï×1 ñ çàäàííîé ; óñòàâêîé ; *)
CH_time:=t#10s;
IF status1.10=FALSE (*Í1- STOP *)
THEN CH_ch:=9;
END_IF
IF status1.1=FALSE AND (*àâàðèé Í1- íåò*)
status1.10=FALSE AND (*Í1- ñòîï*)
status1.15=FALSE (*Í1- â äèñò.ðåæè& #236;å*)
(**)
THEN CH_timer();
(*CH_timer(IN:=FALSE);*)
comword1.14:=TRUE;
comword1.15:=TRUE;
comword1.10:=TRUE; (*çàïóñòèì ; Ï×1*)
(* CH_timer.IN:=FALSE;*)
CH_timer(IN:=TRUE, PT:=CH_time); (*start timer*)
ELSE comword1.10:= comword1.10; (*ÑÎÎÁÙÈÒ îá ÀÂÀÐÈÈ*)
END_IF
(*Ñíèæàåì ïîýòàïíî ; óñòàâêó Ï×2 (êàæäûé ðàç íà 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:= êîðî÷å (100-CH-ch*10)% :-) *)
CH_ch:=CH_ch-1;
UST_INV (invustavka:=CH_invust , dk:= Pinv2k, Pinv:=Pinv2, ustavka=>invust2 );
(* Pvalue:=invust-Pinv2k ; (*Ðçàäï÷*)
Pvalue:=Pvalue*50/Pinv2 ; (*óñòàâêà äëÿ Ï× 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:= êîðî÷å (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 Ï×2*)
TRIG_CH21(SET:=FALSE , RESET1:=TRUE); (*ñáðîñèì ôëàã ïåðåêëþ÷&# 229;íèÿ*)
CH_timer(IN:=FALSE);
osnovpomp:=1; (*çàïîìíèì ; íîìåð íîâîãî îñíîâíîã&# 238; íàñîñà*)
END_IF
ferret, вот тот участок, который не работает :(. Суть его это останов одного ПЧ, который работает под ПИД и включение другого ПЧ тоже под ПИД (ротация насосов). Таймер отсчитывает время между выдачей пониженой уставки на останавливаемый ПЧ. ПЧ управляются по модбас. К каждому ПЧ подключен свой датчик давления. В этом коде два (зеркальных) переключения С ПЧ на ПЧ. Первый работает когда в режиме отладки "вручную" запускаешь таймер CH_timer. Обратное переключение не работает (тоже пока понять не могу почему)... А так вообще переключение работает. Вставлял одну часть кода в другую часть программы (часть для тестирования) и всё нормально работало.
версия Codesys v2.3.9.41 сборка июль 26,2013
покуда выполнение таймера будет внутри условий, ошибки в его работе будут всегда
Почему? Если программа постоянно заходит в это условие до его полного исполнения
Тогда куда нужно в общей программе вставить вот это CH_timer(); ? Поместить в самом начале?
Меня смущают вызовы в стиле:
CH_timer();
CH_timer(IN:=FALSE);
Получается по два раза вызывается функциональный блок. А что нельзя было в конце кода написать
CH_timer();
А в условиях делать в виде
CH_timer.IN:=TRUE или CH_timer.IN:=FALSE;
Только есть вероятность, что в разных участках кода будут разные значения записываться CH_timer.IN при передаче в таймер тут уж логику нужно подключать или Cross References смотреть...в общем задачка.
ferret, В вашем комментарии ощущается какая то не уверенность... Я делал по разному... Вот это последний вариант, после того как мне дали рекомендацию в моей ветке "Почему не работает TON внутри FB ". Изначально этот зеркальный код планировалось поместить в отдельный ФБ и его вызывать (использовать как подпрограмму), так как этот код понадобиться ещё в паре мест. Но ФБ не заработал вообще :(( И дабы не тратить время, я тупо начал вставлять копии в основную прогу... Длинно, неудобно... А он всё равно не работает :(
Неуверенность только в организации вашей программы и она заключается в том, что нет гарантии, что не выполнится два условия IF. В одном будет команда на запуск таймера, а ниже по коду выполнится другой IF в котором будет команда на останов таймера. В результате будет передаваться в вызов последнее выполненное условие...Как-то так) Но проблема точно не в Codesys.
... грубите, хамите. "А ТС уверен. Уверено копипастит неработающее"- я написал что этот же алгоритм в другой части (в той части где я проверяю разные алгоритмы без работы основного кода) проги этот алгоритм работает. Поэтому я его начал вставлять в основную часть проги. А тут даже в самом начале таймер не запускается. Есть подозрение что проблема связана с задержками при опросе ПЧ по модбас. Не в самом модбасе, а в задержках внутри ПЧ. где то что то не успевает
(*AND bakurov>urovfiremin_ret*) (*ïðîâåðêà ; îñóù-ñÿ â äðóãîì áëîêå*)
THEN" здесь вызов в х.з. каком условии с х.з. каким IN"
Все эти условия долгоиграющие. В данном случае идёт речь о наполненности бака выше минимума. А он однозначно выше....
... не уловил мысль.
CH_timer(); //здесь вызов в х.з. каком условии с х.з. каким IN, вот и начни проверять
Выше писал что уже пробую по разному. Как рекомендуют, что бы вызов блока был всегда пока требуется работа таймера. Уже не знаю как эксперементировать
Попробуйте свой код с таймером сделать на CFC например отдельным POU и вызвать из основной программы.
Всё разобрался! Проблема была в том, что действительно надо продумывать куда вставлять таймер, что бы он постоянно вызывался если он должен отсчитывать время (для меня это было не привычно), так же я не учитывал задержки при управлении частотниками по Модбасу. Были места в программе когда ПЧ ещё не запустился, а я считал что он уже "давно работает". За то время пока разбирался написал более простой код смены насосов. В этом коде как раз и заметил задержки при управлении ПЧ по модбасу. С моей стороны тему можно закрыть. Всем СПАСИБО за помощь!