FB_DynMem_Buffer
Der Funktionsbaustein stellt einen Puffer aus dynamisch allokiertem Speicher zur Verfügung. Dieser Puffer kann für individuelle Daten oder Datenblöcke verwendet werden. Er kann nicht zur dynamischen Instanziierung von Funktionsbausteinen verwendet werden.
Dem Funktionsbaustein wird bei der Deklaration eine Instanz des Funktionsbausteins FB_DynMem_Manager übergeben, wodurch die Speicherallokationen überwacht werden.
Deklaration
fbMyBuffer : FB_DynMem_Buffer(ipMemMan := fbMyMemMan);
Properties
bAvailable: ist TRUE, falls der Puffer verfügbar ist.
nBufferSize: gibt die aktuelle Größe des Puffers in Bytes an.
pBuffer: stellt einen Pointer auf den internen dynamisch allokierten Puffer zur Verfügung.
Methoden
CreateBuffer():
Die Methode erzeugt den Puffer, indem Speicher zur Laufzeit allokiert wird. Neben der gewünschten Größe in Bytes wird angegeben, ob der Speicherblock hierbei genullt werden soll.
Bei erfolgreicher Abarbeitung liefert die Methode TRUE zurück.
METHOD CreateBuffer : BOOL
VAR_INPUT
nSize : UDINT; // buffer size [in bytes]
bReset : BOOL; // zero the allocated memory
END_VAR
Clear():
Die Methode leert den Puffer. Der komplette Pufferspeicher wird hierbei genullt.
Bei erfolgreicher Abarbeitung liefert die Methode TRUE zurück.
METHOD Clear : BOOL
VAR_INPUT
END_VAR
Resize():
Die Methode ändert die Größe des Puffers. Dabei kann angegeben werden, ob der bisherige Pufferinhalt erhalten bleiben soll.
Bei erfolgreicher Abarbeitung liefert die Methode TRUE zurück.
METHOD Resize : BOOL
VAR_INPUT
nSize : UDINT; // new buffer size [in bytes]
bPreserve : BOOL; // TRUE => preserve old content, FALSE=> don't preserve old content
bReset : BOOL; // zero the allocated memory (before preserving)
END_VAR
![]() | Geänderter Pointer Bei Größenänderung des Puffers kann sich die Adresse des Puffers ändern. Es ist deshalb vor Verwendung des Puffers zwingend notwendig, sich die neue Adresse zu holen. |
DeleteBuffer():
Die Methode entfernt den Puffer, indem der allokierte Speicher wieder freigegeben wird.
Bei erfolgreicher Abarbeitung liefert die Methode TRUE zurück.
METHOD DeleteBuffer : BOOL
VAR_INPUT
END_VAR
![]() | Ungültiger Pointer Nach Entfernung des Puffers ist die zuvor verwendete Pufferadresse ungültig und darf nicht mehr verwendet werden. Es wird empfohlen noch existierende Pointer-Variablen explizit auf NULL zu setzen. |
Beispiel
Folgender Beispiel-Code zeigt die Verwendung vom FB_DynMem_Buffer zur Allokation von Speicher während der Laufzeit. Der allokierte Speicher wird einmal als Strukturinstanz und ein andermal als Array verwendet.
PROGRAM MAIN
VAR
bAllocateOnce : BOOL := TRUE;
fbMemMan : FB_DynMem_Manager;
fbBuffer_Struct : FB_DynMem_Buffer(ipMemMan:=fbMemMan);
pStruct : POINTER TO ST_MyStruct;
fbBuffer_Array : FB_DynMem_Buffer(ipMemMan:=fbMemMan);
pArray : POINTER TO LREAL;
nArrayLength : UINT := 10;
bResizeArray : BOOL;
END_VAR
IF bAllocateOnce THEN
bAllocateOnce := FALSE;
fbBuffer_Struct.CreateBuffer(nSize:=SIZEOF(ST_MyStruct), bReset:=TRUE);
// after successfully creating the buffer fbMemMan shows an increased nAllocatedSize [bytes] and nBufferCount=1
pStruct := fbBuffer_Struct.pBuffer;
fbBuffer_Array.CreateBuffer(nSize:=nArrayLength*SIZEOF(LREAL), bReset:=TRUE);
// after successfully creating the buffer fbMemMan shows an increased nAllocatedSize [bytes] and nBufferCount=2
pArray := fbBuffer_Array.pBuffer;
END_IF
IF pStruct <> 0 THEN
pStruct^.nCtrlValue := 7;
END_IF
IF pArray <> 0 THEN
pArray[3] := 7.5;
END_IF
IF bResizeArray THEN
bResizeArray := FALSE;
nArrayLength := 15;
fbBuffer_Array.Resize(nSize:=nArrayLength*SIZEOF(LREAL), bPreserve:=TRUE, bReset:=TRUE);
// after successfully creating the buffer fbMemMan shows an increased nAllocatedSize [bytes] and nBufferCount=2
pArray := fbBuffer_Array.pBuffer;
END_IF
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS-Bibliotheken |
---|---|---|
TwinCAT v3.1.4024.7 | IPC oder CX (x86, x64, ARM) | Tc3_DynamicMemory |