FB_MemStackBuffer

FB_MemStackBuffer 1:

Mit dem Funktionsbaustein FB_MemStackBuffer können Datensätze unterschiedlicher Länge in einen Puffer geschrieben oder die vorher geschriebenen Datensätze aus dem Puffer ausgelesen werden. Die geschriebenen Datensätze werden nach dem LIFO-Prinzip (Last In - First Out) in der umgekehrten Reihenfolge ausgelesen in der sie vorher in den Puffer geschrieben wurden. D.h. beim Lesen werden zuerst die neuesten Einträge ausgelesen. Der Pufferspeicher wird dem Funktionsbaustein über die pBuffer und cbBuffer-Eingangsvariablen zur Verfügung gestellt. Das Schreiben/Lesen der Datensätze wird durch Aktionsaufrufe gesteuert. Der Funktionsbaustein besitzt folgende Aktionen:

VAR_INPUT

VAR_INPUT
    pWrite    : POINTER TO BYTE;
    cbWrite   : UDINT;
    pRead     : POINTER TO BYTE;
    cbRead    : UDINT;
    pBuffer   : POINTER TO BYTE;
    cbBuffer  : UDINT;
END_VAR

pWrite: Adresse der SPS-Variablen oder einer Puffervariablen, die die zu schreibenden Value-Daten enthält. Die Adresse kann mit dem ADR-Operator ermittelt werden. Der Programmierer ist selbst dafür verantwortlich die Puffervariable so zu dimensionieren, dass cbWrite-Datenbytes daraus entnommen werden können.

cbWrite: Anzahl der zu schreibenden Value-Datenbytes ( Bei Stringvariablen inklusive der abschließenden Null ).

pRead: Adresse der SPS-Variablen oder einer Puffervariablen in welche die gelesenen Value-Daten hineinkopiert werden sollen. Die Adresse kann mit dem ADR-Operator ermittelt werden. Der Programmierer ist selbst dafür verantwortlich die Puffervariable so zu dimensionieren, dass diese cbRead-Datenbytes aufnehmen kann. Die Bytegröße der Puffervariablen muss größer oder gleich der Größe des zu lesenden Datensatzes sein.

cbRead: Anzahl der zu lesenden Value-Datenbytes. Bei einer zu kleinen Puffergröße werden keine Daten kopiert, der Funktionsbaustein meldet einen Puffer-Underflow-Fehler (bOk = FALSE ) und die benötigte Puffergröße für den nächsten zu lesenden Datensatz wird am cbReturn-Ausgang zurückgeliefert.

pBuffer: Adresse einer SPS-Variablen (z.B. ARRAY[...] OF BYTES ) die vom Funktionsbaustein als Pufferspeicher benutzt werden soll. Die Adresse kann mit dem ADR-Operator ermittelt werden.

cbBuffer: Maximale Bytegröße der SPS-Variablen die als Pufferspeicher benutzt werden soll. Die Größe kann mit dem SIZEOF-Operator ermittelt werden.

VAR_OUTPUT

VAR_OUTPUT
    bOk      : BOOL;
    nCount   : UDINT;
    cbSize   : UDINT;
    cbReturn : UDINT;
END_VAR

bOk: Liefert TRUE wenn ein neuer Datensatz erfolgreich hinzugefügt oder entfernt werden konnte und FALSE beim Puffer-Überlauf oder wenn keine Einträge im Puffer mehr vorhanden sind.

nCount: Liefert die aktuelle Anzahl der gepufferten Datensätze.

cbSize: Liefert die aktuelle Anzahl der belegten Datenbytes im Puffer. Die Anzahl der belegten Datenbytes ist immer größer als die tatsächliche Anzahl der geschriebenen Value-Daten. Jeder Datensatz wird um zusätzliche Informationen ergänzt um ihn später lokalisieren zu können.

cbReturn: Anzahl der erfolgreich gelesenen Value-Datenbytes. Beim Lesepuffer-Underflow-Fehler liefert dieser Ausgang die benötigte Lesepuffer-Bytegröße. In diesem Fall ist die cbRead-Länge zu klein dimensioniert.

Beispiel:

Folgendes Beispiel zeigt eine einfache Verwendung des Funktionsbausteins. Es sollen Strings unterschiedlicher Länge gepuffert werden. Die steigende Flanke am bReset löscht den Puffer. Wenn Sie bAdd = TRUE setzen werden 10 neue Strings in den Puffer geschrieben und beim bRemove=TRUE wird der zuletzt geschriebene String aus dem Puffer entfernt. Bei einer steigenden Flanke am bGet wird der zuletzt geschriebene String gelesen aber nicht entfernt.

Deklarationsteil:

PROGRAM MAIN
VAR
    buffer   : ARRAY[0..1000] OF BYTE;
    fbStack  : FB_MemStackBuffer;
    bReset   : BOOL := TRUE;
    bAdd     : BOOL := TRUE;
    bGet     : BOOL := TRUE;
    bRemove  : BOOL := TRUE;
    putEntry : ARRAY[0..9] OF STRING(20) := ['Str_1', 'Str_2', 'Str_3', 'Str_4', 'Str_5', 'Str_6', 'Str_7', 'Str_8', 'Str_9', 'Str_10'];
    getEntry : STRING;
    i        : UDINT;
END_VAR

Programmcode:

IF bReset THEN(* Clear buffer *)
    bReset := FALSE;
    fbStack.A_Reset( pBuffer := ADR( buffer ), cbBuffer := SIZEOF( buffer ) );
END_IF

IF bAdd THEN(* Add entries *)
    bAdd := FALSE;
    FOR i:= 0 TO 9 BY 1 DO
        fbStack.A_Push( pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), pWrite := ADR(putEntry[i]), cbWrite := LEN(putEntry[i]) + 1 );
        IF fbStack.bOk THEN(* Success *)
            ;
        ELSE(* Buffer overflow *)
            ;
        END_IF
    END_FOR
END_IF

IF bGet THEN(* Peek newest entry *)
    bGet := FALSE;
    fbStack.A_Top( pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), pRead := ADR(getEntry), cbRead := SIZEOF(getEntry) );
    IF fbStack.bOk THEN(* Success *)
        ;
    ELSE(* Buffer is empty *)
        ;
    END_IF
END_IF

IF bRemove THEN(* Remove newest entry *)
    bRemove := FALSE;
    fbStack.A_Pop( pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), pRead := ADR(getEntry), cbRead := SIZEOF(getEntry) );
    IF fbStack.bOk THEN(* Success *)
        ;
    ELSE(* Buffer is empty *)
        ;
    END_IF
END_IF

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (x86, x64, ARM)

Tc2_Utilities (System)