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

Тема: Прикол с TP, TON и TOF

  1. #1

    По умолчанию Прикол с TP, TON и TOF

    Ситуация следующая:
    Составляю программку на SFC, в каждом шаге пишу задержку по времени и привязываю ее к активному шагу. Переходы это сработка выхода ФБ после задержки. По идее когда выходит из шага должна входная переменная ФБ задержка (активный шаг) сбрасываться в ложь. Так все и происходит в режиме эмуляции - все вроде нормально, а вот на практике почему - то не всегда, то есть бывает что при повторном вызове шага оказывается, блок задежки уже отработал. Поэтому приходится в каждом шаге, где я использую задержку вставлять выходное действие по обнулению входа ФБ задержка.
    После такого уже стопроцентно всегда ФБ задержка при повторном вызове оказывается "чистым".
    Почему?
    Вложения Вложения
    Последний раз редактировалось Горшунов Сергей; 10.03.2009 в 16:06. Причина: по кайфу

  2. #2

    По умолчанию

    Попробуй к каждому щагу добавлять действие по выходу примерно такого содержания (time1 типа TP, TON или TOF):

    time1.in:=false;
    time1;

  3. #3

    По умолчанию

    Цитата Сообщение от Горшунов Сергей Посмотреть сообщение
    ..а вот на практике почему - то не всегда, то есть бывает что при повторном вызове шага оказывается, блок задежки уже отработал.
    Странно... Почему не всегда? По идее без обнуления в выходном действии таймер и не должен сбрасываться

    Я для таких вещей использую примерно такую схему:

    Внутри шага
    timer1 (IN:=TRUE, PT:=t#10s);

    В выходном действии
    timer1 (IN:=FALSE);

    Условие перехода timer1.Q

    И все четко работает. Чего и вам желаю.

  4. #4

    По умолчанию

    В том то и дело, что и я так же делаю при выходе из шага, а по идеи так быть не должно.
    См. изначальный пост.
    То есть я в шаге на вход таймеру (TON, TOF, TP - значения не имеет)подаю не просто true а номер активного шага, в котором он используется:
    Объяснение на пальцах:
    Активный шаг : step1
    timer1 (IN:=step1, PT:=t#10s); переход : timer1.Q
    При выходе из шага он становится не активным, соответственно и переменная статуса шага step1 получает ложь, таймер в этом случае должен обнулиться.
    Так и происходит например при написании небольшого примера на SFC и эмуляции. Но когда я все это дело в реальной программе делаю и заливаю в ПЛК, запускаю в работу - все это дело начинает само по себе работать: таймеры обнуляются через раз а то и через два, в общем когда захотят тогда и обнуляются по логике вещей такого быть не должно!
    Как это так на примере работает, а на реальной программе нет!????
    Просто мне:
    1) интересен данный факт
    2) надоело при выходе из шага писать действие по "обнулению" счетчика.

  5. #5

    По умолчанию

    Вот кстати примерчик по быстрому накатал.
    Интересный факт:
    TON в данном примере работает нормально, а TP ненормально.
    Принцип один и тот же. Почему? Даже если вторым переходом ставить отрицание, он всеравносразу переход делает.
    Насколько я правильно понимаю систему исполнения алгоритм ее работы таков:
    чтение входов - выполнение шага - проверка условия перехода -
    если правда - запись выходов и переход на другой шаг
    Если ложь - цикл заново
    А здесь получается
    сначала проверка условия, а уж потом все остальное
    Вложения Вложения

  6. #6

    По умолчанию

    Цитата Сообщение от Горшунов Сергей Посмотреть сообщение
    ..Насколько я правильно понимаю систему исполнения алгоритм ее работы таков:
    чтение входов - выполнение шага - проверка условия перехода - если правда - запись выходов и переход на другой шаг Если ложь - цикл заново...
    Не точно. На каждый шаг есть 2 флага. Из них получается 4 комбинации: шаг не активен – ничего не делать, только что получил активность – выполнить входное действие, имеет активность – выполнять основное действие, потерял активность – выполнять выходное действие. В любом случае реакция на изменение активности произойдет только в след. цикле вызова.

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

    Цитата Сообщение от Горшунов Сергей Посмотреть сообщение
    ..надоело при выходе из шага писать действие по "обнулению" счетчика...
    Дык и не надо тут таймеры применять. Если используем МЭК SFC, то там есть действия управляемые по времени. В упрощенном SFC ставим в атрибутах шага минимальное время и все дела. Никаких таймеров. Подробнее: http://www.prolog-plc.ru/docs/iecdeb07.pdf

  7. #7

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    В вышеописанном алгоритме все как-то на соплях. Шаг потерял активность и действие уже не вызывается, но еще делается попытка нечто подсунуть таймеру. Каким-то чудом это иногда получается… Вариант от Партизан совершенно четкий.
    Вот это мне и интересно почему же все таки это происходит? Так сказать на соплях...
    Недоработка системы программирования? Или я что-то не понимаю. Ведь нестабильность работы - признак недоработки...
    Последний раз редактировалось Горшунов Сергей; 13.03.2009 в 22:21.

  8. #8

    По умолчанию

    Здраствуйте, я реализую задержку также как и Партизан(если я его правельно понял), вот моя функция:

    Код:
    tmrZ(In:=start_tmr,pt:=T#1450MS);
    IF ACP_get_zapros=1 THEN 
    	start_tmr:=FALSE;
    	//выполняю первую процедуру
    	ACP_get_zapros:=7;
    	start_tmr:=TRUE;
    END_IF
    IF ACP_get_zapros=7 AND tmrZ.Q=TRUE THEN 
    	start_tmr:=FALSE;
    	//выполняю вторую процедуру
    	ACP_get_zapros:=0;
    	start_tmr:=TRUE;
    END_IF
    Где tmrZ:TON

    Проблема в том что tmrZ, get_zapros и start_tmr приходится обьявлять как Глобальные переменные, потому что обьявлять внутри функции както боязно. Как можно их локализовать(кроме конечно ACP_get_zapros управляющая функцией) и гарантировать их жизнь? Потому как подобных процедур у меня много, а плодить стока переменных совсем не хочется.

    И какие ещё есть методы реализации зодержки?

  9. #9

    По умолчанию Таймер не сбрасывается

    Здравствуйте!
    В своем коде я использую функцию задержки из примера со светофором документа CodeSys_V23_RU.pdf

    Экземпляр функции объявлен в области глобальных переменных.

    DELAY:WAIT;

    Перед каждым шагом, в котором я использую задержку
    я сбрасываю таймер:
    DELAY.ZAB(IN:=0)

    Шаг с задержкой выглядит так:
    DELAY(TIME_IN:=время)

    Во время работы шага с задержкой не дожидаясь окончания задержки ПО может сбросить цикл программы на Init (например по нажатию кнопки на панели ОПЕРАТОРА),
    а после этого неостановившийся таймер продолжает считать, и
    команда:
    DELAY.ZAB(IN:=0)
    его не сбрасыывает, т.е. выход Q экземпляра TP ZAB не равен FALSE.

    Как корректно сбросить экземпляр TP?

  10. #10

    По умолчанию

    tmrZ(In:=start_tmr,pt:=T#1450MS);
    IF ACP_get_zapros=1 THEN
    start_tmr:=FALSE; //обнулили вход экземляра ФБ
    ....
    start_tmr:=TRUE; //и сразу опять установили
    //в след. цикле вызываем ФБ с опять установленным
    входом. Итого, никто его со сброшенным входом ни разу не вызвал и сделать свою работ по сбросу шансов у него нет... в ST с этим нужно тщательнее.

    И какие ещё есть методы реализации зодержки?
    См. функцию Time()

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

Ваши права

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