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.

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