Skip to main content

Operatore: __DELETE

L'operatore è un'estensione della norma IEC 61131-3.

Importante

Per compatibilità, la versione del compilatore deve essere >= 3.3.2.0.

L'operatore libera la memoria delle istanze generate dinamicamente dall'operatore "__NEW". Il __DELETE l'operatore non ha un valore di ritorno e l'operando viene impostato su zero dopo questa operazione.

Requisito: il Utilizzare l'allocazione dinamica della memoria l'opzione è selezionata su Opzioni di creazione dell'applicazione scheda nella finestra di dialogo delle proprietà dell'applicazione.

__DELETE (<pointer>)

Importante

Due attività non devono chiamare __DELETE contemporaneamente. O usi un semaforo (SysSemEnter) o un metodo comparabile per impedire qualsiasi chiamata simultanea di __DELETE , oppure usi __DELETE in una sola attività (consigliato).

È possibile utilizzare un semaforo (SysSemEnter) per impedire a due attività di allocare memoria contemporaneamente. Di conseguenza, l'ampio uso di __DELETE provoca un jitter maggiore.

Se Pointer fa riferimento a un blocco funzione, quindi CODESYS chiama l'associato FB_EXIT metodo prima che il puntatore sia impostato su zero.

Esempio 149. Esempio

Blocco funzione

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;

Metodo (FB_Exit)

METHOD FB_Exit : BOOL

VAR_INPUT
  bInCopyCode : BOOL;
END_VAR

__Delete(_dut);

Metodo (FB_Init)

METHOD FB_Init : BOOL

VAR_INPUT
        bInitRetains : BOOL;
        bInCopyCode : BOOL;
END_VAR

_dut := __NEW(DUT);

Metodo

METHOD INC : INT

VAR_INPUT
END_VAR

_inc := _inc + 1;
INC := _inc;

Programma

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