56 lines
1.4 KiB
Smalltalk
56 lines
1.4 KiB
Smalltalk
(*
|
|
===============================================================================
|
|
Project : PLC_Library
|
|
Device : -
|
|
Path : Общие
|
|
Name : STACK_I16
|
|
Type : FUNCTION_BLOCK
|
|
===============================================================================
|
|
*)
|
|
|
|
FUNCTION_BLOCK STACK_I16
|
|
(*
|
|
Стек LIFO на 16 элементов типа 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 := 15; (* 16 элементов *)
|
|
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
|