73 lines
2.0 KiB
Smalltalk
73 lines
2.0 KiB
Smalltalk
(*
|
||
===============================================================================
|
||
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
|