FB_FileRingBuffer

FB_FileRingBuffer 1:

Mit dem Funktionsbaustein FB_FileRingBuffer können Datensätze unterschiedlicher Länge in eine Ringpufferdatei geschrieben oder die vorher geschriebenen Datensätze aus der Ringpufferdatei ausgelesen werden. Die geschriebenen Datensätze werden nach dem FIFO-Prinzip in der gleichen Reihenfolge ausgelesen in der sie vorher in die Ringpufferdatei geschrieben wurden. D.h. beim Lesen werden zuerst die ältesten Einträge ausgelesen. Das Öffnen/Schließen/Schreiben/Lesen der Datensätze wird durch Aktionsaufrufe gesteuert. Der Funktionsbaustein besitzt folgende Aktionen:

Beim Öffnen der Ringpufferdatei wird bei einer existierenden Datei zuerst der Dateiheader gelesen. Bei einer Ringpufferdatei die vorher fehlerfrei geschlossen wurde muss das Bit 0 im Header.status.Bit 0 = Null sein. Bei einem anderen Wert wird angenommen, dass die Datei vorher nicht richtig geschlossen wurde und die korrupte Datei durch eine neue leere Datei ersetzt sowie das Header.status.Bit 1 = 1 gesetzt (file corrupted). Beim Schließen der Datei wird das Header.status.Bit 0 = 0 gesetzt und der komplette Dateiheader in der Datei aktualisiert.

VAR_INPUT

VAR_INPUT
    sNetId     : T_AmsNetId := '';
    sPathName  : T_MaxString := 'c:\Temp\data.dat';
    ePath      : E_OpenPath := PATH_GENERIC;
    nID        : UDINT := 0;
    cbBuffer   : UDINT := 16#100000;
    bOverwrite : BOOL := FALSE;
    pWriteBuff : POINTER TO BYTE;
    cbWriteLen : UDINT;
    pReadBuff  : POINTER TO BYTE;
    cbReadLen  : UDINT;
    tTimeout   : TIME := DEFAULT_ADS_TIMEOUT;
END_VAR

sNetId: Hier kann ein String mit der Netzwerkadresse des TwinCAT-Rechners angegeben werden, auf dem die Pufferdatei geschrieben/gelesen werden soll (Typ: T_AmsNetID). Für den lokalen Rechner kann auch ein Leerstring angegeben werden.

sPathName: Enthält den Pfad- und Dateinamen der zu öffnenden Pufferdatei (Typ: T_MaxString). Hinweis: Der Pfad kann nur auf das lokale File System des Rechners zeigen! Das bedeutet, Netzwerkpfade können hier nicht angegeben werden!

ePath: Über diesen Eingang kann ein TwinCAT - Systempfad auf dem Zielgerät zum Öffnen der Datei angewählt werden (Typ: E_OpenPath).

nID: Benutzerdefinierter 32 Bit Wert. Dieser Wert wird beim Öffnen einer neuen Datei in die Datei gespeichert und kann z.B. zur Versionsüberprüfung der Pufferdatei benutzt werden.

cbBuffer: Max. Bytegröße der zu öffnenden Pufferdatei. Dieser Parameter wird beim Erstellen der Datei in dem Dateiheader gespeichert und wird beim erneuten Öffnen derselben Datei überprüft. Sie können nur Dateien erneut öffnen, die mit der gleichen max. Puffergröße erstellt wurden. D.h. Sie können nicht eine Datei mit einer kleineren Puffergröße erstellen, mit Datensätzen füllen und mit einer größeren Puffergröße erneut öffnen. Wenn die Überprüfung der max. Puffergröße fehlschlägt wird automatisch eine neue Datei mit der neuen Puffergröße erstellt und geöffnet. Zusätzlich wird das Bit 1 (file corrupted) in dem Datei-Header-Status gesetzt.

bOverwrite: Schreibverhalten beim Erreichen der max. Dateipuffergröße. Bei TRUE an diesem Eingang werden die ältesten Einträge überschrieben wenn die max. Dateipuffergröße bereits erreicht wurde (es werden so lange Einträge gelöscht bis die freie Puffergröße ausreichend ist um den neuen Eintrag zu speichern). Beim FALSE an diesem Eingang wird ein Pufferüberlauf beim Erreichen der max. Dateipuffergröße als Fehler gemeldet.

pWriteBuff: 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 cbWriteLen-Datenbytes daraus entnommen werden können.

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

pReadBuff: 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 cbReadLen-Datenbytes aufnehmen kann. Die Bytegröße der Puffervariablen muss größer oder gleich der Größe des zu lesenden Datensatzes sein.

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

tTimeOut: Gibt die Timeout-Zeit an, die bei der Ausführung des ADS-Kommandos nicht überschritten werden darf.

VAR_OUTPUT

VAR_OUTPUT
    bBusy     : BOOL;
    bError    : BOOL;
    nErrId    : UDINT;
    cbReturn  : UDINT;
    stHeader  : ST_FileRBufferHead;
END_VAR

bBusy: Bei der Aktivierung des Funktionsbausteins wird dieser Ausgang gesetzt und bleibt gesetzt, bis eine Rückmeldung erfolgt.

bError: Sollte ein Fehler bei der Übertragung des Kommandos erfolgen, dann wird dieser Ausgang gesetzt, nachdem der bBusy-Ausgang zurückgesetzt wurde.

nErrId: Liefert bei einem gesetzten bError-Ausgang die ADS-Fehlernummer oder den Befehlsspezifischen Fehlercode (Tabelle).

cbReturn: Anzahl der erfolgreich gelesenen Value-Datenbytes. Beim Lesepuffer-Underflow-Fehler liefert dieser Ausgang die benötigte Lesepuffer-Bytegröße.

stHeader: Ringpuffer-Dateiheader/-Status. (Typ: ST_FileRBufferHead)

Befehlsspezifischen Fehlercodes

Fehlerbeschreibung

0x8000

Schreiben: Dateipuffer ist leer. Lesen: Dateipuffer-Overflow.

0x8001

SPS-Applikation: Lesepuffer-Underflow (pReadBuff, cbReadLen) ist zu klein dimensioniert.

0x8002

Ringpufferdatei ist geschlossen und muss zuerst geöffnet werden.

0x8003

Falscher Wert des Eingangsparameters.

Die SPS-Applikation muss den binären Aufbau der Datei nicht zwingend kennen. Folgende Grafik zeigt aber den prinzipiellen Aufbau der verwendeten Ringpufferdatei:

Header (48 Byte) siehe in der Beschreibung von ST_FileRBufferHead

Länge Datensatz 1
(4 Byte)

Datensatz 1

Länge Datensatz 2
(4 Byte)

Datensatz 2

Länge Datensatz 3
(4 Byte)

Datensatz 3

Länge Datensatz n
(4 Byte)

 

Datensatz n

Eine leere Ringpufferdatei beinhaltet nur den Header. Hinter dem Header folgt der eigentliche Puffer. Die Header.ptrFirst- und Header.ptrLast-Variable zeigt auf die nächste Position hinter dem Header. Beim Schreiben wird der ptrLast-Dateizeiger nach vorne bewegt. Der ptrFirst-Dateizeiger folgt dem ptrLast-Dateizeiger beim Lesen. Beim Erreichen der max. Puffergröße werden die Zeiger wieder zum Anfang des Puffers bewegt.

Beispiel:

Siehe: Beispiel: Datei-Ring-FiFo (FB_FileRingBuffer).

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (x86, x64, ARM)

Tc2_Utilities (System)