(* =============================================================================== 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