FB_MemBufferMerge

FB_MemBufferMerge 1:

Dieser Funktionsbaustein fügt einzelne kleinere Datensegmente zu einem größeren Datensegment zusammen. Der Zielpuffer muss als Eingangsparameter an den Baustein übergeben werden. Es werden keine weiteren Datenbytes hinzugefügt, wenn das Segment, welches hinzugefügt werden soll, die verbliebene freie Puffergröße überschreitet.

VAR_INPUT

VAR_INPUT
    eCmd      : E_EnumCmdType := eEnumCmd_First;
    pBuffer   : POINTER TO BYTE;
    cbBuffer  : UDINT;
    pSegment  : POINTER TO BYTE := 0;
    cbSegment : UDINT := 0;
END_VAR

eCmd: Steuerparameter für den Aufzählungsbaustein (Typ: E_EnumCmdType). eEnumCmd_First fügt das erste Segment, eEnumCmd_Next fügt das nächste Segment hinzu. Andere Parameter werden nicht benutzt.

pBuffer: Adresse (Pointer) auf die Zielpuffervariable. Die Adresse kann mit dem ADR-Operator ermittelt werden.

cbBuffer: Maximal verfügbare Größe (in Byte) der Zielpuffervariablen. Die Größe kann mit dem SIZEOF-Operator ermittelt werden.

pSegment: Adresse (Pointer) auf das nächste Datensegment, welches hinzugefügt werden soll (Optional, kann auch Null sein). Die Adresse kann ebenfalls mit dem ADR-Operator ermittelt werden.

cbSegment: Größe des nächsten Datensegments, welches hinzugefügt werden soll (Optional, kann auch Null sein). Die Größe kann ebenfalls mit dem SIZEOF-Operator ermittelt werden.

VAR_OUTPUT

VAR_OUTPUT
    bOk    : BOOL;
    cbSize : UDINT;
END_VAR

bOk: TRUE = Success, FALSE = Pufferüberlauf oder fehlerhafte Eingangsparameter.

cbSize: Der aktuelle Puffer-Füllstatus (Anzahl der Datenbytes im Puffer).

Beispiel:

Im folgenden Beispiel wird zu Testzwecken nach dem Zusammenfügen der kleinen Datensegmente das große Datensegment in einen Hexadezimalstring konvertiert.

PROGRAM MAIN
VAR
    bMerge    : BOOL := TRUE;
    fbMerge   : FB_MemBufferMerge;
    buffer    : ARRAY[0..25] OF BYTE;
    seg1      : ARRAY[0..5] OF BYTE := [0,1,2,3,4,5];
    seg2      : ARRAY[0..3] OF BYTE := [6,7,8,9];
    seg3      : ARRAY[0..9] OF BYTE := [10,11,12,13,14,15,16,17,18,19];
    sHex      : T_MaxString;
END_VAR
IF bMerge THEN
    bMerge := FALSE;

    fbMerge( eCmd := eEnumCmd_First, pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), pSegment := ADR(seg1), cbSegment:= SIZEOF(seg1) );
    fbMerge( eCmd := eEnumCmd_Next, pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), pSegment := ADR(seg2), cbSegment:= SIZEOF(seg2 ) );
    fbMerge( pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), pSegment := ADR(seg3), cbSegment:= SIZEOF(seg3) );
    fbMerge( pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), pSegment := 0, cbSegment:= 0 );(* merge zero length segment *)
    fbMerge( pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), pSegment := ADR(seg3), cbSegment:= SIZEOF(seg3) );
    IF NOT fbMerge.bOk THEN
        ;(* TODO: Error handler *)
    END_IF

    sHex := DATA_TO_HEXSTR( pData := ADR(buffer), cbData := fbMerge.cbSize, FALSE );
END_IF

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (x86, x64, ARM)

Tc2_Utilities (System)