__DELETE

Definition

Dieser Operator wird in der Norm IEC 61131-3 nicht beschrieben.

Kompatibilitätsinformationen finden Sie in der Zuordnungstabelle EcoStruxure Machine Expert/CODESYS Compilerversion im Kompatibilitäts- und Migrationshandbuch.

Der __DELETE-Operator gibt den Speicher für Objekte frei, die zuvor durch den __NEW Operator zugewiesen wurden.

__DELETE hat keinen Rückgabewert und der Operand wird nach dieser Operation auf 0 gesetzt.

Aktivieren Sie die Option Dynamische Speicherallozierung verwenden in der Ansicht Optionen Applikationserzeugung SoMMenu/index.htm (Ansicht > Eigenschaften... > Optionen Applikationserzeugung). Weitere Informationen finden Sie im Programmierhandbuch Ihrer Steuerung. für Informationen zur Verfügbarkeit der Optionen mit Ihrer Steuerung.

Syntax

__DELETE (<Zeiger>)

Wenn der Zeiger auf einen Funktionsbaustein zeigt, wird die zweckbestimmte Methode FB_Exit aufgerufen, bevor der Zeiger auf NULL gesetzt wird.

HINWEIS: Verwenden Sie den exakten Datentyp des abgeleiteten Funktionsbausteins und nicht denjenigen des Basis-Funktionsbausteins. Verwenden Sie keine Variable vom Typ POINTER TO BaseFB. Das ist notwendig, wenn der Basis-Funktionsbaustein keine FB_Exit-Funktion implementiert. Bei der weiteren Verwendung von __DELETE(pBaseFB) wird FB_Exit dann nicht aufgerufen.
HINWEIS: Stellen Sie sicher, dass __DELETE nicht von zwei Tasks gleichzeitig aufgerufen wird. Es hat sich bewährt, __DELETE nur in einer Task einzusetzen. Sollte das nicht möglich sein, dann verwenden Sie ein Semaphor (SysSemEnter) oder eine vergleichbare Methode, um gleichzeitige Aufrufe von __DELETE zu vermeiden.

Sie können ein Semaphor heranziehen (SysSemEnter), um zu verhindern, dass zwei Tasks gleichzeitig die Speicherzuweisung aufheben. In diesem Fall verursacht die übermäßige Verwendung von __DELETE zu intensivem Jitter.

Beispiel

Im folgenden Beispiel wird der Funktionsbaustein FBDynamic dynamisch über _NEW von der POU PLC_PRG zugewiesen. Dadurch wird die FB_Init-Methode aufgerufen, in der ein Typ DUT zugewiesen ist. Wenn __DELETE aufgerufen wird, wird der Funktionsbausteinzeiger von PLC_PRG, FB_Exit, aufgerufen, der dann die zugewiesenen internen Typen freigibt.

FUNCTION_BLOCK FBDynamic
VAR_INPUT
in1, in2 : INT;
END_VAR
VAR_OUTPUT
out : INT;
END_VAR
VAR
test1 : INT := 1234;
_inc : INT := 0;
_dut : POINTER TO DUT;
END_VAR
out := in1 + in2;
 
METHOD FB_Exit : BOOL
VAR_INPUT
bInCopyCode : BOOL;
END_VAR
__Delete(_dut);
 
METHOD FB_Init : BOOL
VAR_INPUT
bInitRetains : BOOL;
bInCopyCode : BOOL;
END_VAR
_dut := __NEW(DUT);
 
METHOD INC : INT
VAR_INPUT
END_VAR
_inc := _inc + 1;
INC := _inc;
 
PLC_PRG(PRG)
VAR
pFB : POINTER TO FBDynamic;
bInit: BOOL := TRUE;
bDelete: BOOL;
loc : INT;
END_VAR
IF (bInit) THEN
pFB := __NEW(FBDynamic);
bInit := FALSE;
END_IF
IF (pFB <> 0) THEN
pFB^(in1 := 1, in2 := loc, out => loc);
pFB^.INC();
END_IF
IF (bDelete) THEN
__DELETE(pFB);
END_IF