__DELETE
Cet opérateur n'est pas défini par la norme IEC 61131-3.
Pour plus d'informations sur la compatibilité, reportez-vous au tableau de mappage de versions EcoStruxure Machine Expert / compilateur CODESYS dans le document Compatibilité et migration - Guide utilisateur.
L'opérateur __DELETE
libère la mémoire attribuée précédemment aux objets, à l'aide de opérateur __NEW
.
L'opérateur __DELETE
ne renvoie aucune valeur et son opérande reste à 0 après l'opération.
Activez l'option vue ( ). Veuillez consulter le Guide de programmation spécifique à votre contrôleur pour savoir si votre contrôleur offre ces options.
dans la__DELETE (<pointeur>)
Si le pointeur désigne un bloc fonction, la méthode FB_Exit dédiée est appelée avant que le pointeur ne soit défini à NULL
.
POINTER TO BaseFB
. En effet, si le bloc fonction de base n'implémente aucune fonction FB_Exit
, aucun bloc FB_Exit
n'est appelé lors d'une prochaine utilisation de __DELETE(pBaseFB)
.
__DELETE
n'est pas appelé par deux tâches simultanément. Il est recommandé de n'utiliser __DELETE
que dans une seule tâche. Si l'opération est impossible, utilisez un sémaphore (SysSemEnter
) ou une méthode comparable pour éviter les appels simultanés de __DELETE
.
Vous pouvez utiliser un sémaphore (SysSemEnter
) pour éviter que deux tâches ne désallouent de la mémoire en même temps. Dans ce cas, l'utilisation extensive de __DELETE
augmente la gigue.
Dans l'exemple suivant, le bloc fonction FBDynamic
est attribué dynamiquement via _NEW
à partir du POU PLC_PRG
. Ce qui appelle la méthode FB_Init
, dans laquelle un type DUT
est attribué. Lorsque __DELETE
est appelée, le pointeur PLC_PRG
du bloc fonction FB_Exit
est appelé, ce qui libère le type interne attribué.
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;
END_VAR
out := in1 + in2;
METHOD FB_Exit : BOOL
VAR_INPUT
bInCopyCode : BOOL;
END_VAR
__Delete(_dut);
METHOD FB_Init : BOOL
VAR_INPUT
bInitRetains : BOOL;
bInCopyCode : BOOL;
END_VAR
_dut := __NEW(DUT);
METHOD INC : INT
VAR_INPUT
END_VAR
_inc := _inc + 1;
INC := _inc;
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