# LGF_LIFO (FB / 4.0.0)

Overview

Author: Siemens Industry Support

## Short description

LIFO (Last-In First-Out / Stack buffer memory)
This function stores incoming data and outputs the latest/most recent not-yet-processed data.

### Block Interface

| 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

Identifier | Data type | Default value | Description
--- | --- | --- | ---
enable | Bool | FALSE | TRUE: Enable functionality of FB
push | Bool | false | Push item to the buffer
pop | Bool | false | Pop item from the buffer
peek | Bool | false | Peek item from the buffer (buffer not changed/modified)
reset | Bool | FALSE | Initializing the buffer (reset the index and the counter)
clear | Bool | FALSE | Clearing the buffer and initialize with the initial value `initialItem` (Reset index and counter).
initialItem | Variant | --- | Value with which the ARRAY of the buffer is initialized (usually: `0` / default value)

### Output parameter

Identifier | Data type | Description
--- | --- | ---
valid | Bool | TRUE: Valid set of output values available at the FB
busy | Bool | TRUE: FB is active and new output values can be expected
error | Bool | FALSE: No error TRUE: An error occurred during the execution of the FB
status | Word | 16#0000-16#7FFF: Status of the FB 16#8000-16#FFFF: Error identification (see following Table)
elementCount | DInt | Number of elements in the buffer
isEmpty | Bool | TRUE: Buffer is empty
isFull | Bool | TRUE: Buffer is full
diagnostics | LGF_typeDiagnostics | Diagnostic structure to store and transfer diagnostic information from blocks through the interface.

### In/Out parameter

Identifier | Data type | Description
--- | --- | ---
item | Variant | The entry that is either returned from the ring buffer or written into the buffer
buffer | Variant | The ARRAY that is used as the ring buffer. (Array of…)

### Status & Error codes

Code / Value | Identifier / Description
--- | ---
16#0000 | STATUS_NO_ERROR Status: Execution finished without errors
16#7000 | STATUS_NO_CURRENT_JOBS Status: No current jobs, initial state
16#7001 | STATUS_FIRST_CALL First call after incoming new job (rising edge 'enable')
16#7002 | STATUS_SUBSEQUENT_CALL Status: Subsequent call during active processing without further details
16#8001 | ERR_BUFFER_EMPTY Error: The buffer is empty
16#8002 | ERR_BUFFER_FULL Error: The buffer is full
16#8200 | ERR_NO_ARRAY Error: No array is present at the input `buffer`
16#8201 | ERR_WRONG_TYPE_ITEM Error: The data type of the InOut parameter `item` does not correspond to the data type of the array elements of the input `buffer`
16#8202 | ERR_WRONG_TYPE_INITIAL_ITEM Error: The data type of the input `initialValue` does not correspond to the data type of the InOut parameter `item`
16#8203 | ERR_BOOL_NOT_SUPPORTED Error: Boolean variables and arrays are not supported by `MOVE_BLOCK_VARIANT`. (Use a PLC Datatype instead)
16#8204 | ERR_MULTIPLE_COMMANDS_DEDECTED Error: Multiple commands in the same cycle detected
16#8600 | ERR_UNDEFINED_STATE Error: Due to an undefined state in state machine
16#8601 | ERR_INDEX_IN_ARRAY_LIMITS_1 Error: The tag `statLastItemIndex` is not within the array limits
16#8602 | ERR_INDEX_IN_ARRAY_LIMITS_2 Error: The tag `statElementCount` is not within the array limits
16#8610 | ERR_CLEAR_BUFFER Error: While clearing buffer in block `MOVE_BLK_VARIANT` - check `subFunctionStatus` code
16#8611 | ERR_RETURN_LAST_ENTRY Error: While return first entry of buffer in block `MOVE_BLK_VARIANT` - check `subFunctionStatus` code (POP & PEEK)
16#8612 | ERR_POP_REPLACE_ITEM_BY_INIT_VALUE Error: While replace item by initial value in block `MOVE_BLK_VARIANT` - check `subFunctionStatus` code (POP)
16#8613 | ERR_WRITE_ENTRY Error: While write entry to buffer in block `MOVE_BLK_VARIANT` - check `subFunctionStatus` code (PUSH)

## User defined datatype(s)

### LGF_typeDiagnostics (UDT / V1.0.1)

Diagnostic structure to store and transfer diagnostic information from blocks through the interface.

Identifier | Data type | Default value | Description
--- | --- | --- | ---
status | Word | 16#0000 | Status of the Block or error identification when error occurred
subfunctionStatus | Word | 16#0000 | Status or return value of called FB's, FC's and system blocks
stateNumber | DInt | 0 | State in the state machine of the block where the error occurred

## Functional description

NOTE
  The status of called commands is output in `subFunctionStatus`. In this case, the output value in `status` indicates which command caused the error. In this case, refer to the TIA Portal Online Help section for information on the respective commands.

NOTE
  I computer science the stack is also based on the LIFO principle.

With the `push` input, a new item is stored from the InOut parameter `item` in the next free position in the buffer. The output `elementCount` is incremented by one.

With the `pop` input, the latest / most recent item is output to the InOut parameter `item`, and this field in the buffer is replaced by the value at the parameter `initialItem`. The output `elementCount` is decremented by one.

The `peek` input allows the last entry in the buffer to be read out. The buffer is not changed.

With the `reset` input, the buffer is initialized, and the index and counter are reset. The `elementCount` output is set to zero and the `isEmpty` output is set to TRUE.

With the `clear` input, the buffer is emptied and initialized with the initial value `initialItem`. Index and counter are reset. The `elementCount` output is set to zero and the `isEmpty` output is set to TRUE.

## Change log

Version & Date | Change description
--- | ---
| 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