TON — один из самых используемых таймеров в программах ПЛК.Задержка включения двигателя, подтверждение аварии, фильтрация кратковременных сигналов, контроль превышения температуры — во всех этих задачах часто используется именно
TON.Но иногда возникает ситуация:
«На входе уже был TRUE, а таймер почему-то не сработал».
Разберём, как
TON работает на самом деле.━━━━━━━━━━━━━━━━━━
🔹 Что делает TON?
TON — это таймер задержки включения.Объявим экземпляр таймера:
VAR
fbTimer : TON;
xSignal : BOOL;
xAlarm : BOOL;
END_VAR
Вызовем его:
fbTimer(
IN := xSignal,
PT := T#5s
);
Основные параметры:
IN — вход запуска таймераPT — заданное время задержкиQ — выход таймераET — прошедшее времяВ нашем примере:
PT := T#5s
Это означает, что
IN должен непрерывно оставаться в состоянии TRUE в течение 5 секунд.━━━━━━━━━━━━━━━━━━
🔄 Что происходит после IN = TRUE?
Пока:
IN = FALSEтаймер находится в сброшенном состоянии:
Q = FALSE
ET = T#0s
Как только:
IN = TRUEначинается отсчёт времени.
Условно процесс выглядит так:
0 сек → ET = 0 сек
1 сек → ET = 1 сек
2 сек → ET = 2 сек
3 сек → ET = 3 сек
4 сек → ET = 4 сек
5 сек → ET = 5 сек
Пока:
ET < PT
выход:
Q = FALSE
Когда заданное время достигнуто:
ET ≥ PT
получаем:
Q = TRUE
Если
IN продолжает оставаться TRUE, выход Q тоже остаётся активным.━━━━━━━━━━━━━━━━━━
⚠️ Самая важная особенность TON
Теперь представим такую ситуацию:
xSignal = TRUE → 4.8 сек
xSignal = FALSE → 0.1 сек
xSignal = TRUE → снова
До заданных 5 секунд не хватило всего 0.2 секунды.
Что произойдёт?
Как только:
IN = FALSEобычный
TON сбрасывается:ET → T#0s
Q → FALSE
Когда
IN снова станет TRUE, отсчёт начнётся заново.Предыдущие 4.8 секунды таймер не запоминает.
━━━━━━━━━━━━━━━━━━
🧠 TON считает непрерывное время
Это ключевой момент.
TON не отвечает на вопрос:«Сколько всего времени сигнал был TRUE?»
Он отвечает:
«Как долго сигнал непрерывно находится в TRUE?»
Например:
TRUE → 3 сек
FALSE → 1 сек
TRUE → 3 сек
Суммарно сигнал был активен:
3 + 3 = 6 секунд
Но при:
PT := T#5s
выход
Q не станет TRUE.Потому что ни один непрерывный участок
TRUE не длился 5 секунд.━━━━━━━━━━━━━━━━━━
🏭 Практический пример: задержка аварии
Допустим, есть температура:
rTemperatureНужно сформировать аварию только в том случае, если температура выше 90 °C непрерывно держится 5 секунд.
Сначала получаем условие превышения:
xHighTemp := rTemperature > 90.0;
Затем запускаем таймер:
fbHighTemp(
IN := xHighTemp,
PT := T#5s
);
xAlarm := fbHighTemp.Q;
Что произойдёт?
Если температура кратковременно поднимется выше 90 °C, например на 300 мс:
xHighTemp = TRUE
таймер начнёт отсчёт.
Но как только температура снова опустится ниже 90 °C:
xHighTemp = FALSE
таймер сбросится.
Авария не появится.
Если же температура остаётся выше 90 °C непрерывно 5 секунд:
fbHighTemp.Q = TRUE
и сформируется аварийный сигнал.
Так
TON позволяет отфильтровать кратковременные выбросы.━━━━━━━━━━━━━━━━━━
⚠️ Частая ошибка: вызывать таймер только внутри IF
Иногда встречается такой код:
IF xSignal THEN
fbTimer(
IN := TRUE,
PT := T#5s
);
END_IF
Проблема в том, что когда
xSignal = FALSE, функциональный блок вообще не вызывается.Его входы и внутреннее состояние в этом цикле не обновляются обычным способом.