67 lines
1.6 KiB
Smalltalk
67 lines
1.6 KiB
Smalltalk
(*
|
|
===============================================================================
|
|
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
|