61 lines
1.5 KiB
Smalltalk
61 lines
1.5 KiB
Smalltalk
(*
|
|
===============================================================================
|
|
Project : PLC_Library
|
|
Device : -
|
|
Path : Общие
|
|
Name : TP_RST
|
|
Type : FUNCTION_BLOCK
|
|
Exported : 2026-07-31 11:16:16
|
|
===============================================================================
|
|
*)
|
|
|
|
FUNCTION_BLOCK TP_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;
|
|
_ton(IN := FALSE, PT := PT);
|
|
ET := _ton.ET;
|
|
RETURN;
|
|
END_IF
|
|
|
|
// Передний фронт IN — запускаем импульс (только если не идёт уже)
|
|
IF IN AND NOT prevIN AND NOT timerRunning THEN
|
|
timerRunning := TRUE;
|
|
END_IF
|
|
|
|
prevIN := IN;
|
|
|
|
// Таймер вызывается каждый цикл
|
|
_ton(IN := timerRunning, PT := PT);
|
|
ET := _ton.ET;
|
|
|
|
// Логика выхода
|
|
IF timerRunning THEN
|
|
IF _ton.Q THEN
|
|
Q := FALSE;
|
|
timerRunning := FALSE;
|
|
ELSE
|
|
Q := TRUE;
|
|
END_IF
|
|
ELSE
|
|
Q := FALSE;
|
|
END_IF
|
|
END_FUNCTION_BLOCK
|