Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Реализация таймеров

  1. #1

    По умолчанию Реализация таймеров

    Необходимо реализовать задержку выполнения программы - открыли клапан и ждём 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);

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

  2. #2

    По умолчанию

    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 все по другому.
    Последний раз редактировалось Малышев Олег; 17.04.2011 в 20:33.
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  3. #3

    По умолчанию

    Цитата Сообщение от Малышев Олег Посмотреть сообщение
    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сек) продолжил выполнять программу.

  4. #4

    По умолчанию

    добавьте if tp1.q or tp2.q then return; end_if
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  5. #5

    По умолчанию

    Цитата Сообщение от Малышев Олег Посмотреть сообщение
    добавьте if tp1.q or tp2.q then return; end_if
    Нельзя ли по подробней о return. По этой команде контроллер снова будет проверять условие if ? А из POU не выйдет (если это подпрограмма)? В описании среды программирования CoDeSys действие return вроде так описывается.

  6. #6

    По умолчанию

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

  7. #7
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,246

    По умолчанию

    А что нибудь такое не пробовали создать?
    Последний раз редактировалось capzap; 05.11.2011 в 21:49.

  8. #8

    По умолчанию

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

  9. #9

    По умолчанию

    Не сложнее, а гуманитарнее

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

  10. #10

    По умолчанию

    Цитата Сообщение от Малышев Олег Посмотреть сообщение
    Попробовал добавить 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 куда? Выкидывать жалко Отдали мне и сказали: "Прикрути как нибудь, но чтоб работало". Вот, прикручиваю (Выбором оборудования не я занимался

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •