Skip to main content

Opérateur : __DELETE

L'opérateur est une extension de la norme CEI 61131-3.

Important

Pour des raisons de compatibilité, la version du compilateur doit être >= 3.3.2.0.

L'opérateur libère la mémoire des instances que l'opérateur "__NEW" a générées dynamiquement. le __DELETE L'opérateur n'a pas de valeur de retour et l'opérande est mis à zéro après cette opération.

Exigence : Le Utiliser l'allocation de mémoire dynamique l'option est sélectionnée sur le Options de création d'applications dans la boîte de dialogue des propriétés de l'application.

__DELETE (<pointer>)

Important

Deux tâches ne doivent pas appeler __DELETE simultanément. Soit vous utilisez un sémaphore (SysSemEnter) ou une méthode comparable pour empêcher tout appel simultané de __DELETE , soit vous utilisez __DELETE dans une seule tâche (recommandé).

Vous pouvez utiliser un sémaphore (SysSemEnter) pour empêcher deux tâches d'allouer de la mémoire en même temps. En conséquence, l'utilisation massive de __DELETE provoque une gigue plus élevée.

Si Pointer fait référence à un bloc fonction, puis CODESYS appelle l'associé FB_EXIT méthode avant que le pointeur ne soit défini sur zéro.

Exemple 149. Exemple

Bloc fonctionnel

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;

Méthode (FB_Exit)

METHOD FB_Exit : BOOL

VAR_INPUT
  bInCopyCode : BOOL;
END_VAR

__Delete(_dut);

Méthode (FB_Init)

METHOD FB_Init : BOOL

VAR_INPUT
        bInitRetains : BOOL;
        bInCopyCode : BOOL;
END_VAR

_dut := __NEW(DUT);

Méthode

METHOD INC : INT

VAR_INPUT
END_VAR

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

Programme

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