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.

FB_MemBufferSplit 2: Eingänge

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

Name

Typ

Beschreibung

eCmd

E_EnumCmdType

Steuerparameter für den Funktionsbaustein. eEnumCmd_First liefert das erste Segment, eEnumCmd_Next liefert das nächste Segment. Andere Parameter werden nicht benutzt.

pBuffer

BYTE

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

cbBuffer

UDINT

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

cbSize

UDINT

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

FB_MemBufferSplit 3: Ausgänge

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

Name

Typ

Beschreibung

bOk

BOOL

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

pSegment

BYTE

Adresse (Pointer) auf das nächste Datensegment.

cbSegment

UDINT

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

bEOS

BOOL

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)