Skip to main content

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.

Beispiel 149. Beispiel

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