PDA

Просмотр полной версии : Таймер с паузой



skinnbatter
21.09.2016, 00:27
Товарищи доброе время суток!
Я новичок в Codesys :)
Хотел поинтересоваться есть ли в codesys таймер TON с паузой. (под паузой подразумевается остановка времени отсчёта и возобновление после команды по входу )
Если нет то подскажите как его организовать на ST?
Заранее благодарен

Эдуард_Н
21.09.2016, 04:18
здесь посмотрите http://www.owen.ru/forum/showthread.php?t=7077

capzap
21.09.2016, 07:37
Товарищи доброе время суток!
Я новичок в Codesys :)
Хотел поинтересоваться есть ли в codesys таймер TON с паузой. (под паузой подразумевается остановка времени отсчёта и возобновление после команды по входу )
Если нет то подскажите как его организовать на ST?
Заранее благодарен

для ТON время отсчета включения с задержкой увеличить на время паузы? Так не легче после паузы сброшенный таймер запустить по новой, у него же до этого момента всёравно выход "потушен"

skinnbatter
26.09.2016, 00:52
для ТON время отсчета включения с задержкой увеличить на время паузы? Так не легче после паузы сброшенный таймер запустить по новой, у него же до этого момента всё равно выход "потушен"

С таймером разобрался как на CFC написать.Но всё же хочется увидеть как это будет на ST выглядеть, хотя бы пару основных строк.

capzap
26.09.2016, 06:51
да в каждом втором вложении на этом форуме есть пример использования таймеров

zendo057
26.09.2016, 08:21
Товарищи доброе время суток!
Я новичок в Codesys :)
Хотел поинтересоваться есть ли в codesys таймер TON с паузой. (под паузой подразумевается остановка времени отсчёта и возобновление после команды по входу )
Если нет то подскажите как его организовать на ST?
Заранее благодарен

Время которое вы задаете в TON отсчитывает контроллер,что бы его остановить нужно сделать СТОП программе.

skinnbatter
25.10.2016, 13:50
Время которое вы задаете в TON отсчитывает контроллер,что бы его остановить нужно сделать СТОП программе.

можно готовый пример на ST ? если возможно...

melky
25.10.2016, 14:07
Вы хоть покажите как на CFC сделали, может народ быстренько этот вариант на ST и переложит..

petera
25.10.2016, 15:20
Вы хоть покажите как на CFC сделали, может народ быстренько этот вариант на ST и переложит..

Читать 7 часть "Отладка прикладных ПЛК программ в CoDeSys" http://prolog-plc.ru/pb1
В самом начале статьи будет такой таймер http://prolog-plc.ru/docs/iecdeb07.pdf

melky
25.10.2016, 15:44
Ну там в SFC, но тоже спасибо

skinnbatter
28.10.2016, 19:25
Уважаемые Гуру программисты ,неужели ни у кого нет примеров на st ну уж очень интересно !как команду стоп на sfc организовать на st .Хотя бы направление задайте

Владимир Ситников
28.10.2016, 20:27
Уважаемые Гуру программисты ,неужели ни у кого нет примеров на st ну уж очень интересно !как команду стоп на sfc организовать на st .Хотя бы направление задайте

Как как?

Берёте исходный код TON: https://bitbucket.org/mjsousa/matiec/src/36fb9443b6ea676ced5f9029f9b7ab070b2eb7e3/lib/timer.txt?at=default&fileviewer=file-view-default#timer.txt-128

Добавляете новое значение "STATE". Там сейчас "0 -- выкл", "1 -- идёт отсчёт", "2 -- горим". Добавляете состояние "3 -- на паузе" и всего делов.

Фрагмент {__SET_VAR(data__->,CURRENT_TIME,,__CURRENT_TIME)} заменяете на CURRENT_TIME := TIME(); (в КДС именно такой способ узнать "текущее время")

Владимир Ситников
28.10.2016, 21:35
Может гурам этот таймер просто не нужен ?

Так skinnbatter это начинающий. Ему в самый раз пригодится разобраться в устройстве "стандартного TON". По-моему, весьма хорошая задача.

Владимир Ситников
29.10.2016, 13:04
Ну тогда просто необходимо разобраться именно самостоятельно, чтоб уяснить саму суть, а не смотреть чужие примеры, иначе следующий вопрос будет : "С TON разобрался, помогите сделать TOF с паузой" ))
Релиз таймеров находится на уровне обязательной программы для изучения. Типа "жы-шы пишы с буквы ы"

