Beispiel: Memory-Ring-Fifo (FB_MemRingBufferEx)

Die kompletten Sourcen finden Sie hier: MemRingBufferExExample.zip

 

Bei einer steigenden Flanke am bAdd werden neue Datenelemente (pubObj-Array) in den Ringpuffer abgelegt. Über eine steigende Flanke am bGet kann das älteste Datenelement in die getObj-Variable kopiert werden. Die nicht benötigten Datenelemente werden über eine steigende Flanke am bRelease aus dem Puffer entfernt.

 

PROGRAM MAIN
VAR
    fbBuffer        : FB_MemRingBufferEx;
    buffer      : ARRAY[0..30] OF BYTE;
    bAdd, bGet, bRelease, bReset, bGetFree : BOOL;
    putObj      : ARRAY[0..3] OF BYTE := 16#00, 16#AA, 16#BB, 16#CC;
    getObj      : ARRAY[0..3] OF BYTE := 4(0);
    bOk         : BOOL;
    nCount      : UDINT;
    cbSize      : UDINT;
    cbFree      : UDINT;
END_VAR

 

IF bAdd THEN
    bAdd := FALSE;
    putObj[0] := putObj[0] + 1;(* modify data *)
    fbBuffer.A_AddTail(pBuffer := ADR( buffer ), cbBuffer := SIZEOF( buffer ),
            pWrite := ADR( putObj ), cbWrite := SIZEOF( putObj ),
            bOk=>bOk, nCount=>nCount, cbSize=>cbSize, cbFree=>cbFree );
    IF fbBuffer.bOk THEN
        ;(* Success *)
    ELSE
        ;(* Buffer overflow *)
    END_IF
END_IF

IF bGet THEN
    bGet := FALSE;
    fbBuffer.A_GetHead(pBuffer := ADR( buffer ), cbBuffer := SIZEOF( buffer ),
            bOk=>bOk, nCount=>nCount, cbSize=>cbSize, cbFree=>cbFree );
    IF fbBuffer.bOk THEN
        (* Success *)
        MEMCPY( ADR( getObj ), fbBuffer.pRead, MIN( SIZEOF( getObj ), fbBuffer.cbRead ) );
    ELSE
        ;(* Buffer empty *)
    END_IF
END_IF

IF bRelease THEN
    bRelease := FALSE;
    fbBuffer.A_FreeHead( pBuffer := ADR( buffer ), cbBuffer := SIZEOF( buffer ),
            bOk=>bOk, nCount=>nCount, cbSize=>cbSize, cbFree=>cbFree );
    IF fbBuffer.bOk THEN
        ;(* Success *)
    ELSE
        ;(* Buffer empty *)
    END_IF
END_IF

IF bGetFree THEN
    bGetFree := FALSE;
    fbBuffer.A_GetFreeSize(pBuffer := ADR( buffer ), cbBuffer := SIZEOF( buffer ),
            bOk=>bOk, nCount=>nCount, cbSize=>cbSize, cbFree=>cbFree );
END_IF

IF bReset THEN
    bReset := FALSE;
    fbBuffer.A_Reset(       pBuffer := ADR( buffer ), cbBuffer := SIZEOF( buffer ),
            bOk=>bOk,nCount=>nCount, cbSize=>cbSize, cbFree=>cbFree );
END_IF