Files

73 lines
2.0 KiB
Smalltalk
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(*
===============================================================================
Project : PLC_Library
Device : -
Path : Общие
Name : TOF_RST
Type : FUNCTION_BLOCK
===============================================================================
*)
FUNCTION_BLOCK TOF_RST
(*
Таймер выключения (TOF) с возможностью принудительного сброса RST.
При снятии IN выход Q остается TRUE еще в течение PT.
RST немедленно сбрасывает выход и таймер вне зависимости от IN.
*)
VAR_INPUT
IN: BOOL; // Управляющий сигнал
PT: TIME; // Время задержки выключения
RST: BOOL; // Принудительный сброс
END_VAR
VAR_OUTPUT
Q: BOOL; // Выход
ET: TIME; // Время работы таймера
END_VAR
VAR
_ton: TON;
prevIN: BOOL; // предыдущее состояние IN для детектирования фронта
timerRunning: BOOL; // TRUE идёт отсчёт задержки
END_VAR
(*----- IMPLEMENTATION -----*)
// Принудительный сброс наивысший приоритет
IF RST THEN
Q := FALSE;
timerRunning := FALSE;
prevIN := FALSE; // после RST не ловим задний фронт
_ton(IN := FALSE, PT := PT);
ET := _ton.ET;
RETURN;
END_IF
// Передний фронт IN отменяем задержку
IF IN AND NOT prevIN THEN
timerRunning := FALSE;
END_IF
// Задний фронт IN запускаем задержку
IF NOT IN AND prevIN THEN
timerRunning := TRUE;
END_IF
prevIN := IN;
// Запуск/работа таймера
_ton(IN := timerRunning, PT := PT);
ET := _ton.ET;
// Логика выхода
IF IN THEN
Q := TRUE;
timerRunning := FALSE;
ELSIF timerRunning THEN
IF _ton.Q THEN
Q := FALSE;
timerRunning := FALSE;
ELSE
Q := TRUE;
END_IF
ELSE
Q := FALSE;
END_IF
END_FUNCTION_BLOCK