__DELETE

Definición

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 Usar asignación de memoria dinámica en la vista (Ver > Propiedades... > Opciones de creación de aplicaciones). Consulte la guía de programación específica de su controlador para saber si su controlador dispone de estas opciones.

Sintaxis

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

NOTA: Utilice el tipo de datos exacto del bloque de funciones derivado y no el del bloque de funciones de base. No utilice una variable de tipo 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.
NOTA: Asegúrese de que no haya dos tareas que llamen a __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.

Ejemplo

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