PDA

Просмотр полной версии : Реализация таймеров



ivankolya
17.04.2011, 19:56
Необходимо реализовать задержку выполнения программы - открыли клапан и ждём 30 с (никаких действий), открыли второй клапан и снова ждём 30 с, после чего начинается программа (регулятор). Возникает желание реализовать это через while , но при запуске программы срабатывает сторожевой таймер, пишет "слишком длинный цикл". Если делать через if , то всё что в теле if работает с нужной задержкой, но контроллер пробегает по всей программе, а это не нужно.
В общем если написать

timer(in:=1, pt:=t#30s);
if not (timer.q) then x:=x+1; end_if
timer(in:=0);
z:=z+1;

x будет увеличиваться на 1 каждые 30с, но z будет увеличиваться со скоростью работы процессора, что не подходит.
А если написать

timer(in:=1, pt:=t#30s);
while timer.q do;
x:=x+1;
timer(in:=0);

сработает сторожевой таймер, слишком длинный цикл.
Нельзя ли как нибудь обойти этот таймер?

Малышев Олег
17.04.2011, 20:31
tp1,tp2:TP;
ftrig1,ftrig2:F_TRIG;

tp1(in:=start,pt:=t#30s); Valve1:=tp1.q;ftrig1(CLK:=Valve1); (*Не совсем понял нужно закрывать первый при открытии второго - если не надо то в конце напишите Valve1:=tp1.q or Valve2;*)
tp2(in:=ftrig1.q,pt:=t#30s); Valve2:=tp2.q;ftrig2(CLK:=Valve2);
if ftrig2.q then StartRegulator:=true; end_if

А вообще забываете стандартные языки. В IEC 61131-3 все по другому.

ivankolya
18.04.2011, 20:39
tp1,tp2:TP;
ftrig1,ftrig2:F_TRIG;

tp1(in:=start,pt:=t#30s); Valve1:=tp1.q;ftrig1(CLK:=Valve1); (*Не совсем понял нужно закрывать первый при открытии второго - если не надо то в конце напишите Valve1:=tp1.q or Valve2;*)
tp2(in:=ftrig1.q,pt:=t#30s); Valve2:=tp2.q;ftrig2(CLK:=Valve2);
if ftrig2.q then StartRegulator:=true; end_if

А вообще забываете стандартные языки. В IEC 61131-3 все по другому.

Если я правильно понял, Valve1 будет равно единице в течении 30 секунд, но в течении этих 30 секунд будут выполняться и другие команды расположенные ниже (Valve2 так же станет равной 1 и т.п.), а мне это не нужно. Мне надо чтобы Valve1 стало равным единице и на 30 секунд прекратилось выполнение всех команд ниже, потом чтобы Valve2 стало равным единице и опять на 30 секунд контроллер чтобы замер, а по окончании этой минуты (30сек + 30сек) продолжил выполнять программу.

Малышев Олег
18.04.2011, 21:05
добавьте if tp1.q or tp2.q then return; end_if

ivankolya
19.04.2011, 20:05
добавьте if tp1.q or tp2.q then return; end_if

Нельзя ли по подробней о return. По этой команде контроллер снова будет проверять условие if ? А из POU не выйдет (если это подпрограмма)? В описании среды программирования CoDeSys действие return вроде так описывается.

ivankolya
19.04.2011, 22:38
Попробовал добавить return , опять не то получается. По return контроллер выскакивает из одной программы и бежит выполнять другие программы, а мне этого не надо. Надо чтобы контроллер оставался внутри одной программы 30 сек и никуда не убегал. Собственно программа эта - прогрев калорифера. Т.е. калорифер прогревается 30 сек., а другие команды не выполняются. Понятно что это можно сделать через if или case , но через while проще, а главное надёжнее. Однако сторожевой таймер не даёт это сделать. Вот я и хочу понять - можно его обойти или ничего не получится?:confused:

capzap
20.04.2011, 00:11
А что нибудь такое не пробовали создать?

Малышев Олег
20.04.2011, 12:09
Попробовал добавить return , опять не то получается. По return контроллер выскакивает из одной программы и бежит выполнять другие программы, а мне этого не надо. Надо чтобы контроллер оставался внутри одной программы 30 сек и никуда не убегал. Собственно программа эта - прогрев калорифера. Т.е. калорифер прогревается 30 сек., а другие команды не выполняются. Понятно что это можно сделать через if или case , но через while проще, а главное надёжнее. Однако сторожевой таймер не даёт это сделать. Вот я и хочу понять - можно его обойти или ничего не получится?
А вот так не получится - ставьте флаг прогрев калорифера, после чего ставьте во всех программах по этому входу сразу выход (return);
Прога на CoDeSys должна выполняться мгновенно - это основа работы ПЛК - цикл = чтение входов - работа - запись выходов. По другому не получится.
В IEC61131-3 все несколько сложнее - но общий принцип такой же. Поэтому следует забыть про задержки требующие останова программы - типа sleep / delay
while (i++<10000000). Сработает охранный таймер.
А вообще - не проще ли купить ТРМ33, 133, 133М02, 133М04 ? В 99 случаях проблема будет решена.

Игорь Петров
20.04.2011, 16:52
Не сложнее, а гуманитарнее :)

ПЛК работает с таймерами как человек. Я вот развел клей. Ему нужно набухнуть 2 часа. Я же не буду сидеть 2 часа над ведром в позе орла? Засек время по часам. Периодически посматриваю на часы (вызываю запущенный блок таймера) и занимаюсь другими полезными делами параллельно. Так и ПЛК может взвести 2 сотни разных таймеров одновременно, осматривать регулярно их выходы и предпринимать соответствующие действия когда пора. Процесс ожидания в ПЛК может и должен быть наполнен бурной деятельностью.

ivankolya
20.04.2011, 20:50
Попробовал добавить return , опять не то получается. По return контроллер выскакивает из одной программы и бежит выполнять другие программы, а мне этого не надо. Надо чтобы контроллер оставался внутри одной программы 30 сек и никуда не убегал. Собственно программа эта - прогрев калорифера. Т.е. калорифер прогревается 30 сек., а другие команды не выполняются. Понятно что это можно сделать через if или case , но через while проще, а главное надёжнее. Однако сторожевой таймер не даёт это сделать. Вот я и хочу понять - можно его обойти или ничего не получится?
А вот так не получится - ставьте флаг прогрев калорифера, после чего ставьте во всех программах по этому входу сразу выход (return);
Прога на CoDeSys должна выполняться мгновенно - это основа работы ПЛК - цикл = чтение входов - работа - запись выходов. По другому не получится.
В IEC61131-3 все несколько сложнее - но общий принцип такой же. Поэтому следует забыть про задержки требующие останова программы - типа sleep / delay
while (i++<10000000). Сработает охранный таймер.
А вообще - не проще ли купить ТРМ33, 133, 133М02, 133М04 ? В 99 случаях проблема будет решена.

Спасибо всем за высказывания.
Вывод ясен: длинные задержки не пойдут. Буду искать другие решения. Мне кажется что case здесь будет проще и наглядней. А по оборудованию: сначала купили ПЛК154, а он не пошёл, там оказывается программы нет:) :) Потом купили ТРМ133, а ПЛК154 куда? Выкидывать жалко:) Отдали мне и сказали: "Прикрути как нибудь, но чтоб работало". Вот, прикручиваю:D :D (Выбором оборудования не я занимался;)

alhoresm
21.04.2011, 09:57
чтобы не плодить темы спрошу здесь:
пишу вродебы простую программку:


TP1:TP;
start:bool:=true;
i1 at %QD7.0:real;

i1 объявлено в глобальных переменных


if start then
TP1.PT:=T#60000ms;
TP1.IN:=true;
start:=false;
else
if TP1.Q then
i1:=TIME_TO_REAL(TP1.ET)*20/60000;
else
TP1.IN:=false;
start:=true;
end_if;
end_if;

в инструкции написано, что при переходе параметра IN из FALSE в TRUE параметр Q становится TRUE и ET начинает отсчитывать от 0 до PT, но при запуске программы параметр Q остаётся равным FALSE

Игорь Петров
21.04.2011, 12:00
в инструкции написано, что при переходе параметра IN из FALSE в TRUE параметр Q становится TRUE и ET начинает отсчитывать от 0 до PT, но при запуске программы параметр Q остаётся равным FALSE
В примере происходит манипуляция значениями переменных в памяти экземпляра блока, НО сам экземпляр блока TP1 не вызывает нигде!!! Он и не работает.

Напишите в хвосте программы вызов TP1; Либо сразу делайте вызов с присваиванием значений TP1(IN:=TRUE);

alhoresm
22.04.2011, 18:00
спасибо, получилось :)

AlexPC1
23.04.2011, 08:23
Посмотри язык программирования SFC(В КоДеСис четвертый язык сверху в окне выбора Языка реализации)

Цитата из справки по КоДеСис:
Язык последовательных функциональных схем (SFC)
SFC - это графический язык, который позволяет описать хронологическую последовательность различных действий в программе. Для этого действия связываются с шагами (этапами), а последовательность работы определяется условиями переходов между шагами.


Условием перехода на другой шаг может быть например истечение какого либо промежутка времени.....
Короче ИМХО Это то что тебе нужно, решишь свою задачу 2-4 кубиками(Шагами)!!!!

AlexPC1
23.04.2011, 08:32
Вот небольшие примеры на языке SFC, примеры рассматривались на обучающем семинаре проходившем в офисе компании ОВЕН
Там какраз есть задержки выполнения по времени

AlexPC1
23.04.2011, 08:39
На форуме тема: Программирование на SFC (http://www.owen.ru/forum/showthread.php?t=10391)
В ней 8 ответ сверху, ответ Игоря Петрова. В нем ссылка......В ссылке ....книжка.В книжке знания .....:)
Удачи!