FB_MemBufferMerge
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.
Eingänge
VAR_INPUT
eCmd : E_EnumCmdType := eEnumCmd_First;
pBuffer : POINTER TO BYTE;
cbBuffer : UDINT;
pSegment : POINTER TO BYTE := 0;
cbSegment : UDINT := 0;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
eCmd | Steuerparameter für den Aufzählungsbaustein. eEnumCmd_First fügt das erste Segment, eEnumCmd_Next fügt das nächste Segment hinzu. Andere Parameter werden nicht benutzt. | |
pBuffer | BYTE | Adresse (Pointer) auf die Zielpuffervariable. Die Adresse kann mit dem ADR-Operator ermittelt werden. |
cbBuffer | UDINT | Maximal verfügbare Größe (in Byte) der Zielpuffervariablen. Die Größe kann mit dem SIZEOF-Operator ermittelt werden. |
pSegment | BYTE | 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 | UDINT | 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. |
Ausgänge
VAR_OUTPUT
bOk : BOOL;
cbSize : UDINT;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
bOk | BOOL | TRUE = Success, FALSE = Pufferüberlauf oder fehlerhafte Eingangsparameter. |
cbSize | UDINT | 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) |