******* Таймеры ******* Таймеры используются для задержки сигналов или измерения времени. .. note:: В реализации таймеров используется системная переменная ``vs_timer``, которая увеличивается на ``T#@__PLC_TIME__@ms`` каждый цикл. Это обеспечивает измерение времени с точностью до одного цикла. .. _ton-timer: TON — Таймер включения ====================== Задерживает включение выходного сигнала после подачи входного сигнала. **Входные параметры:** - ``IN`` (BOOL) — входной сигнал для запуска таймера - ``PT`` (TIME) — время задержки **Выходные параметры:** - ``Q`` (BOOL) — выходной сигнал (TRUE после задержки) - ``ET`` (TIME) — текущее время (прошедшее с момента запуска) **Описание работы:** Блок TON (Timer On-Delay) используется для задержки включения выходного сигнала. Когда вход IN становится TRUE, таймер начинает отсчет времени. Пока текущее время V меньше PT, выход Q остается FALSE. Когда V достигает PT, выход Q становится TRUE. Если вход IN становится FALSE до окончания отсчета, таймер сбрасывается в 0. Выход ET показывает текущее значение времени. **Временная диаграмма:** .. figure:: image/ton.png :align: center :width: 600px **Пример использования:** .. code-table:: PROGRAM Example VAR ton1 : TON; start_signal : BOOL; output_signal : BOOL; elapsed_time : TIME; END_VAR ton1(IN := start_signal, PT := T#5s); output_signal := ton1.Q; elapsed_time := ton1.ET; END_PROGRAM **Внутренняя реализация:** Исходный код блока: .. code-table:: FUNCTION_BLOCK TON VAR_INPUT IN : BOOL; PT : TIME; END_VAR VAR_OUTPUT Q : BOOL; ET : TIME; END_VAR VAR V : TIME; END_VAR IF IN THEN IF V < PT AND vs_timer THEN V := V + T#@__PLC_TIME__@ms; END_IF; ELSE V := t#0ms; END_IF; IF V < PT THEN Q := FALSE; ELSE Q := TRUE; END_IF; ET := V; END_FUNCTION_BLOCK .. _tof-timer: TOF — Таймер выключения ======================= Задерживает выключение выходного сигнала после снятия входного сигнала. **Входные параметры:** - ``IN`` (BOOL) — входной сигнал - ``PT`` (TIME) — время задержки **Выходные параметры:** - ``Q`` (BOOL) — выходной сигнал (FALSE после задержки) - ``ET`` (TIME) — текущее время **Описание работы:** Блок TOF (Timer Off-Delay) используется для задержки выключения выходного сигнала. Когда вход IN становится TRUE, выход Q сразу становится TRUE, а таймер сбрасывается в 0. Когда вход IN становится FALSE, таймер начинает отсчет. Пока V меньше PT, выход Q остается TRUE. Когда V достигает PT, выход Q становится FALSE. Выход ET показывает текущее значение времени. **Временная диаграмма:** .. figure:: image/tof.png :align: center :width: 600px **Пример использования:** .. code-table:: PROGRAM Example VAR tof1 : TOF; start_signal : BOOL; output_signal : BOOL; elapsed_time : TIME; END_VAR tof1(IN := start_signal, PT := T#3s); output_signal := tof1.Q; elapsed_time := tof1.ET; END_PROGRAM **Внутренняя реализация:** Исходный код блока: .. code-table:: FUNCTION_BLOCK TOF VAR_INPUT IN : BOOL; PT : TIME; END_VAR VAR_OUTPUT Q : BOOL; ET : TIME; END_VAR VAR V : TIME; END_VAR IF IN THEN V := t#0ms; ELSE IF V < PT AND vs_timer THEN V := V + T#@__PLC_TIME__@ms; END_IF; END_IF; IF V < PT THEN Q := TRUE; ELSE Q := FALSE; END_IF; ET := V; END_FUNCTION_BLOCK .. _tp-timer: TP — Таймер-импульс =================== Формирует импульс заданной длительности при появлении входного сигнала. **Входные параметры:** - ``IN`` (BOOL) — входной сигнал (реагирует на передний фронт) - ``PT`` (TIME) — длительность импульса **Выходные параметры:** - ``Q`` (BOOL) — импульс заданной длительности - ``ET`` (TIME) — текущее время **Описание работы:** Блок TP (Timer Pulse) формирует импульс заданной длительности при обнаружении переднего фронта на входе IN. Когда на входе IN появляется TRUE, внутренний флаг SQ устанавливается в TRUE, и начинается отсчет времени. Пока SQ = TRUE и V < PT, выход Q остается TRUE. Когда V достигает PT, SQ сбрасывается в FALSE, и выход Q становится FALSE. Если на вход IN поступают новые импульсы во время работы таймера, они игнорируются. **Временная диаграмма:** .. figure:: image/tp.png :align: center :width: 600px **Пример использования:** .. code-table:: PROGRAM Example VAR tp1 : TP; trigger : BOOL; pulse_output : BOOL; elapsed_time : TIME; END_VAR tp1(IN := trigger, PT := T#2s); pulse_output := tp1.Q; elapsed_time := tp1.ET; END_PROGRAM **Внутренняя реализация:** Исходный код блока: .. code-table:: FUNCTION_BLOCK TP VAR_INPUT IN : BOOL; PT : TIME; END_VAR VAR_OUTPUT Q : BOOL; ET : TIME; END_VAR VAR SQ : BOOL; V : TIME; END_VAR IF SQ THEN IF V < PT AND vs_timer THEN V := V + T#@__PLC_TIME__@ms; END_IF; ELSE IF IN THEN SQ := TRUE; ELSE V := t#0ms; END_IF; END_IF; IF V >= PT THEN SQ := FALSE; END_IF; Q := SQ; ET := V; END_FUNCTION_BLOCK .. seealso:: :doc:`data_types` - для информации о типах TIME и BOOL.