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

Тема: Сбросить таймер TON

  1. #1

    По умолчанию Сбросить таймер TON

    Здравствуйте!

    Подскажите, пожалуйста, по работе таймера TON.
    В коде присутствуют 2 экземпляра TON:
    Один таймер работает, как задержка на включение выхода
    Второй работает, как максимальное время работы и включается по ET первого таймера.
    По второму условию таймеры должны обнулиться, но, к сожалению этого не происходит, таймеры останавливаются без сброса.
    Делал исполнение с CASE...OF, но с одним таймером, без задержки и сработало, но в текущем исполнении не хочет.


    Код:
    // условная часть кода
    ELSIF Sterilizer.SW_DVtank_LLevel AND NOT Sterilizer.SW_DVtank_HLevel THEN 
    
    		Timer_Delay_2 (IN:=Timer_Delay_2_IN,PT:=T#10S); //Таймер задержки включения
    		Timer_Delay_2_IN:=TRUE; // Запуск таймера
    		Timer_Delay_1(IN := Timer_Delay_1_IN, PT:= T#60S); // Таймер максимального времени работы
    		Timer_Delay_1_IN:=Timer_Delay_2.Q;
    		Sterilizer.Valve_DW :=Timer_Delay_2.Q; // Выход включен
    
    	ELSIF Sterilizer.SW_DVtank_HLevel AND NOT Timer_Delay_1.Q THEN 
    		Sterilizer.Valve_DW :=FALSE; // Выход выключить
    		Timer_Delay_2.IN:=FALSE; // Сброс таймера Timer_Delay_2
    		Timer_Delay_1.IN:=FALSE; // Сброс таймера Timer_Delay_1
    Буду признателен за помощь.

    Спасибо,

  2. #2

    По умолчанию

    Цитата Сообщение от ShikuS Посмотреть сообщение
    Здравствуйте!

    Подскажите, пожалуйста, по работе таймера TON.
    В коде присутствуют 2 экземпляра TON:
    Один таймер работает, как задержка на включение выхода
    Второй работает, как максимальное время работы и включается по ET первого таймера.
    По второму условию таймеры должны обнулиться, но, к сожалению этого не происходит, таймеры останавливаются без сброса.
    Делал исполнение с CASE...OF, но с одним таймером, без задержки и сработало, но в текущем исполнении не хочет.


    Код:
    // условная часть кода
    ELSIF Sterilizer.SW_DVtank_LLevel AND NOT Sterilizer.SW_DVtank_HLevel THEN 
    
    		Timer_Delay_2 (IN:=Timer_Delay_2_IN,PT:=T#10S); //Таймер задержки включения
    		Timer_Delay_2_IN:=TRUE; // Запуск таймера
    		Timer_Delay_1(IN := Timer_Delay_1_IN, PT:= T#60S); // Таймер максимального времени работы
    		Timer_Delay_1_IN:=Timer_Delay_2.Q;
    		Sterilizer.Valve_DW :=Timer_Delay_2.Q; // Выход включен
    
    	ELSIF Sterilizer.SW_DVtank_HLevel AND NOT Timer_Delay_1.Q THEN 
    		Sterilizer.Valve_DW :=FALSE; // Выход выключить
    		Timer_Delay_2.IN:=FALSE; // Сброс таймера Timer_Delay_2
    		Timer_Delay_1.IN:=FALSE; // Сброс таймера Timer_Delay_1
    Буду признателен за помощь.

    Спасибо,
    Недостаточно сделать
    Timer_Delay_2.IN:=FALSE;
    для сброса выхода нужно ещё вызвать таймер с этим значением на входе:
    Timer_Delay_2();

  3. #3

    По умолчанию

    Я таймеры сбрасывал записью FALSE в IN и нуля в PT. После этого их надо вызвать хоть один цикл, чтобы изменения вступили в силу.
    Потомм я написал свой FB-обёртку на базе штатных таймеров, у которого сразу есть вход Reset.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  4. #4

    По умолчанию

    Цитата Сообщение от ShikuS Посмотреть сообщение
    Здравствуйте!

    Подскажите, пожалуйста, по работе таймера TON.
    В коде присутствуют 2 экземпляра TON:
    Один таймер работает, как задержка на включение выхода
    Второй работает, как максимальное время работы и включается по ET первого таймера.
    По второму условию таймеры должны обнулиться, но, к сожалению этого не происходит, таймеры останавливаются без сброса.
    Делал исполнение с CASE...OF, но с одним таймером, без задержки и сработало, но в текущем исполнении не хочет.


    Код:
    // условная часть кода
    ELSIF Sterilizer.SW_DVtank_LLevel AND NOT Sterilizer.SW_DVtank_HLevel THEN 
    
    		Timer_Delay_2 (IN:=Timer_Delay_2_IN,PT:=T#10S); //Таймер задержки включения
    		Timer_Delay_2_IN:=TRUE; // Запуск таймера
    		Timer_Delay_1(IN := Timer_Delay_1_IN, PT:= T#60S); // Таймер максимального времени работы
    		Timer_Delay_1_IN:=Timer_Delay_2.Q;
    		Sterilizer.Valve_DW :=Timer_Delay_2.Q; // Выход включен
    
    	ELSIF Sterilizer.SW_DVtank_HLevel AND NOT Timer_Delay_1.Q THEN 
    		Sterilizer.Valve_DW :=FALSE; // Выход выключить
    		Timer_Delay_2.IN:=FALSE; // Сброс таймера Timer_Delay_2
    		Timer_Delay_1.IN:=FALSE; // Сброс таймера Timer_Delay_1
    Буду признателен за помощь.

    Спасибо,
    Код:
    bStart := Sterilizer.SW_DVtank_LLevel AND NOT Sterilizer.SW_DVtank_HLevel; // Условие на запуск по нижнему уровню
    // (мне кажется LLevel тоже должен быть через NOT)
    bStop := Sterilizer.SW_DVtank_HLevel; // Условие на остановку по верхнему уровню
    
    Timer_Delay_2(IN := bStart, PT:=T#10S); //Таймер задержки включения
    IF Timer_Delay_2.Q THEN
      Sterilizer.Valve_DW :=TRUE; // Фиксируем включение
    END_IF
    
    Timer_Delay_1(IN := Sterilizer.Valve_DW, PT:= T#60S); // Таймер максимального времени работы
    IF Timer_Delay_1.Q OR bStop THEN  // Время работы вышло или условие на остановку
      Timer_Delay_2(IN := FALSE);
      Sterilizer.Valve_DW := FALSE;  // Фиксируем выключение
    END_IF
    Последний раз редактировалось EFrol; 07.07.2023 в 09:52.

  5. #5

    По умолчанию

    1exan,
    Спасибо, Я пробовал делать Timer_Delay_2() и присваивать TP:=0 и Timer_Delay_2.IN:=FALSE и Timer_Delay_2(IN:=FALSE)
    Ничего не помогало(((
    Как только не крутился)

    Cs-Cs,
    Спасибо, Вчера уже начинал задумываться тоже о написании FB для таймера)

    EFrol,

    Спасибо, код работает хорошо, немного перестроить нужно СВОЮ логику.

    Так и не понятно, как оно работает
    Как вижу, что выключение присваиванием не проходит, но по присвоенииюI N:=FALSE по условию - проходит, хотя с другой стороны:
    Код:
    IF Timer_Delay_1.Q OR bStop THEN  // Время работы вышло или условие на остановку
      		Timer_Delay_2(IN := FALSE);
      		Sterilizer.Valve_DW := FALSE;  // Фиксируем выключение
    	END_IF
    при прямом присваивании IN:= FALSE; -проходит

    Непонятно)))

  6. #6

    По умолчанию

    Чтобы TON (как и любой FB) обработал сигнал надо явно вызвать обработку.
    Т.е.:
    TON.IN := TRUE; TON(); соответствует TON(IN := TRUE);
    без TON() таймер не обработает сигнал

    Вы не думайте, что FB самостоятельные блоки.

    Код:
      T.IN := TRUE; T.PT := T#500ms;
    
      IF T.Q THEN
         // этот код никогда не выполнится т.к. таймер еще не работает
      END_IF
    
      T(); // Таймер в работе, именно здесь таймер может выставить Q
      IF T.Q THEN
         // этот код уже выполнится, но таймер не сбросится
         T.IN := FALSE;
      END_IF
    
      IF T.Q THEN
         // а здесь - сбросится, и на следующем цикле запуститься заново
         T(IN := FALSE); // После выполнения Q = FALSE и поэтому первое условие никогда не выполнится
      END_IF
    Аналог BLINK 1Hz:
    Код:
    T(IN := TRUE, PT := T#500ms);
    IF T.Q THEN  // Каждые 500ms bBlink инвертируется с перезапуском таймера
      bBlink := NOT bBlink; T(IN := FALSE);
    END_IF
    Последний раз редактировалось EFrol; 07.07.2023 в 12:05.

  7. #7

    По умолчанию

    EFrol,

    Спасибо за разъяснения. Все четко и понятно))

    Однако, сейчас попробовал установить таймер (код, который Вы отправили первый раз) внутри условия IF или инструкции CASE.
    Таймеры внутри CASE - не запустились, внутри условия IF - запустились, но не остановились

  8. #8

    По умолчанию

    А зачем код помещать внутрь IF?

  9. #9

    По умолчанию

    EFrol,

    Поправочка, в CASE - все работает,

    С условием IF - попробовал, вдруг может пригодится

    Думаю, тема сброса таймеров раскрыта полностью с хорошими объяснениями.

    Спасибо всем огромное), особенно EFrol за понятное объяснение и примеры
    Последний раз редактировалось ShikuS; 07.07.2023 в 14:20.

  10. #10

    По умолчанию

    Немного экспериментов: не на то я грешил, таймеры работали хорошо, но вот режим эмуляции в Codesys 3.5 порой работает некорректно, в частности при выполненных условиях не всегда меняет состояние переменных, живет своей жизнью. Как такое может быть? Или я что-то делаю не так?

    Например, для ключа старт, при любом значении верхнего уровняW_In_Start - TRUE (2 скрина в приложении: корректно и некорректно) :
    DW_In_Start := Sterilizer.SW_DVtank_LLevel AND NOT Sterilizer.SW_DVtank_HLevel; (TRUE:=TRUE AND NOT FALSE)
    А по факту (скрин) : (TRUE:=TRUE AND NOT TRUE)
    Изображения Изображения
    • Тип файла: jpg 04.jpg (12.0 Кб, Просмотров: 26)
    • Тип файла: jpg 05.jpg (10.7 Кб, Просмотров: 18)
    Последний раз редактировалось ShikuS; 08.07.2023 в 00:24.

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

Похожие темы

  1. Счетчик СИ-8, как сбросить?
    от Shelan в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 29.06.2022, 19:51
  2. ТРМ-10. Как сбросить настройки в заводские?
    от Anton441 в разделе Эксплуатация
    Ответов: 15
    Последнее сообщение: 15.04.2021, 04:47
  3. ТРМ-251 как сбросить к заводским установкам?
    от Владлэн в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 30.09.2019, 15:27
  4. Как сбросить уставку ТРМ202?
    от жекон в разделе Эксплуатация
    Ответов: 11
    Последнее сообщение: 30.12.2015, 00:12
  5. не могу сбросить плк-100
    от MCBK в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 16.12.2009, 13:54

Ваши права

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