Direccionamiento Indirecto RSLogix 5000
El direccionamiento indirecto es muy utilizado para registrar uno o varios datos de forma sencilla; también lo podemos utilizar para las recetas, o lo que se nos ocurra.
Para ello vamos a utilizar diversas instrucciones que las podemos consultar a partir de la página 329:
http://literature.rockwellautomation.com/idc/groups/literature/documents/rm/1756-rm003_-es-p.pdf
Y también vamos a utilizar [Indirect Addressing] página 47:
http://literature.rockwellautomation.com/idc/groups/literature/documents/pm/1756-pm004_-es-p.pdf
En este ejemplo de aplicación de direccionamiento indirecto en un PLC Rockwell utilizando el software RSLogix 5000 vamos a acumular un valor cada día durante el mes de enero.
Cuando cambiamos de día movemos el valor de “Dia_actual” a “Copia_dia” siempre y cuando el límite del mes nos lo permita, de ahí el tener que mover el valor de variable para poder comprobar con LIM que es posible, ya que si al usar direccionamiento indirecto le decimos que vaya a buscar a una posición inexistente parará el PLC por fallo mayor como se explica en el manual adjunto 1756-pm004 página 50.
“Copia_dia” será nuestro puntero.
En el ejemplo registramos un dato diario durante el mes de enero, así que en el principio de la línea comprobamos que estemos en enero, y si es así movemos un 31 a la variable “Lim_segun_mes” para evitar que en caso de algún error intente escribir en un sitio que no exista y falle el PLC, con la instrucción COP copiamos el valor diario en la variable de ARRAY “calendario.enero[Copia_dia]”
Con los corchetes se consigue el [Indirect Addressing] así que [Copia_dia] es el puntero y su valor corresponde a la variable en la que vamos a escribir.
Por ejemplo el día 1 Copia día valdrá 1 por lo que nos escribirá el “Calendario.Enero[1]”.
Se podría hacer con la instrucción MOV si solo es un valor, pero yo prefiero poner la instrucción COP porque si queremos copiar más de un dato podríamos simplemente cambiando el origen que tendría que ser de otro ARRAY y el largo que sería el que necesitemos.
Yo he creado un ARRAY de longitud 32 para que cada día se guarde dentro del ARRAY en la posición que corresponda con el día y en la posición 0 guardo el total del mes
Para borrar el mes cuando queramos utilizamos un bit que al pulsarlo habilita la instrucción FLL que rellena archivos con un valor, ponemos en el origen un 0 en destino el primer valor que queremos borrar y en el largo los que queramos borrar.
Aunque no tiene nada que ver con el ejemplo de direccionamiento indirecto, ya que estamos explico que yo también sumo el total del mes.
No he encontrado ninguna instrucción que sume un array completo, se supone que con la instrucción FAL se podría pero yo no lo he conseguido….
Con la instrucción AVE podemos calcular el promedio de un array, así que en tabla le decimos donde tiene que empezar a promediar que es en el día 1 “Calendario.Enero[1]” en destino le decimos donde queremos guardar el promedio en este caso es “Calendario.Media_mensual[1]” y en el largo le decimos los días que tiene el mes y ya está.
Yo lo hago a través de AVE por que no sé cómo se haría de otro modo que sea así de fácil, así que para saber el total del mes tenemos que multiplicar el promedio del mes por los días que tiene el mes.
(AVE solo se ejecuta una vez cada vez que se activa, por eso utilizamos .DN de la propia instrucción para que cada vez que se haya ejecutado se vuelva a ejecutar)
Lo que importa no es el ejemplo en sí, si no dar a conocer que el direccionamiento indirecto existe y las instrucciones utilizadas ((es muy importante consultarlas y comprenderlas en los manuales)), así que cada un@ le eche imaginación y lo utilice para lo que lo necesite. Yo lo estoy usando para contabilizar energía.
Cualquier duda que podamos solucionar aquí estamos.
SUERTE Y A LIO.