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 o a una instancia de bloque de funciones. 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.
<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.
'<pointer name >' is not a valid assignment target
cuando se genera el código.
Ejemplo: pwInput := ADR(wInput);
Para que el compilador no detecte dicho error, copie el valor de entrada (wInput) en una variable con acceso de escritura.
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; *)
En la modalidad en línea, puede saltar desde un puntero hasta la ubicación de declaración de la variable a la que se hace referencia. Para ello, ejecute el comando (consulte EcoStruxure Machine Expert, Comandos de menú, Ayuda en línea).
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 ) 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
puede cambiar el contenido de las direcciones.ATENCIÓN | |
---|---|
Como extensión a la norma IEC 61131-3, se permite el acceso por índice []
a variables de tipo POINTER, STRING y WSTRING.
[i]
devuelve el tipo de datos base.
El 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)^
.
Si 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. [i]
devolverá el carácter i de la cadena como SINT (ASCII).
Si 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. [i]
devolverá el carácter i de la cadena como INT (Unicode).
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 a la aplicación. Seleccione la casilla de verificación relacionada con la categoría .
CheckPointer supervisa variables de tipo REFERENCE TO de manera similar.
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:
ptToTest
: dirección de destino del puntero.
iSize
: 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.
iGran
: 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.
bWrite
: tipo de acceso (TRUE = acceso de escritura, FALSE = acceso de lectura); el tipo de datos de bWrite
debe ser BOOL.
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
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
).