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:\temp\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

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (x86, x64, ARM)

Tc2_Utilities (System)