FB_FileRingBuffer
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:
- A_Open (Öffnet eine vorhandene Ringpufferdatei zum Anhängen oder Erzeugen neuer Datensätze. Wenn die Datei bereits geöffnet ist wird kein Fehler zurückgemeldet. )
- A_Close (Schließt eine geöffnete Ringpufferdatei. Wenn die Datei bereits geschlossen ist wird kein Fehler zurückgemeldet. )
- A_Create (Öffnet eine neue Ringpufferdatei. Wenn die Datei bereits existiert, wird sie überschrieben. Wenn die Datei bereits geöffnet ist wird kein Fehler zurückgeliefert)
- A_AddTail (Schreibt einen neuen Datensatz in die Ringpufferdatei. )
- A_GetHead (Liest den ältesten Datensatz aus der Ringpufferdatei, entfernt ihn aber nicht (der Dateizeiger wird nicht zum nächsten Datensatz bewegt). )
- A_RemoveHead (Liest und entfernt den ältesten Datensatz aus der Ringpufferdatei (der Dateizeiger wird zum nächsten Datensatz bewegt).)
- A_Reset (Löscht alle Datensätze in einer geöffneten Ringpufferdatei. Es werden lediglich die Dateizeiger und die Anzahl der Datensätze zurückgesetzt, die vorhandene physikalische Dateigröße wird nicht verändert (die alten Datensätze werden aber mit neuen überschrieben).
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 : DWORD;
cbWriteLen : UDINT;
pReadBuff : DWORD;
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. Für den lokalen Rechner kann auch ein Leerstring angegeben werden.
sPathName: Enthält den Pfad- und Dateinamen der zu öffnenden Pufferdatei.
![]() | 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.
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 ADS-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.
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 |
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.
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v2.10.0 Build > 1313 | PC oder CX (x86, ARM) | TcUtilities.Lib |