Operador: __NEW
El operador es una extensión del estándar IEC 61131-3.
el __NEW
-El operador asigna memoria dinámicamente para crear instancias de bloques de funciones, tipos de datos definidos por el usuario o matrices de tipos de datos estándar. El operador devuelve un puntero correctamente escrito.
Requisito: En el cuadro de diálogo de propiedades de la aplicación superior, en la pestaña Opciones de creación de aplicaciones, es la opción Usar asignación de memoria dinámica activado.
sintaxis
<pointer name> := __NEW( <type> ( , <size> )? ); __DELETE( <pointer name> ); <type> : <function block> | <data unit type> | <standard data type>
El operador crea una instancia del tipo <type>
y devuelve un puntero a esta instancia. Luego se llama a la inicialización de la instancia. si es en <type>
es un tipo de datos escalares estándar, también se usa el operando opcional <size>
evaluado. Luego, el operador crea una matriz de tipo <standard data type>
el tamaño <size>
. Si falla el intento de asignar memoria, __NEW
el valor 0
espalda.
Utilice el operador dentro de la asignación ":=
", de lo contrario, se muestra un mensaje de error.
Un bloque de funciones o tipo de datos definido por el usuario cuya instancia con __NEW
generada dinámicamente, ocupa un área de memoria fija. Esto requiere que uses los objetos con el pragma {attribute 'enable_dynamic_creation'}
Marcos. Esto no es necesario para los bloques de funciones que forman parte de una biblioteca.
Sugerencia
Si cambia el diseño de datos del bloque de función en el modo online, no podrá iniciar sesión posteriormente con el cambio online. El área de memoria de la instancia del bloque de funciones se ha vuelto inválida. Cambia el diseño de los datos cuando agrega nuevas etiquetas al bloque de funciones, elimina etiquetas existentes o cambia los tipos de datos de las etiquetas.
Array (DWORD
)
PROGRAM PLC_PRG VAR pdwScalar : POINTER TO DWORD; //Typed pointer xInit : BOOL := TRUE; xDelete : BOOL; END_VAR IF (xInit) THEN pdwScalar := __NEW(DWORD, 16); // Allocates memory (16 dwords) and assigns them to pointer pdwScalar END_IF IF (xDelete) THEN __DELETE(pdwScalar); // Frees memory of pointer END_IF
bloque de funciones
{attribute 'enable_dynamic_creation'} FUNCTION_BLOCK FBComputeGamma VAR_INPUT iAlpha : INT; iBeta : INT; END_VAR VAR_OUTPUT iGamma : INT; END_VAR VAR END_VAR iGamma := iAlpha + iBeta; PROGRAM PLC_PRG VAR pComputeGamma : POINTER TO FBComputeGamma; // Typed pointer xInit : BOOL := TRUE; xDelete : BOOL; iResult : INT; END_VAR IF (xInit) THEN pComputeGamma := __NEW(FBComputeGamma); // Allocates memory xInit := FALSE; END_IF pComputeGamma^.iAlpha := (pComputeGamma^.iAlpha + 1)MOD 100; // Sets first input of pComputeGamma pComputeGamma^.iBeta := 10; // Sets second input of pComputeGamma pComputeGamma^(); // Calls the FB pComputeGamma is pointing to iResult := pComputeGamma^.iGamma; // Reads output of pComputeGamma IF (xDelete) THEN __DELETE(pComputeGamma); // Frees memory END_IF
Tipo de datos definido por el usuario (DUT)
{attribute 'enable_dynamic_creation'} TYPE ABCDATA : STRUCT iA, iB, iC, iD : INT; END_STRUCT END_TYPE PROGRAM PLC_PRG VAR pABCData : POINTER TO ABCDATA; // Typed pointer xInit : BOOL := TRUE; xDelete : BOOL; END_VAR IF (xInit) THEN pABCData := __NEW(ABCDATA); // Allocates memory xInit := FALSE; END_IF IF (xDelete) THEN __DELETE(pABCData); // Frees memory END_IF
Array (BYTE)
PROGRAM PLC_PRG VAR pbDataAlpha : POINTER TO BYTE; pbDataBeta : POINTER TO BYTE; xInit : BOOL := TRUE; xDelete : BOOL; usiCnt : USINT; bTestC: BYTE; END_VAR IF (xInit) THEN pbDataAlpha := __NEW(BYTE, 16); // Allocates 16 bytes for pbDataAlpha pbDataBeta := __NEW(BYTE); // Allocates memory for pbDataBeta xInit := FALSE; FOR usiCnt := 0 TO 15 DO pbDataAlpha[usiCnt] := usiCnt; // Writes to new array END_FOR pbDataBeta^:= 16#FF; // Writes to new data END_IF bTestC := pbDataAlpha[12]; // Reads new array by index access IF (xDelete) THEN // Frees memory __DELETE(pbDataAlpha); __DELETE(pbDataBeta); END_IF
Importante
No es recomendable ejecutar dos tareas al mismo tiempo que ambas usan el __NEW
operador de llamadas. O usas un semáforo (SysSemEnter
) o una técnica similar para realizar una llamada simultánea a __NEW
para prevenir. Sin embargo, esto significa que con el uso extensivo de __NEW
se produce una fluctuación mayor.
Recomendado es solo en una tarea __NEW
-Invocar operadores.