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