Beispiel: Datei-Ring-Fifo (FB_FileRingBuffer)
Die kompletten Sourcen finden Sie hier: FileRingBufferExample.zip
Folgendes Beispiel zeigt eine einfache Verwendung des Funktionsbausteins. Die steigende Flanke am bOpen öffnet eine existierende Ringpufferdatei. Wenn die Datei nicht existiert, wird eine neue erzeugt. Die steigende Flanke am bClose schließt eine geöffnete Datei. Die steigende Flanke am bCreate erzeugt eine neue Datei. Wenn Sie bAdd = TRUE setzen wird ein neuer Datensatz in die Ringpufferdatei geschrieben und beim bRemove=TRUE wird der älteste Datensatz entfernt.
PROGRAM MAIN
VAR
bOpen : BOOL;
bClose : BOOL;
bCreate : BOOL;
bAdd : BOOL;
bRemove : BOOL;
bGet : BOOL;
bReset : BOOL;
fbFileBuffer : FB_FileRingBuffer := ( sNetId := '',
sPathName := 'c:\tmp\Data.dat',
ePath := PATH_GENERIC,
nID := 1,
cbBuffer := 100, (*cbBuffer := 16#80000000, 2GB*)
bOverwrite := TRUE,
pWriteBuff := 0,
cbWriteLen := 0,
pReadBuff := 0,
cbReadLen := 0,
tTimeout := t#5s );
storeData : ARRAY[1..10] OF BYTE := 10(0);
cbStore : UDINT;
loadData : ARRAY[1..10] OF BYTE := 10(0);
cbLoad : UDINT;
i : INT;
END_VAR
fbFileBuffer( cbReturn => cbLoad );
IF NOT fbFileBuffer.bBusy THEN
IF bOpen THEN
bOpen := FALSE;
fbFileBuffer.A_Open();
END_IF
IF bClose THEN
bClose := FALSE;
fbFileBuffer.A_Close();
END_IF
IF bCreate THEN
bCreate := FALSE;
fbFileBuffer.A_Create();
END_IF
IF bAdd THEN
bAdd := FALSE;
(* modify data *)
FOR i:=1 TO 10 BY 1 DO
storeData[i] := storeData[i] + 1;
END_FOR
cbStore := SEL( cbStore > 1, SIZEOF(storeData), cbStore - 1 ); (* modify the data chunk length *)
fbFileBuffer.A_AddTail( pWriteBuff := ADR(storeData), cbWriteLen := cbStore,
pReadBuff := 0, cbReadLen:=0 );
END_IF
IF bRemove THEN
bRemove := FALSE;
fbFileBuffer.A_RemoveHead( pWriteBuff := 0, cbWriteLen := 0,
pReadBuff := ADR(loadData), cbReadLen := SIZEOF(loadData));
END_IF
IF bGet THEN
bGet := FALSE;
fbFileBuffer.A_GetHead( pWriteBuff := 0, cbWriteLen := 0,
pReadBuff := ADR(loadData), cbReadLen := SIZEOF(loadData));
END_IF
IF bReset THEN
bReset := FALSE;
fbFileBuffer.A_Reset();
END_IF
END_IF