Para direccionar un área de memoria o un valor podemos hacerlo de forma directa o de forma indirecta. En el primer caso indicamos una dirección concreta o un valor, mientras que en el segundo caso direccionamos hacia a un área de memoria, para después escribir o mover el valor allí.
En el primer caso TIM00 tenemos un temporizador de tiempo fijo (#50 = 5 segundos), mientras que en TIM01 hacemos que el valor de temporización esté en el área D10, cambiando el valor de D10 cambia la temporización.
Las ventajas son claras, más versatilidad y menor número de instrucciones necesarias para el programa.
Direccionamiento indirecto a un área de datos D
Sin embargo, podemos ir más lejos y hacer un direccionamiento indirecto sobre un área de memoria que nos haga de índice hacia otra área de memoria. Entonces el valor en la primera área D nos indica un valor (en BCD o binario) que apunta al área D donde se encuentra el registro.
Si el valor del índice se encuentra en BCD lo indicaremos precedido de (*), mientras que si está en decimal o hexadecimal lo indicaremos con (@).
En este ejemplo el valor de temporización estará en el área D del valor que haya en D20, en un caso en BCD y en el otro en binario. Por ejemplo, si en D20 ponemos el valor 10, entonces el valor de temporización en BCD estará en D16, mientras que en binario será el que esté en D10. |
En este ejemplo, hacemos un direccionamiento indirecto de dos temporizadores hacia D20, en un caso en BCD (*D20) y en el otro en binario (@D20), veremos entonces como en cada caso se direccionan hacia los tiempos en dos áreas diferentes. Comentar que en el caso de que el valor que haya en D20 no pudiera ser interpretado como BCD, no habría un valor válido en ese temporizador.
Direccionamiento indirecto en BCD y binario sobre una misma área D, donde se aprecia que se dirigen hacia DM diferentes. |
Índice con direccionamiento indirecto
Con el sistema visto anteriormente podemos realizar un índice que vaya registrando valores en una tabla de forma ordenada. Como ejemplo, vamos a almacenar los valores de temperatura de una instalación durante los últimos 10 minutos, a razón de un dato cada minuto.
Crearemos un índice en D33, en el que haremos que lleve el valor de temperatura al registro que situaremos entre D200 y D209. Una vez completados los datos reiniciaremos el registro y seguiremos almacenando datos de forma indefinida. Para el registro de los datos y el incremento del registro usaremos un reloj de pulsos de 1 minuto.
Registro de 10 datos con D33 como índice de direccionamiento indirecto hacia D200-D209. |
Índice de matriz en texto estructurado
En este caso lo que buscamos es poder seleccionar los datos de una tabla en función de un índice. Para ello usaremos un bloque de función (podría ser un programa si usáramos un CJ) en Texto Estructurado (ST):
Creación de un bloque de función en texto estructurado |
En el bloque definiremos una serie de variables, en especial la variable interna 'Tabla' que la definiremos como matriz (de al menos 1 elemento) direccionada hacia un área de datos D100, en este ejemplo:
Las variable se completan con un 'Índice' que es el valor que irá cambiando los datos a leer, 'Elementos' nos indica el número de datos en la tabla, 'Valores' es el resultado a escribir y finalmente una variable interna 'Tabla' de tipo matriz y direccionada hacia el área D100. |
El programa es sí es muy sencillo. Comprobamos si el índice está dentro de los rangos definidos de la tabla (Elementos), de estar fuera del rango, desactivamos la condición de ejecución ENO y escribimos un 0 en la salida de valores. Si estamos en rango, activamos el bit de ejecución ENO y llevamos a la salida el valor que corresponda de la tabla en D100, según el valor del índice:
Programa en Texto estructurado (ST) |
Insertamos el bloque y lo completamos para usar una tabla de datos de hasta 9 elementos (Elementos = &8) con el índice que escribamos en D10 y llevando el resultado ('Valores') a D66.
Cuando el índice en D10 = &6, tendremos que en la salida 'Valores' se escribirá el dato que haya en D106. Si el valor del índice en D10 fuese superior a 8, se desactivaría el bit de ejecución W10.00 y en D66 se escribiría un 0. |
Registro de datos con área IR (Index Register)
El área IR permite realizar directamente un registro de índice de los datos de una tabla o incluso de temporizadores / contadores.
Esquema de funcionamiento del registro de índices. |
En el PLC disponemos de 16 registros de este tipo, de IR0 a IR15, con la particularidad de que los podemos usar en todos los programas. Esto es, los registros son independientes para cada tarea/programa y podemos usar IR0 en todos ellos, por ejemplo (tenemos los 16 IR/DR disponibles en todas las tareas). No obstante podemos configurar en las propiedades del PLC que sean compartidos en todos.
Por defecto el área IR/DR es independiente para cada programa, pero se pude elegir que sea compartido por todos ellos. |
Para el uso de los registros disponemos de variaciones que permiten incrementar/decrementar el registro, establecer un desfase...
Variaciones en el uso del registro de índice. |
Vamos a hacer un ejemplo en el que almacenamos 10 datos a una tabla. Una vez que la tabla se llena la reiniciamos volviendo a escribir los datos sobre los anteriores de forma continuada. Para que los datos vayan cambiando, usamos un canal D100 al que le vamos sumando una cantidad en cada toma de datos, que haremos cada 1s con un reloj de pulsos.
Programa del ejemplo en el que cada segundo se registra un nuevo dato entre D10 y D19, en función del valor que hay en D100. (ejemplo Index_register.cxp) |
Una modificación del ejemplo anterior, en el que ahora iremos pasando a D100 los datos que hay en la tabla de D10 a D19, de modo que según el valor del índice, se seleccionará cada segundo un valor de esa tabla. Para hacerlo más cómodamente usamos un reloj de pulsos de 1 s para hacer avanzar el índice. Nuevamente con D102 controlamos el valor del registro y lo ponemos a 0, reiniciando el movimiento de datos.
Con cada avance del índice se reflejará en D100 un valor de la tabla entre D10 y D19. Por comodidad usamos un reloj de pulsos que con la entrada 0.00 estará activo o no. Es necesario introducir los datos en los D10 a D19 para que se reflejen después en D100 con cada avance. (ejemplo Index_register_2.cxp)
Puedes bajar los ejemplos realizados para un CP1L-E en tres archivos, uno con los tres primeros ejemplos y los otros dos con los ejemplos del registro de indice: enlace descarga.
No hay comentarios: