56 lines
1.3 KiB
Smalltalk
56 lines
1.3 KiB
Smalltalk
(*
|
|
===============================================================================
|
|
Project : PLC_Library
|
|
Device : -
|
|
Path : Общие
|
|
Name : STACK_I16
|
|
Type : FUNCTION_BLOCK
|
|
Exported : 2026-07-31 11:16:16
|
|
===============================================================================
|
|
*)
|
|
|
|
FUNCTION_BLOCK STACK_I16
|
|
(* стек на 16 элементов типа INT*)
|
|
VAR_INPUT
|
|
Din : INT; (* Переменная для записи в стек *)
|
|
E : BOOL := TRUE;(* Включение стека *)
|
|
POP : BOOL; (* Извлечение из стека *)
|
|
PUSH : BOOL; (* Запись в стек *)
|
|
RST : BOOL; (* Обнуление стека *)
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
Dout : INT;
|
|
EMPTY : BOOL := TRUE;
|
|
FULL : BOOL;
|
|
END_VAR
|
|
VAR
|
|
stack: ARRAY[0..n] OF INT;
|
|
pt : INT;
|
|
END_VAR
|
|
VAR CONSTANT
|
|
n : INT := 15; (* changing this value will chage the number of stored elements in the fifo *)
|
|
END_VAR
|
|
|
|
(*----- IMPLEMENTATION -----*)
|
|
IF RST THEN
|
|
(* asynchronous reset for the fifo *)
|
|
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
|