Beispiel: Memory-Ring-FiFo (FB_MemRingBufferEx)
Hier können Sie die kompletten Sourcen entpacken: MemRingBufferExExample.zip
Bei einer steigenden Flanke am bAdd werden neue Datenelemente (pubObj-Array) in den Ringpuffer abgelegt. Dach kann über eine steigende Flanke am bGet 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
bReset : BOOL := TRUE;
bAdd, bGet, bRelease, 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;
fbBuffer: FB_MemRingBufferEx;
buffer : ARRAY[0..30] OF BYTE;
END_VAR
IF bReset THEN
bReset := FALSE;
fbBuffer.A_Reset( pBuffer := ADR( buffer ), cbBuffer := SIZEOF( buffer ),
bOk=>bOk,nCount=>nCount, cbSize=>cbSize, cbFree=>cbFree );
END_IF
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
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS-Bibliotheken (Kategoriegruppe) |
---|---|---|
TwinCAT v3.1.0 | PC oder CX (x86, x64, Arm®) | Tc2_Utilities (System) |