Skip to main content

Operador: __DELETE

El operador es una extensión del estándar IEC 61131-3.

Importante

Por motivos de compatibilidad, la versión del compilador debe ser >= 3.3.2.0.

El operador libera la memoria de las instancias creadas dinámicamente por el operador __NEW. El operador __DELETE no tiene valor de retorno y el operando se establece en 0 después de esta operación.

Requisito: En el diálogo de propiedades de la aplicación está en la pestaña Opciones de creación de aplicaciones la opción Usar asignación de memoria dinámica activado.

__DELETE (<Pointer>)

Importante

Dos tareas no deben llamar a __DELETE al mismo tiempo. O usa un semáforo (SysSemEnter) o una técnica similar para evitar una llamada simultánea a __DELETE, o solo usa __DELETE en una tarea (práctica recomendada).

Puede usar un semáforo (SysSemEnter) para evitar que dos tareas intenten asignar memoria al mismo tiempo. Como resultado, el uso extensivo de __DELETE provoca una mayor fluctuación.

Cuándo Pointer apunta a un módulo de función, llama CODESYS el método asociado FB_EXIT antes de que el puntero se establezca en 0.

ejemplo 149. Ejemplo

Bloque de funciones

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étodo (FB_Exit)

METHOD FB_Exit : BOOL

VAR_INPUT
  bInCopyCode : BOOL;
END_VAR

__Delete(_dut);

Método (FB_Init)

METHOD FB_Init : BOOL

VAR_INPUT
        bInitRetains : BOOL;
        bInCopyCode : BOOL;
END_VAR

_dut := __NEW(DUT);

Método

METHOD INC : INT

VAR_INPUT
END_VAR

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

Programa

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