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