69 lines
1.7 KiB
Smalltalk
69 lines
1.7 KiB
Smalltalk
(*
|
|
===============================================================================
|
|
Project : PLC_Library
|
|
Device : -
|
|
Path : Общие
|
|
Name : TOF_RST
|
|
Type : FUNCTION_BLOCK
|
|
Exported : 2026-07-31 11:16:16
|
|
===============================================================================
|
|
*)
|
|
|
|
FUNCTION_BLOCK TOF_RST
|
|
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
|