Operator: __DELETE
Der Operator ist eine Erweiterung der Norm IEC 61131-3.
Wichtig
Aus Kompatibilitätsgründen muss die Compiler-Version >= 3.3.2.0 sein.
Der Operator gibt den Speicher von Instanzen wieder frei, die der Operator __NEW dynamisch erzeugt hat. Der Operator __DELETE hat keinen Rückgabewert und der Operand wird nach dieser Operation auf 0 gesetzt.
Voraussetzung: Im Eigenschaftendialog der Applikation ist in der Registerkarte Optionen Applikationserzeugung die Option Dynamische Speicherallozierung verwenden aktiviert.
__DELETE (<Pointer>)
Wichtig
Zwei Tasks sollten nicht gleichzeitig __DELETE aufrufen. Entweder Sie verwenden ein Semaphor (SysSemEnter) oder eine vergleichbare Technik, um einen konkurrierenden Aufruf von __DELETE zu verhindern, oder Sie verwenden __DELETE nur in einer Task (empfohlenes Vorgehen) .
Sie können ein Semaphor (SysSemEnter) benutzen, um zu vermeiden, dass zwei Tasks gleichzeitig versuchen Speicher zu allozieren. Das hat zur Folge, dass die umfangreiche Nutzung von __DELETE einen höheren Jitter verursacht.
Wenn Pointer auf einen Funktionsbaustein zeigt, ruft CODESYS die zugehörige Methode FB_EXIT auf, bevor der Pointer auf 0 gesetzt wird.
Funktionsbaustein
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; neu : BOOL; END_VAR out := in1 + in2;
Methode (FB_Exit)
METHOD FB_Exit : BOOL VAR_INPUT bInCopyCode : BOOL; END_VAR __Delete(_dut);
Methode (FB_Init)
METHOD FB_Init : BOOL
VAR_INPUT
bInitRetains : BOOL;
bInCopyCode : BOOL;
END_VAR
_dut := __NEW(DUT);
Methode
METHOD INC : INT VAR_INPUT END_VAR _inc := _inc + 1; INC := _inc;
Programm
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