Esto es lo que dice el manual de Beckhoff:
En los punteros se guardan las direcciones de variables o bloques de
funciones para el tiempo de ejecución de un programa.
Las declaraciones de
puntero tienen la siguiente sintaxis:
: POINTER TO
función>;Un puntero puede indicar cualquier tipo de datos y bloque de funciones,
incluso de definición propia.Con el operador de dirección ADR se asigna al
puntero una dirección de una variable o bloque de función.La desreferenciación de un puntero se produce mediante el operador de
contenidos “^” tras el identificador del puntero.
Please note: A pointer is counted up
byte-wise ! You can get it counted up like it is usual in the C-Compiler by
using the instruction p=p+SIZEOF(p^);.
Y esto es lo que digo yo:
Un puntero nos permite cambiar, en tiempo de ejecución, la variable que queremos leer. Por ejemplo, si tenemos un variador de frecuencia que funciona con diferentes parámetros, lo que todos llamamos recetas. Pues bien, podemos crear una estructura con esos valores, por ejemplo:
- Velocidad.
- Tiempo de aceleración.
- Tiempo de deceleración.
y mediante un puntero cambiar la receta con la que vamos a trabajar, como muestra el ejemplo:

Como podemos ver en la figura, tenemos dos variables de tipo estructura que serán las dos recetas:
- Conf1
- Conf2
Y una tercera variable de este tipo (ConfActual), será la que reciba la receta actual para enviarla a los variadores. Mediante la variable Selec1, seleccionamos la receta a utilizar.
El puntero V1 almacena la direción de la variable, y con el operador de desreferenciación (la ostia que palabra, tú) ^ la pasamos a ConfActual.
De este modo el proceso es el siguiente:
Mediante ADR pasamos la dirección de la variable a el puntero.
1 | V1 := ADR(Conf1); |
Mediante ^ pasamos el valor de la variable apuntada.
1 | ConfActual := V1^; |
Código completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | (*ZONA Variables*) PROGRAM MAIN(* ---xxX POINTER Xxx---*) VAR Conf1:Conf; Conf2:Conf; ConfActual:Conf; V1:POINTER TO Conf; Selec1:BOOL; END_VAR (*ZONA Programa*) IF Selec1 THEN V1 := ADR(Conf1); ELSE V1 := ADR(Conf2); END_IF; ConfActual := V1^; |









