EcoStruxure Machine Expert versión 1.1 no soporta los controladores M258, LMC058 y LMC078.

Punteros

Descripción general

Como extensión a la norma IEC 61131-3, puede utilizar punteros.

Los punteros guardan direcciones mientras se ejecuta el programa de aplicación. Un puntero puede apuntar a una variable de cualquier tipo de datos. La posibilidad de utilizar una función de supervisión del puntero implícita se describe más adelante en el apartado Función de CheckPointer.

Sintaxis de una declaración de puntero

<identifier>: POINTER TO <data type>;

La desreferenciación de un puntero equivale a obtener el valor almacenado actualmente en la dirección que indica. Puede desreferenciar un puntero añadiendo el operador de contenido ^ (caret ASCII o símbolo circunflejo) después del identificador de puntero. Observe pt^ en el ejemplo siguiente.

Puede utilizar el address operator ADR para asignar la dirección de una variable a un puntero.

Ejemplo

VAR
  pt:POINTER TO INT;  (* of pointer pt *)
var_int1:INT := 5;  (* declaration of variables var_int1 and var_int2 *)
  var_int2:INT;
END_VAR
pt := ADR(var_int1); (* address of var_int1 is assigned to pointer pt *)
var_int2:= pt^;      (* value 5 of var_int1 gets assigned to var_int2 via dereferencing of pointer pt; *)

Función Punteros

EcoStruxure Machine Expert también admite punteros de función. Estos punteros se pueden pasar a bibliotecas externas, pero no se puede llamar a un puntero de función dentro de una aplicación del sistema de programación. La función de tiempo de ejecución del registro de funciones de devolución de llamada (función de la biblioteca del sistema) espera el puntero de la función y, en función de la devolución de llamada para la que se haya solicitado el registro, el sistema en tiempo de ejecución llamará de forma implícita a la función correspondiente (por ejemplo, en STOP). Para habilitar esa llamada del sistema (sistema en tiempo de ejecución), defina las propiedades correspondientes (de forma predeterminada en Ver > Propiedades... > Crear) del objeto de la función.

Puede utilizar el operador ADR en los nombres de funciones, nombres de programas, nombres de bloques de funciones y nombres de métodos. Como las funciones pueden moverse después del cambio en línea, el resultado no será la dirección de la función, sino la dirección de un puntero en la función. Esta dirección será válida siempre que la función exista en el destino.

La ejecución del comando Cambio online puede cambiar el contenido de las direcciones.

Caution_Color.gifATENCIÓN

PUNTERO NO VÁLIDO

Verifique la validez de los punteros al utilizarlos en direcciones y ejecutar el comando Cambio en línea.

El incumplimiento de estas instrucciones puede causar lesiones o daño al equipo.

Acceso por índice a punteros

Como extensión a la norma IEC 61131-3, se permite el acceso por índice [] a variables de tipo POINTER, STRING y WSTRING.

opint[i] devuelve el tipo de datos base.

oEl acceso por índice en los punteros es aritmético:

Si el acceso por índice se emplea en una variable de tipo puntero, el offset pint[i] es igual a (pint + i * SIZEOF(base type))^. El acceso por índice también ejecuta una desreferenciación implícita en el puntero. El tipo de resultado es el tipo de base puntero.

Tenga en cuenta que pint[7] does not equate to (pint + 7)^.

oSi el acceso por índice se emplea en una variable de tipo STRING, el resultado es el carácter en offset index-expr. El resultado es de tipo BYTE. str[i] devolverá el carácter i de la cadena como SINT (ASCII).

oSi el acceso por índice se emplea en una variable de tipo WSTRING, el resultado es el carácter en offset index-expr. El resultado es de tipo WORD. wstr[i] devolverá el carácter i de la cadena como INT (Unicode).

NOTA: También puede utilizar Referencias. A diferencia de un puntero, las referencias afectan directamente a un valor.

Función CheckPointer 

Para supervisar el acceso al puntero durante el tiempo de ejecución, puede utilizar la función de supervisión implícita CheckPointer. Puede adaptarla, si es necesario. Para ello, añada el objeto POUs para comprobaciones implícitas a la aplicación. Seleccione la casilla de verificación relacionada con la categoría Pointer Checks.

NOTA: Deberá implementar la función CheckPointer durante la puesta en marcha de la máquina para verificar que el puntero transmitido hace referencia a una dirección de memoria válida y que la alineación del área de memoria referenciada coincide con el tipo de datos de la variable a la que apunta el puntero.

CheckPointer supervisa variables de tipo REFERENCE TO de manera similar.

NOTA: No existe una llamada implícita de la función de comprobación para el puntero THIS.

Plantilla:

Parte de la declaración:

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckPointer : POINTER TO BYTE
VAR_INPUT
ptToTest : POINTER TO BYTE;
iSize : DINT;
iGran : DINT;
bWrite: BOOL;
END_VAR

Cuando se llama, se incluyen los siguientes parámetros de entrada en la función:

optToTest: Dirección de destino del puntero.

oiSize: Tamaño de la variable referenciada; el tipo de datos de iSize debe ser compatible con enteros y abarcar el tamaño máximo de datos posibles almacenados en la dirección del puntero.

oiGran: Granularidad del acceso que es el tipo de datos no estructurados más grande usado en la variable referenciada; el tipo de datos de iGran ha de ser compatible con enteros.

obWrite: Tipo de acceso (TRUE = acceso de escritura, FALSE = acceso de lectura); el tipo de datos de bWrite debe ser BOOL.

Implementación de la función CheckPointer para controladores PacDrive

La implementación de la función CheckPointer para controladores PacDrive (PacDrive LMC Eco/PacDrive LMC Pro/Pro2) consiste en generar una excepción de tiempo de ejecución del sistema y escribir una pila de llamadas al registro de mensajes cuando la dirección de memoria o la alineación no son válidas.

Parte de implementación:

CheckPointer := ptToTest;
IF ptToTest = 0 THEN
        FC_DiagMsgWrite(4, 'CP = 0');
        FC_SysUserCallStack(0);
ELSE
        CheckPointer := ptToTest;
END_IF

Implementación de la función CheckPointer para controladores optimizados

La implementación de la función CheckPointer para controladores optimizados (por ejemplo, Modicon M241 Logic Controller) consiste en devolver el puntero transmitido.

Parte de implementación (incompleta):

// No standard way of implementation. Fill your own code here
CheckPointer := ptToTest;

Si se obtiene un resultado positivo de la comprobación, se devolverá el puntero de entrada sin modificar (ptToTest).