65 lines
1.8 KiB
Smalltalk
65 lines
1.8 KiB
Smalltalk
(*
|
||
===============================================================================
|
||
Project : PLC_Library
|
||
Device : -
|
||
Path : Общие
|
||
Name : TP_RST
|
||
Type : FUNCTION_BLOCK
|
||
===============================================================================
|
||
*)
|
||
|
||
FUNCTION_BLOCK TP_RST
|
||
(*
|
||
Формирователь одиночного импульса (TP) длительностью PT с возможностью принудительного сброса RST.
|
||
Повторный передний фронт IN во время выполнения импульса игнорируется.
|
||
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
|