Просмотр полной версии : 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
Не знаю как правильно его использовать .
Не знаю как правильно его использовать .
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;
что можно сделать ?
Для начала сказать как именно ругается.
wecand0it
13.06.2015, 15:09
Ошибка 3740: PLC_PRG : Неизвестный тип 'TON'
Добавить библиотеку Standard.lib в проект.
Глючит таймер. Вроде делаю все ок, ставлю таймер, ставлю время, но когда 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;
в том то и дело, что один единственный раз устанавливаю и все, таймер не идет
в том то и дело, что один единственный раз устанавливаю и все, таймер не идет
F5 нажимали?
f5 не нажимал, переменные вроде и так обновляются, зато повесил IN:=true на кнопку, те при нажатии true присваивается, и как раз в момент нажатия значение Q и ET обновляется, те работает как f5.
Лол, в общем таймер был в глобальных переменных. Те нужно было каждый раз в начале кода вызывать Timer(PT:=T#10s); ну и когда надо делать Timer_(IN:=TRUE); Похоже на костыль, но препод сказал так надо)
Валенок, я хоть и не очередная девица... но у меня тоже остались проблемы с таймером ТОН (см. тему "Почему не работает TON внутри FB" ) :(( Мне просто кажется что в кодесис есть какой то глюк, который выявить пока не удаётся...
две недели безрезультатно биться с куском кода, который то работает, то нет при том что остальные таймеры в программе заработали сразу без всяких проблем
Валенок, я хоть и не очередная девица... но у меня тоже остались проблемы с таймером ТОН (см. тему "Почему не работает 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-ю.
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*)
(*-------------------------- ïóñê ñ õîäà (ïåðåêëþ÷åíèå) ----------------------------*)
ELSIF TRIG_CH12.Q1=TRUE OR (*óæå èä¸ò ïåðåêëþ÷åíèå
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();
ïëàâíîå ïåðåêëþ÷åíèå íàñîñîâ ñ 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); (*ñáðîñèì ôëàã ïåðåêëþ÷åíèÿ*)
CH_timer(IN:=FALSE);
osnovpomp:=2; (*çàïîìíèì íîìåð íîâîãî îñíîâíîãî íàñîñà*)
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();
ïëàâíîå ïåðåêëþ÷åíèå íàñîñîâ ñî 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- â äèñò.ðåæèìå*)
(**)
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); (*ñáðîñèì ôëàã ïåðåêëþ÷åíèÿ*)
CH_timer(IN:=FALSE);
osnovpomp:=1; (*çàïîìíèì íîìåð íîâîãî îñíîâíîãî íàñîñà*)
END_IF
ferret, вот тот участок, который не работает :(. Суть его это останов одного ПЧ, который работает под ПИД и включение другого ПЧ тоже под ПИД (ротация насосов). Таймер отсчитывает время между выдачей пониженой уставки на останавливаемый ПЧ. ПЧ управляются по модбас. К каждому ПЧ подключен свой датчик давления. В этом коде два (зеркальных) переключения С ПЧ на ПЧ. Первый работает когда в режиме отладки "вручную" запускаешь таймер CH_timer. Обратное переключение не работает (тоже пока понять не могу почему)... А так вообще переключение работает. Вставлял одну часть кода в другую часть программы (часть для тестирования) и всё нормально работало.
версия Codesys v2.3.9.41 сборка июль 26,2013
покуда выполнение таймера будет внутри условий, ошибки в его работе будут всегда
Почему? Если программа постоянно заходит в это условие до его полного исполнения
Тогда куда нужно в общей программе вставить вот это 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 смотреть...в общем задачка.
ferret, В вашем комментарии ощущается какая то не уверенность... Я делал по разному... Вот это последний вариант, после того как мне дали рекомендацию в моей ветке "Почему не работает TON внутри FB ". Изначально этот зеркальный код планировалось поместить в отдельный ФБ и его вызывать (использовать как подпрограмму), так как этот код понадобиться ещё в паре мест. Но ФБ не заработал вообще :(( И дабы не тратить время, я тупо начал вставлять копии в основную прогу... Длинно, неудобно... А он всё равно не работает :(
ferret_maybe
22.03.2017, 21:52
ferret, В вашем комментарии ощущается какая то не уверенность...
Неуверенность только в организации вашей программы и она заключается в том, что нет гарантии, что не выполнится два условия IF. В одном будет команда на запуск таймера, а ниже по коду выполнится другой IF в котором будет команда на останов таймера. В результате будет передаваться в вызов последнее выполненное условие...Как-то так) Но проблема точно не в Codesys.
... грубите, хамите. "А ТС уверен. Уверено копипастит неработающее"- я написал что этот же алгоритм в другой части (в той части где я проверяю разные алгоритмы без работы основного кода) проги этот алгоритм работает. Поэтому я его начал вставлять в основную часть проги. А тут даже в самом начале таймер не запускается. Есть подозрение что проблема связана с задержками при опросе ПЧ по модбас. Не в самом модбасе, а в задержках внутри ПЧ. где то что то не успевает
(*AND bakurov>urovfiremin_ret*) (*ïðîâåðêà îñóù-ñÿ â äðóãîì áëîêå*)
THEN" здесь вызов в х.з. каком условии с х.з. каким IN"
Все эти условия долгоиграющие. В данном случае идёт речь о наполненности бака выше минимума. А он однозначно выше....
... не уловил мысль.
CH_timer(); //здесь вызов в х.з. каком условии с х.з. каким IN, вот и начни проверять
Выше писал что уже пробую по разному. Как рекомендуют, что бы вызов блока был всегда пока требуется работа таймера. Уже не знаю как эксперементировать
Попробуйте свой код с таймером сделать на CFC например отдельным POU и вызвать из основной программы.
Всё разобрался! Проблема была в том, что действительно надо продумывать куда вставлять таймер, что бы он постоянно вызывался если он должен отсчитывать время (для меня это было не привычно), так же я не учитывал задержки при управлении частотниками по Модбасу. Были места в программе когда ПЧ ещё не запустился, а я считал что он уже "давно работает". За то время пока разбирался написал более простой код смены насосов. В этом коде как раз и заметил задержки при управлении ПЧ по модбасу. С моей стороны тему можно закрыть. Всем СПАСИБО за помощь!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot