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.
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