FB_MemBufferSplit

FB_MemBufferSplit 1:

Dieser Funktionsbaustein teilt einen Speicherbereich (Datenpuffer) in mehrere kleinere Segmente von einer maximal gewünschten Länge auf. Der Funktionsbaustein liefert einen kleineres Teilsegment zurück, falls das letzte Segment eine kleinere Länge als die gewünschte besitzt.

VAR_INPUT

VAR_INPUT
    eCmd     : E_EnumCmdType := eEnumCmd_First;
    pBuffer  : POINTER TO BYTE;
    cbBuffer : UDINT;
    cbSize   : UDINT;
END_VAR

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

pBuffer: Adresse (Pointer) des Datenpuffers, der geteilt werden soll. Die Adresse kann mit dem ADR-Operator ermittelt werden.

cbBuffer: Länge des Datenpuffers, der geteilt werden soll. Die Länge kann mit dem SIZEOF-Operator ermittelt werden.

cbSize: Maximale Segmentgröße, in die der Datenpuffer geteilt werden soll.

VAR_OUTPUT

VAR_OUTPUT
    bOk       : BOOL;
    pSegment  : POINTER TO BYTE;
    cbSegment : UDINT;
    bEOS      : BOOL;
END_VAR

bOk: TRUE = Success, FALSE = Fehler, falscher Parameterwert oder kein weiteres Segment vorhanden.

pSegment: Adresse (Pointer) auf das nächste Datensegment.

cbSegment: Länge (Bytes) von dem nächsten Datensegment.

bEOS: End of segment. TRUE = Letztes Segment. FALSE = Weitere Segmente folgen.

Beispiel:

Im folgenden Beispiel wird die buffer-Variable in 5-Byte-Segmente aufgeteilt. Zu Testzwecken werden die zurück gelieferten Segmente in einen Hexadezimalstring konvertiert.

PROGRAM MAIN
VAR
    bSplit   : BOOL := TRUE;
    buffer   : ARRAY[1..30] OF BYTE := [16#A,1,2,3,4,5,6,7,8,9,16#B,1,2,3,4,5,6,7,8,9,16#C,1,2,3,4,5,6,7,8,9];
    fbSplit  : FB_MemBufferSplit;
    sHex     : T_MaxString;
END_VAR
IF bSplit THEN
    bSplit := FALSE;
    fbSplit.eCmd := eEnumCmd_First;

    REPEAT
        fbSplit( pBuffer := ADR(buffer), cbBuffer := SIZEOF(buffer), cbSize := 5 );
        IF fbSplit.bOk THEN
            sHex := DATA_TO_HEXSTR( pData := fbSplit.pSegment, cbData := fbSplit.cbSegment, FALSE );
            fbSplit.eCmd := eEnumCmd_Next;
        END_IF
    UNTIL NOT fbSplit.bOk
    END_REPEAT
END_IF

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (x86, x64, ARM)

Tc2_Utilities (System)