Files
PLC_Library/plc_src/POU/Общие/STACK_I32.st
T

56 lines
1.4 KiB
Smalltalk

(*
===============================================================================
Project : PLC_Library
Device : -
Path : Общие
Name : STACK_I32
Type : FUNCTION_BLOCK
===============================================================================
*)
FUNCTION_BLOCK STACK_I32
(*
Стек LIFO на 32 элемента типа INT
*)
VAR_INPUT
Din : INT; (* Переменная для записи в стек *)
E : BOOL := TRUE; (* Включение стека *)
POP : BOOL; (* Извлечение из стека *)
PUSH : BOOL; (* Запись в стек *)
RST : BOOL; (* Обнуление стека *)
END_VAR
VAR_OUTPUT
Dout : INT; (* Значение, извлеченное из стека при POP *)
EMPTY : BOOL := TRUE; (* Флаг "стек пуст" *)
FULL : BOOL; (* Флаг "стек заполнен" (достигнут предел n) *)
END_VAR
VAR
stack: ARRAY[0..n] OF INT;
pt : INT;
END_VAR
VAR CONSTANT
n : INT := 31; (* 32 элемента *)
END_VAR
(*----- IMPLEMENTATION -----*)
IF RST THEN
pt := 0;
EMPTY := TRUE;
FULL := FALSE;
Dout := 0;
ELSIF E THEN
IF NOT EMPTY AND POP THEN
pt := pt - 1;
Dout := stack[pt];
EMPTY := pt = 0;
FULL := FALSE;
END_IF;
IF NOT FULL AND PUSH THEN
stack[pt] := Din;
pt := pt + 1;
FULL := pt > n;
EMPTY := FALSE;
END_IF;
END_IF;
END_FUNCTION_BLOCK