Учиться нужно на задачах.
Задача "добавить паузу" в имеющийся TON вполне норм задача.

Вариант "помогите сделать TOF с паузой" будет как раз в том случае, если человек не разберётся, а, неглядя, возьмёт вариант capzap'а, который по случаю оказался "TON'ом с паузой" (ну или чем там, неважно).

capzap
29.10.2016, 19:32
)) Угу. А в ET подкладывать реальный ET за вычетом накопленных промежутков ..

никогда не понимал и наверное уже не судьба понять, шутите или нет, против или поддерживаете, так навсякий случай потестил, проблем не вижу и ЕТ тут вообще ни причем он как свое считало так и будет считать пока не достигнет РТ

skinnbatter
31.10.2016, 15:57
Запутали в конец(

skinnbatter
31.10.2016, 18:56
Вы зачем тогда примеры просили на ST, если только запутались больше

Потому что на CFC это не сделать точно .А нужен такой таймер ,у сименсов точно есть готовый ,тут не ожидал что такие пляски надо делать .Со всем остальным вроде понятно ,а тут просто призадумался ...

capzap
31.10.2016, 19:19
Потому что на CFC это не сделать точно .А нужен такой таймер ,у сименсов точно есть готовый ,тут не ожидал что такие пляски надо делать .Со всем остальным вроде понятно ,а тут просто призадумался ...

а номер у этого сименсовского таймера есть или хотя бы название, а то скорее всего пользуйтесь чьей то наработкой, кто то за Вас "наплясался"

skinnbatter
31.10.2016, 21:10
а номер у этого сименсовского таймера есть или хотя бы название, а то скорее всего пользуйтесь чьей то наработкой, кто то за Вас "наплясался"

Не надо меня считать совсем за ламло, S_ODTS таймер с задержкой включения и запоминанием. Я объяснил что совсем новичок в codesys .

capzap
31.10.2016, 21:35
Не надо меня считать совсем за ламло, S_ODTS таймер с задержкой включения и запоминанием. Я объяснил что совсем новичок в codesys .
ну Вы как бы тоже не считайте, что тут сименсом ни кто не занимается, привожу эпюру этого таймера. Она ни как не похожа на Вашу задачу, запоминанием здесь считается не пауза и запоминание прошедшего времени чтоб потом с этого момента запуститься дальше, а то что пускающий сигнал был и надо продолжать отсчитывать время на включение, даже если он пропал

skinnbatter
31.10.2016, 23:03
ну Вы как бы тоже не считайте, что тут сименсом ни кто не занимается, привожу эпюру этого таймера. Она ни как не похожа на Вашу задачу, запоминанием здесь считается не пауза и запоминание прошедшего времени чтоб потом с этого момента запуститься дальше, а то что пускающий сигнал был и надо продолжать отсчитывать время на включение, даже если он пропал

Возможно я не совсем корректно задал вопрос ,мне в принципе достаточно функционала как предложил форумчанин на SFC, но хочется ручками догнать как написать логику на ST. И у того таймера есть проблема ,при помещении в энергонезависимую память после включения ПЛК таймер не продолжает свой отсчёт, лишь только после снятия сигнала со входа IN. А хотелось бы чтобы он продолжал счёт после возобновления питания.

capzap
31.10.2016, 23:14
я другие примеры не смотрел не знаю как там выглядит идея, но на ST можно посмотреть библиотеку oscat, там мне кажется ближе всего подходит поу TP_1D

skinnbatter
31.10.2016, 23:17
Спасибо capzap! Посмотрю что там)

amn
01.11.2016, 01:49
Возможно я не совсем корректно задал вопрос ,мне в принципе достаточно функционала как предложил форумчанин на SFC, но хочется ручками догнать как написать логику на ST. И у того таймера есть проблема ,при помещении в энергонезависимую память после включения ПЛК таймер не продолжает свой отсчёт, лишь только после снятия сигнала со входа IN. А хотелось бы чтобы он продолжал счёт после возобновления питания.

