Example: File ring FIFO (FB_FileRingBuffer)

The complete sources can be found here: FileRingBufferExample.zip

The following example illustrates a simple application of the function block. The rising edge at bOpen opens an existing ring buffer file. If the file does not exist, a new one is created. The rising edge at bClose closes an open file. The rising edge at bCreate creates a new file. If you set bAdd = TRUE a new data record will be written into the ring buffer file, and when bRemove =TRUE the oldest data record is removed.

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

Requirements

Development environment

Target platform

PLC libraries to be integrated (category group)

TwinCAT v3.1.0

PC or CX (x86, x64, ARM)

Tc2_Utilities (System)