Добавил Функции, сделал readme, повысил версию
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
(*
|
||||
===============================================================================
|
||||
Project : PLC_Library
|
||||
Device : -
|
||||
Path : Общие
|
||||
Name : QUEUE_I32
|
||||
Type : FUNCTION_BLOCK
|
||||
===============================================================================
|
||||
*)
|
||||
|
||||
FUNCTION_BLOCK QUEUE_I32
|
||||
(*
|
||||
Очередь FIFO на 32 элемента типа 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
|
||||
queue : ARRAY[0..n] OF INT;
|
||||
Head : INT; (* индекс чтения *)
|
||||
Tail : INT; (* индекс записи *)
|
||||
Count : INT; (* количество элементов *)
|
||||
END_VAR
|
||||
VAR CONSTANT
|
||||
n : INT := 31; (* 32 элемента *)
|
||||
END_VAR
|
||||
(*----- IMPLEMENTATION -----*)
|
||||
IF RST THEN
|
||||
Head := 0;
|
||||
Tail := 0;
|
||||
Count := 0;
|
||||
EMPTY := TRUE;
|
||||
FULL := FALSE;
|
||||
Dout := 0;
|
||||
ELSIF E THEN
|
||||
(* Извлечение *)
|
||||
IF POP AND NOT EMPTY THEN
|
||||
Dout := queue[Head];
|
||||
Head := Head + 1;
|
||||
IF Head > n THEN
|
||||
Head := 0;
|
||||
END_IF;
|
||||
Count := Count - 1;
|
||||
END_IF;
|
||||
(* Добавление *)
|
||||
IF PUSH AND NOT FULL THEN
|
||||
queue[Tail] := Din;
|
||||
Tail := Tail + 1;
|
||||
IF Tail > n THEN
|
||||
Tail := 0;
|
||||
END_IF;
|
||||
Count := Count + 1;
|
||||
END_IF;
|
||||
EMPTY := (Count = 0);
|
||||
FULL := (Count = n + 1);
|
||||
END_IF;
|
||||
END_FUNCTION_BLOCK
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
FUNCTION_BLOCK STACK_I16
|
||||
(*
|
||||
Стек на 16 элементов типа INT
|
||||
Стек LIFO на 16 элементов типа INT
|
||||
*)
|
||||
VAR_INPUT
|
||||
Din : INT; (* Переменная для записи в стек *)
|
||||
@@ -29,12 +29,11 @@ VAR
|
||||
pt : INT;
|
||||
END_VAR
|
||||
VAR CONSTANT
|
||||
n : INT := 15; (* changing this value will chage the number of stored elements in the fifo *)
|
||||
n : INT := 15; (* 16 элементов *)
|
||||
END_VAR
|
||||
|
||||
(*----- IMPLEMENTATION -----*)
|
||||
IF RST THEN
|
||||
(* asynchronous reset for the fifo *)
|
||||
pt := 0;
|
||||
EMPTY := TRUE;
|
||||
FULL := FALSE;
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
(*
|
||||
===============================================================================
|
||||
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
|
||||
Reference in New Issue
Block a user