__DELETE
Este operador no se especifica en el estándar IEC 61131-3.
Si desea información sobre compatibilidad, consulte la tabla de asignación de versiones del compilador EcoStruxure Machine Expert/CODESYS en Compatibilidad y migración - Guía del usuario.
El operador __DELETE
anula la asignación de memoria de los objetos asignados previamente a través del operador __NEW
.
__DELETE
no tiene un valor de retorno y su operando se establecerá en 0 tras la operación.
Active la opción vista ( ). Consulte la guía de programación específica de su controlador para saber si su controlador dispone de estas opciones.
en la__DELETE (<puntero>)
Si el puntero apunta a un bloque de funciones, se llamará al método exclusivo FB_Exit antes de que el puntero se defina en NULL
.
POINTER TO BaseFB
. Esto es necesario porque, si el bloque de funciones de base no implementa ninguna función FB_Exit
, cuando más adelante se utilice __DELETE(pBaseFB)
, no se llamará a ningún FB_Exit
.
__DELETE
simultáneamente. Recomendamos usar __DELETE
solo en una tarea. Si no es posible, use un semáforo (SysSemEnter
) o un método comparable para evitar que se llame simultáneamente más de una vez a __DELETE
.
Puede usar un semáforo (SysSemEnter
) para evitar que dos tareas anulen asignación de memoria al mismo tiempo. En este caso, el uso extensivo de __DELETE
causa más inestabilidad.
En el ejemplo siguiente, el bloque de funciones FBDynamic
se asigna de forma dinámica a través de _NEW
desde la POU PLC_PRG
. De este modo, se llamará al método FB_Init
, en el cual se asigna un tipo DUT
. Cuando se llame a __DELETE
, se llamará al puntero del bloque de funciones de PLC_PRG
FB_Exit
, el cual a su vez liberará el tipo interno asignado.
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