А готовый таймер, предложенный тут (http://www.owen.ru/forum/showthread.php?t=7077&p=161598&viewfull=1#post161598), не подошел?

Kostennikov
01.11.2016, 09:24
Да бы не создавать тему про таймеры напишу здесь.
В общем блинк не подошел т.к. у него сначала выход не активный и он не сбрасывается а сохраняет состояние до следующего раза. Посмотрел кто как что делал, написал свой вариант ФБ.


FUNCTION_BLOCK My_BLINK
VAR_INPUT
run: BOOL;
high: TIME:=t#0s;
low: TIME:=t#0s;
END_VAR

VAR_OUTPUT
time_left: TIME;
out: BOOL;
END_VAR

VAR
TOF1: TOF;
pt: TIME;
END_VAR


IF NOT run THEN
pt:=t#0s;
out:=FALSE;
END_IF
TOF1(IN:=FALSE, PT:= pt);
time_left:=TOF1.PT - TOF1.ET;
IF NOT TOF1.Q AND run THEN
TOF1(IN:=TRUE, PT:= pt);
IF NOT out THEN
pt:=high;
out:=TRUE;
ELSE
pt:=low;
out:=FALSE;
END_IF
END_IF

В общем все работает, но у меня из -за нехватки опыта в программировании ПЛК возникло ощущение что может это как то проще делается?
и попутный вопрос.

Есть алгоритм который этот фб запускает при условии что включены два сигнала но отключиться должен при пропадании одного любого из них. Что то я не догоню как мне сделать это отключение. На с# я бы обнулил их в IF ... THEN ... ELSE (здесь бы и сбросил флаг) END_IF (синтаксис КДС). но в КДС это приводит к тому что я не могу изменить состояние флагов они всегда сброшены. Использовать тригеры (я так понял это аналоги событий. т.е. срабатывает одноразово при изменении состояния переменной ) и в них сбрасывать состояние другой переменной?
Документация по КДС 2.3 до меня туго доходит. Таймеры вкуривал очень долго, соответственно и ФБ этот не за час сделал(((.
Прошу совета или какой нибудь информации.
Проект прилагаю.


b1(low:=T#5s, high:=T#4s);


IF Start_pwm1 THEN
IF Auto_mode1 THEN
b1.run:=1;
pwm1:=b1.out;
ELSE
pwm1:=1;
END_IF
ELSE
pwm1:=0;
b1.run:=0;
END_IF





И таких однотипных алгоритмов порядка 25 штук. Плк справится? помимо этого плк будет еще и по интерфейсам собирать данные порядка 250 и отправлять в скада систему(функция побочная в алгоритме управления используется порядка 30 переменных) остальное транзит из одного интерфейса в другой(плк как преобразователь интерфейсов).

Kostennikov
01.11.2016, 09:41
В частности вот этот. По нему и понял как таймер TOF работает. Собственно что я сделал так убрал шаги. Ну и как мне кажется нашел более оптимальное решение. Я же прошу совета. направление указать куда смотреть.

melky
01.11.2016, 09:44
вам Blink надо изменить чтобы он наоборот работал ? вход блинк - xor, выход блинк на этот же xor, потом AND на выходе xor и второй вход так же вход блинка.
Вроде этот blink так же работает, сперва с включенного состояния начинает.

melky
01.11.2016, 09:53
Есть алгоритм который этот фб запускает при условии что включены два сигнала но отключиться должен при пропадании одного любого из них. Что то я не догоню как мне сделать это отключение.


Взвести RS триггер через AND от двух сигналов, а сбросить после F_trig каждого сигнала через OR

Kostennikov
01.11.2016, 09:54
вам Blink надо изменить чтобы он наоборот работал ? вход блинк - xor, выход блинк на этот же xor, потом AND на выходе xor и второй вход так же вход блинка.

Это типа возьми вон ту фигню потом переверни, которая за той перевернутой фигней, потом пойми которая раньше была перевернута и еще раз переверни , а потом поставь за той перевернутой фигней. (Но смысл я уловил.) Стандартный блинк запоминает состояние (возможно я не так понял или использовал его) если его выключили в низком уровне то при последующем запуске он начнет с низкого уровня . хоть инвертируй хоть нет выход. то есть я не понял как его перезапустить потом

Kostennikov
01.11.2016, 09:55
на оскат библиотеку. А по поводу вложения, зачем тогда писать что смотрели примеры
Если я взял за основу этот пример.
Может ты и хороший специалист в этой сфере, но если берешься помочь то дельным советом , ссылкой, документом.

Кна какую...? прикрепил бы, а то только фонишь.

melky
01.11.2016, 09:55
Да ничего BLINK не запоминает, он всегда начинает работу с НИЗКОГО уровня. Это указано в справке CDS.
Вход En его только активирует
То же самое в выложенном вами примере на ST, только там переворачивают начало с низкого уровня на высокий.
Нет, XOR там всего один, для переворота, AND чтобы выключить если не активен En блинка.

lara197a
01.11.2016, 09:56
самый простой способ это счетчик, со входом от базового таймера.
Для остановки просто прерываете сигнал на счетном входе.
Такой способ используется в системах, где имеется только базовый таймер.
Испортил тон и тоф современных программистов... превратил их в конфигураторов.

Kostennikov
01.11.2016, 10:03
Взвести RS триггер через AND от двух сигналов, а сбросить после F_trig каждого сигнала через OR

Примерно так я и думал. только хотел на каждый сигнал по триггеру. вот и спросил. мне показалось что это было бы не правильно. Спасибо!

capzap
01.11.2016, 10:06
самый простой способ это счетчик, со входом от базового таймера.
Для остановки просто прерываете сигнал на счетном входе.
Такой способ используется в системах, где имеется только базовый таймер.
Испортил тон и тоф современных программистов... превратил их в конфигураторов.
счетчик не может менять длительность обоих состояний, всё равно кому то придется менять длительность таймера до следующего синхроимпульса, так зачем тогда он когда при смене этих времен можно менять и выходную булеву переменную

Kostennikov
01.11.2016, 10:10
самый простой способ это счетчик, со входом от базового таймера.
Для остановки просто прерываете сигнал на счетном входе.
Такой способ используется в системах, где имеется только базовый таймер.
Испортил тон и тоф современных программистов... превратил их в конфигураторов.

А можно чуточку подробнее. Счетчик я представляю. Но там вроде как импульсом управляется. базовый таймер заставить работать с периодом 1 сек? для моего случая это нормально большая точность не нужна.

lara197a
01.11.2016, 10:11
не все понял, зачем менять?
в огромном количестве систем программирования используются
базовые таймеры 1, 10, 100мс.

capzap
01.11.2016, 10:15
не все понял, зачем менять?
в огромном количестве систем программирования используются
базовые таймеры 1, 10, 100мс.
потому что вопрашатель изначально захотел блинкер изменить, а у него есть и время включения и время выключенного состояния. Хотя судя по последнему посту, он просто не верно задал вопрос

lara197a
01.11.2016, 10:31
Я всю тему не читал, возможно что и упустил. Однако точность таймеров обрабатываемых в цикле
будет не слишком точна, это и к тон-тоф относится и к блинк . Для большинства случаев это не критично.
Если загоняться точностью, то можно использовать базовый таймер 20мкс и прерывания.
В обычном случае счетчик используется примерно так:

здесь на счетный вход подаются импульсы, а сброс запускает новый отсчет.
Получаем задержку включения. Если прерывать подачу импульсов на счетный вход, то отсчет остановится,
но значение прошедшего времени будет сохранено.
На второй картинке счетчик используется в качестве "барабанного" контроллера, для поочередного включения опроса.
но принцип тот же.

melky
01.11.2016, 10:52
Упс, посмотрел справку CDS, действительно Blink запоминает выход при отключении Enable

А еще штатный Blink похоже запоминает и время.... а не начинает сначала.. или работает через задницу.
Поставил рядом TON и по выходу ET наблюдаю...

capzap
01.11.2016, 11:03
Упс, посмотрел справку CDS, действительно Blink запоминает выход при отключении Enable

А еще штатный Blink похоже запоминает и время.... а не начинает сначала.. или работает через задницу.
Поставил рядом TON и по выходу ET наблюдаю...
так можно еще открыть бибку Util и посмотреть содержимое блинка и подправить под себя,если что

melky
01.11.2016, 11:16
Ну вот в теме блок на ST и есть, который работает строго по start и начинает сначала.

capzap
01.11.2016, 11:16
Не рекомендую. При модификации како-нить кода можно пропустить момент где его логика расчитана на оригинальный вариант биб-ки. Лучше написать свой блок.
не раз уже писал, что не добавляю бибки целиком, а копипастом переношу нужные ПОУ к себе в проект(естественно где это возможно). Поэтому, да, имел ввиду написать свой блок

Kostennikov
01.11.2016, 11:23
Упс, посмотрел справку CDS, действительно Blink запоминает выход при отключении Enable

А еще штатный Blink похоже запоминает и время.... а не начинает сначала.. или работает через задницу.
Поставил рядом TON и по выходу ET наблюдаю...

Мне интересно моя реализация блинка имеет право на жизнь или нет? Может я что то не учел? Может есть более тонкая реализация которую я пока не способен осознать с моим уровнем знаний?

http://www.owen.ru/forum/showthread.php?t=25203&page=4&p=225593&viewfull=1#post225593

melky
01.11.2016, 11:38
я не силен в ST, но ваш вариант работает так же как в других ПО, то есть при start = true начинается новый отсчет...

Kostennikov
01.11.2016, 11:44
Ну да. при старт = 0 . возвращается состояние исходное. при повторном все сначала


Хотя вот заметил если вызывать мой блинк в каком нибудь if или case то отсчет начинается с начала но таймер не останавливается хотя выход у него при страт =0 возвращается в исходное состояние и последующий вызов не вызывает проблем.

если вызов в основном цикле плк как в приложении то таймер останавливается...

Ну это я так понимаю потому что Starttime таймера останавливается

skinnbatter
01.11.2016, 22:10
В общем почитал, посмотрел как таймеры устроены, немного напрягся и родил таймер. Проще брать значения времени отсчёта таймера и суммировать с тем ,что было. Запоминаем сколько времени осталось отсчитать и сколько прошло, если таймер не досчитал до конца просто суммируем отработанное время. Можно как вариант привязывать к внутреннему времени, это если брать исходник таймера. А писать таймеры на основе цикла не имеет смысла т.к. неплохо так накапливается ошибка.

жекон
02.11.2016, 11:07
R_TRIG1(CLK:=on AND TIME_TO_DWORD(TIME())MOD 1000>500);
IF on AND time_in<>sec AND NOT pause THEN
sec:=sec + BOOL_TO_DWORD(R_TRIG1.Q);
ELSIF on AND time_in<>sec AND pause THEN
sec:=sec;
ELSIF on AND time_in=sec AND NOT pause THEN
sec:=0;
END_IF;
а так не пойдет?

skinnbatter
03.11.2016, 00:54
sec:=sec + BOOL_TO_DWORD(R_TRIG1.Q) ,что значит сиё дествие? не понимаю как двойное слово и секунды дружаться:rolleyes:

жекон
03.11.2016, 05:53
Dword выбран из за верхнего предела можно DINT поставить sec тоже Dword

василий17061980
05.07.2018, 09:29
А готовый таймер, предложенный тут (http://www.owen.ru/forum/showthread.php?t=7077&p=161598&viewfull=1#post161598), не подошел?

Этот таймер работает глючно, если меняешь значения времени на входе, его таращит по страшной.

capzap
05.07.2018, 22:01
вот еще один из вариантов таймера

petera
06.07.2018, 10:18
И я свои пять копеек вставлю

Ранее делал простой как грабли TON - дополнен только входом паузы

FUNCTION_BLOCK TON_P
VAR_INPUT
IN: BOOL; (*Старт*)
P: BOOL; (*Пауза*)
PT: TIME; (*Уставка времени*)
END_VAR
VAR_OUTPUT
Q: BOOL;
ET: TIME; (*Время работы таймера*)
END_VAR
VAR
clk: BOOL;
StartTime: TIME;
tx: TIME;
END_VAR

x:= TIME();
IF P THEN
StartTime:= tx - ET;
END_IF
IF IN AND NOT clk THEN
StartTime:= tx;
clk:= TRUE;
ELSIF NOT IN THEN
clk:= FALSE;
Q:= FALSE;
ET:= t#0s;
END_IF
IF clk AND NOT Q THEN
ET:= MIN(PT, tx - StartTime);
Q:= ET = PT AND IN;
END_IF

37942

Lordorakus
14.05.2020, 08:22
Подниму тему, у кого нибудь остался файл таймера TON с паузой на языке CFC?

Lordorakus
14.05.2020, 08:46
Разобрался, спасибо petera :)