# LGF_LIFO (FB / 4.0.0)

Übersicht

Autor: Siemens Industry Support

## Kurzbeschreibung

LIFO (Last-In First-Out / Stack / Stapelspeicher)
Die Funktion speichert eingehende Daten und gibt die aktuellsten / letzten noch nicht abgearbeiteten Daten aus.

### Baustein Schnittstelle

| LGF_LIFO (FB) |
--- | --- | ---
Bool |  |  | enable |  | valid |  |  | Bool
Bool |  |  | push |  | busy |  |  | Bool
Bool |  |  | pop |  | error |  |  | Bool
Bool |  |  | peek |  | status |  |  | Word
Bool |  |  | reset |  | elementCount |  |  | DInt
Bool |  |  | clear |  | isEmpty |  |  | Bool
Variant |  |  | initialItem |  | isFull |  |  | Bool
|  |  |  |  | diagnostics |  |  | LGF_typeDiagnostics
Variant |  |  | item |  |  | Variant
Variant |  |  | buffer |  |  | Variant

### Input Parameter

Bezeichner | Datentyp | Default Wert | Beschreibung
--- | --- | --- | ---
enable | Bool | FALSE | TRUE: Aktiviert die Funktionalität des FB
push | Bool | false | Daten in den Puffer schieben
pop | Bool | false | Daten aus dem Puffer holen
peek | Bool | false | Daten im Puffer ansehen (Der Puffer wird nicht verändert)
reset | Bool | FALSE | Puffer initialisieren (Index und Zähler zurücksetzen)
clear | Bool | FALSE | Puffer leeren und mit Anfangswert `initialItem` initialisieren (Index und Zähler zurücksetzen).
initialItem | Variant | --- | Wert mit dem das Array des Puffers initialisiert wird (meistens: `0` / default wert)

### Output Parameter

Bezeichner | Datentyp | Beschreibung
--- | --- | ---
valid | Bool | TRUE: Ausgabewerte am FB gültig
busy | Bool | TRUE: FB ist aktive und neue Ausgabewerte können erwartet werden.
error | Bool | FALSE: Kein Fehler TRUE: Während der Ausführung des FB ist ein Fehler aufgetreten
status | Word | 16#0000-16#7FFF: Status des FB 16#8000-16#FFFF: Fehleridentifikation (siehe folgende Tabelle)
elementCount | DInt | Anzahl der Elemente im Puffer
isEmpty | Bool | TRUE: Puffer ist leer
isFull | Bool | TRUE: Puffer ist voll
diagnostics | LGF_typeDiagnostics | Diagnosestruktur zur Speicherung und Übertragung von Diagnoseinformationen von Blöcken über die Schnittstelle.

### In/Out Parameter

Bezeichner | Datentyp | Beschreibung
--- | --- | ---
item | Variant | Eintrag, der aus dem Puffer zurückgegeben wird oder in den Puffer geschrieben werden soll
buffer | Variant | Das ARRAY welches als Puffer genutzt wird. (Array of … )

### Status & Error Meldungen

Code / Wert | Bezeichner / Beschreibung
--- | ---
16#0000 | STATUS_NO_ERROR Status: Abarbeitung ohne Fehler beendet
16#7000 | STATUS_NO_CURRENT_JOBS Status: Keine aktuellen Aufträge, Initial State
16#7001 | STATUS_FIRST_CALL Erstaufruf nach steigender Flanke
16#7002 | STATUS_SUBSEQUENT_CALL Status: Unteraufruf ohne weitere Detail Information
16#8001 | ERR_BUFFER_EMPTY Fehler: Der Puffer ist leer
16#8002 | ERR_BUFFER_FULL Fehler: Der Puffer ist voll
16#8200 | ERR_NO_ARRAY Fehler: Am Eingang `buffer` liegt kein Array an.
16#8201 | ERR_WRONG_TYPE_ITEM Fehler: Der Datentyp des InOut-Parameters `item` entspricht nicht dem Datentyp der Array-Elemente des Eingangs `buffer`.
16#8202 | ERR_WRONG_TYPE_INITIAL_ITEM Fehler: Der Datentyp des Eingangs `initialItem` entspricht nicht dem Datentyp des InOut-Parameters `item`.
16#8203 | ERR_BOOL_NOT_SUPPORTED Fehler: Boolesche Variablen und Arrays werden von `MOVE_BLOCK_VARIANT` nicht unterstützt. (Verwenden Sie stattdessen einen PLC-Datentyp)
16#8204 | ERR_MULTIPLE_COMMANDS_DEDECTED Fehler: Mehrere Kommandos zur gleichen Zeit erkannt
16#8600 | ERR_UNDEFINED_STATE Fehler: Unbekannter Zustand in der Statemashine
16#8601 | ERR_INDEX_IN_ARRAY_LIMITS_1 Fehler: Die Variable `statLastItemIndex` liegt ausserhalb der Array Grenzen
16#8602 | ERR_INDEX_IN_ARRAY_LIMITS_2 Fehler: Die Variable `statElementCount` liegt ausserhalb der Array Grenzen
16#8610 | ERR_CLEAR_BUFFER Fehler: Während des Ablöschens des Puffers in Funktion `MOVE_BLK_VARIANT` - weitere Infos in `subFunctionStatus`
16#8611 | ERR_RETURN_LAST_ENTRY Fehler: Während der Rückgabe des letzten Elements aus dem Puffer in Funktion `MOVE_BLK_VARIANT` - weitere Infos in `subFunctionStatus` (POP & PEEK)
16#8612 | ERR_POP_REPLACE_ITEM_BY_INIT_VALUE Fehler: Während des Überschreibens des Elements mit dem Initialwert in Funktion `MOVE_BLK_VARIANT` - weitere Infos in `subFunctionStatus (POP)
16#8613 | ERR_WRITE_ENTRY Fehler: Während des Schreibens eines Elements in den Puffer in Funktion `MOVE_BLK_VARIANT` - weitere Infos in `subFunctionStatus` (PUSH)

