FB_MemBufferSplit

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.
Eingänge
VAR_INPUT
eCmd : E_EnumCmdType := eEnumCmd_First;
pBuffer : POINTER TO BYTE;
cbBuffer : UDINT;
cbSize : UDINT;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
eCmd | 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. |
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) |