__DELETE
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 SoMMenu/index.htm ( ). Weitere Informationen finden Sie im Programmierhandbuch Ihrer Steuerung. für Informationen zur Verfügbarkeit der Optionen mit Ihrer Steuerung.
in der Ansicht__DELETE (<Zeiger>)
Wenn der Zeiger auf einen Funktionsbaustein zeigt, wird die zweckbestimmte Methode FB_Exit aufgerufen, bevor der Zeiger auf NULL
gesetzt wird.
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.
__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.
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