## Benutzer definierte Datentypen

### LGF_typeDiagnostics (UDT / V1.0.1)

Diagnosestruktur zur Speicherung und Übertragung von Diagnoseinformationen von Blöcken über die Schnittstelle.

Bezeichner | Datentyp | Default Wert | Beschreibung
--- | --- | --- | ---
status | Word | 16#0000 | Status des Bausteins oder Fehleridentifikation beim Auftreten des Fehlers
subfunctionStatus | Word | 16#0000 | Status oder Rückgabewert von aufgerufenen FB's, FC's und Systembausteinen
stateNumber | DInt | 0 | Zustand in der Zustandsmaschine des Blocks, in dem der Fehler aufgetreten ist

## Funktionsbeschreibung

Hinweis
  In `subFunctionStatus` wird der Status von aufgerufenen Anweisungen ausgegeben. Der Ausgangswert in `status` gibt in diesem Fall an, welche Anweisung den Fehler verursacht hat. Holen Sie sich in diesem Fall die Informationen aus der TIA Portal Online Hilfe zu den jeweiligen Anweisungen.

Hinweis
  Der Stack in der Informatik beruht ebenfalls auf dem LIFO-Prinzip.

Mit dem Eingang `push` wird ein neues Element vom InOut-Parameter `item` an der nächsten freien Stelle im Puffer gespeichert. Der Ausgang `elementCount` wird um eins inkrementiert.

Mit dem Eingang `pop` wird am InOut-Parameter `item` das aktuellste / letzte Element ausgegeben und dieses Feld im Puffer durch den Wert am Parameter `initialItem` ersetzt. Der Ausgang `elementCount` wird um eins dekrementiert.

Der Eingang `peek` ermöglicht das Auslesen des letzten Eintrags im Puffer. Der Puffer wird dabei nicht verändert.

Mit dem Eingang `reset` wird der Puffer initialisiert, Index und Zähler werden zurückgesetzt. Der Ausgang `elementCount` wird auf null und der Ausgang `isEmpty` wird auf TRUE gesetzt.

Mit dem Eingang `clear` wird der Puffer geleert und mit Anfangswert `initialItem` initialisiert. Index und Zähler werden zurückgesetzt. Der Ausgang `elementCount` wird auf null, der Ausgang `isEmpty` auf TRUE gesetzt.

## Änderungshistorie

Version & Datum | Änderungsbeschreibung
--- | ---
| 1.0.0 | Siemens Industry Online Support
| 10.07.2018 | First released version
| 1.0.1 | Siemens Industry Online Support
| 17.08.2018 | Upgrade: TIA V15 Update 2
| 1.0.2 | Siemens Industry Online Support
| 23.11.2018 | Upgrade: TIA V15.1
| 2.0.0 | Siemens Industry Online Support
| 29.01.2019 | Output "done" removed (not necessary, because block works synchronous)
| 3.0.0 | Simatic Systems Support
| 22.10.2019 | Code refactoring, comments added Interface change (push, pop, peek etc.) Set version to V3.0.0, harmonize the version of the whole library
| 3.0.1 | Simatic Systems Support
| 15.02.2021 | Insert documentation
| 4.0.0 | Simatic Systems Support
| 04.09.2024 | Rework to PLC Open `Enable` behavior Add `isFull` outputs Rework to diagnostic output datatype