PDA

Просмотр полной версии : Сбросить таймер TON



ShikuS
07.07.2023, 02:42
Здравствуйте!

Подскажите, пожалуйста, по работе таймера 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

Буду признателен за помощь.

Спасибо,

1exan
07.07.2023, 04:39
Здравствуйте!

Подскажите, пожалуйста, по работе таймера 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();

Cs-Cs
07.07.2023, 06:36
Я таймеры сбрасывал записью FALSE в IN и нуля в PT. После этого их надо вызвать хоть один цикл, чтобы изменения вступили в силу.
Потомм я написал свой FB-обёртку на базе штатных таймеров, у которого сразу есть вход Reset.

EFrol
07.07.2023, 09:17
Здравствуйте!

Подскажите, пожалуйста, по работе таймера 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

ShikuS
07.07.2023, 11:22
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; -проходит

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

EFrol
07.07.2023, 11:49
Чтобы 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

ShikuS
07.07.2023, 13:04
EFrol,

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

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

EFrol
07.07.2023, 13:45
А зачем код помещать внутрь IF?

ShikuS
07.07.2023, 13:57
EFrol,

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

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

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

Спасибо всем огромное), особенно EFrol за понятное объяснение и примеры

ShikuS
07.07.2023, 23:03
Немного экспериментов: не на то я грешил, таймеры работали хорошо, но вот режим эмуляции в 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)

Валенок
08.07.2023, 11:17
ну и где на картинке "нот труе"?

ShikuS
08.07.2023, 14:33
Валенок,

на картинке 05 (вторая):
TRUE = TRUE AND NOT FALSE ( т.е. TRUE) - все правильно

на картинке 04 (первая):
TRUE = TRUE AND NOT TRUE ( т.е. FALSE) - не должно быть такого, это же не OR

kondor3000
08.07.2023, 16:05
на картинке 04 (первая):
TRUE = TRUE AND NOT TRUE ( т.е. FALSE) - не должно быть такого, это же не OR

Вот тестовый проект, с упрощениями, всё правильно работает 68730
Сделайте очистить всё, компилировать всё, потом проверяйте.
Или проект выкладывайте.

Валенок
08.07.2023, 17:24
..
Ну и показывайте картинку с ТОЧКОЙ ОСТАНОВА СРАЗУ ПОСЛЕ ВЫПОЛНЕНИЯ данной строки (а не цикла)

ShikuS
09.07.2023, 15:31
kondor3000,
Спасибо за проверку. Да, все проходит хорошо, когда только данный код проверяю, однако, когда в проекте, то то что показал. Также проверил, как написал Валенок, с точкой останова после строки. Без цикла все отрабатывает хорошо. Возможно некая специфика Codesys

Валенок,

Вы правы, если ставлю точку останова после строки, то все проходит хорошо, а в цикле почему то нет. Видимо такова специфика. Спасибо

kondor3000
09.07.2023, 17:23
kondor3000,
Спасибо за проверку. Да, все проходит хорошо, когда только данный код проверяю, однако, когда в проекте, то то что показал. Также проверил, как написал Валенок, с точкой останова после строки. Без цикла все отрабатывает хорошо. Возможно некая специфика Codesys


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

Валенок
09.07.2023, 21:48
Только программа

a:=2;
b:=2;
c:=a+b;
c:=17;
Кодесис не умеет считать!!!

Эти квадратики со значениями - реальное зло. Если интересует что то промежуточное - или явное выделение или пошагово. Остальное мусор для глаз.

ShikuS
10.07.2023, 01:08
kondor3000, Валенок,

Спасибо за комментарии, очень помогли на текущем этапе.

В рамках данной темы вопросы разрешены в положительном ключе.


kondor3000,
Ваш комментарий : Сделайте очистить всё, компилировать всё, потом проверяйте. - также исправляет то, о чем писал ранее

Всем спасибо!