Está en la página 1de 27

Instruccin CPT

En el siguiente ejemplo vamos a realizar una divisin con la instruccin CPT.


La instruccin CPT para aquellos no la conozcan, es una instruccin que permite frmulas
matemticas de hasta 255 caracteres complejas o sencillas un una sola instruccin.
Esto es lo que dice la ayuda de Rslogix 500.

Hasta aqu todo bien, a todos nos dara por pensar que para dividir con esta instruccin
bastara con poner por ejemplo: 10 / 2, pero de intentarlo as nos saldra el error: Invalid
expresin!

A pesar de que en las explicaciones aparece bien explicado yo no me di cuenta hasta fracasar
varias veces, porque la lgica me deca que el smbolo de dividir es este / y no este |, en
Rslogix 5000 si es /.
En el teclado de mi PC del trabajo no encontr la lnea vertical, en m PC de casa est en el 1
debajo de F1, se inserta pulsando ALT GR + 1.
Para los teclados en los que no lo encontris en el mapa de caracteres nos dice que el
smbolo es 7C en hexadecimal 124 en decimal, sale pulsando ALT + 124.
En el mapa de caracteres de Windows lo podemos encontrar.

Y ya con esta informacin podemos realizar la divisin sin problemas.

DIRECCIONAMIENTO INDIRECTO PLC 5000


El direccionamiento indirecto es muy utilizado para registrar uno o varios datos de forma
sencilla; tambin 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
pgina 329:
http://literature.rockwellautomation.com/idc/groups/literature/documents/rm/1756-rm003_-esp.pdf
Y tambin vamos a utilizar [Indirect Addressing] pgina 47:
http://literature.rockwellautomation.com/idc/groups/literature/documents/pm/1756-pm004_-esp.pdf

En este ejemplo de aplicacin de direccionamiento indirecto en un PLC Rockwell utilizando


el software RSLogix 5000vamos a acumular un valor cada da durante el mes de enero.

Cuando cambiamos de da movemos el valor de Dia_actual a Copia_dia siempre y cuando


el lmite 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 posicin inexistente parar el PLC por fallo mayor como se explica en
el manual adjunto 1756-pm004 pgina 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 lnea comprobamos que estemos en enero, y si es as movemos un 31 a la variable
Lim_segun_mes para evitar que en caso de algn error intente escribir en un sitio que no
exista y falle el PLC, con la instruccin 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 da 1 Copia da valdr 1 por lo que nos escribir el Calendario.Enero[1].

Se podra hacer con la instruccin MOV si solo es un valor, pero yo prefiero poner la
instruccin COP porque si queremos copiar ms de un dato podramos simplemente
cambiando el origen que tendra que ser de otro ARRAY y el largo que sera el que
necesitemos.

Yo he creado un ARRAY de longitud 32 para que cada da se guarde dentro del ARRAY en la
posicin que corresponda con el da y en la posicin 0 guardo el total del mes

Para borrar el mes cuando queramos utilizamos un bit que al pulsarlo habilita la instruccin
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 tambin sumo el total del mes.
No he encontrado ninguna instruccin que sume un array completo, se supone que con la
instruccin FAL se podra pero yo no lo he conseguido.
Con la instruccin AVE podemos calcular el promedio de un array, as que en tabla le
decimos donde tiene que empezar a promediar que es en el da 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 das que tiene el mes y ya est.
Yo lo hago a travs de AVE por que no s cmo se hara de otro modo que sea as de fcil, as
que para saber el total del mes tenemos que multiplicar el promedio del mes por los das que
tiene el mes.
(AVE solo se ejecuta una vez cada vez que se activa, por eso utilizamos .DN de la propia
instruccin 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 imaginacin y lo utilice para lo que lo necesite. Yo lo
estoy usando para contabilizar energa.

ESTRUCTURA DE DATOS 5000


Una estructura de datos es una forma particular de organizar datos para que puedan ser
utilizados de manera eficiente.
Se usan mucho para poder crear por ejemplo, muchos motores iguales de forma muy sencilla.
Dentro del proyecto pulsamos para expandir la carpeta Data Types

Dentro de Data Types Pulsamos con el botn derecho del ratn User-Defined

Y en la ventana que se nos abre pulsamos sobre New Data Type

Se nos abre una ventana en la que rellenamos el nombre y una pequea descripcin
(Importante para en un futuro saber de qu se trata).
En mi caso:
- Name: Calendario
-Description: Registro diario de un dato, con media y total mensual; y total anual
Una vez hecho lo anterior pulsamos sobre Add Member

Dentro de Add Member rellenamos el nombre de la variable (Intentaremos que no sea muy
largo, pues la variable se va a llamar por el Como despus llamemos a la estructura.como se
llame la propia variable) y una pequea descripcin (Importante para en un futuro saber de
qu se trata).
En mi caso:
-Name: Enero
-Data Type: Un Array de 32 reales REAL[32]
-Description: Registro de Enero (Enero[0] total del mes y el resto coincide con el da por
ejemplo da 1 Enero[1])

Introducimos todos los datos que queramos en mi caso todos estos

Una vez hecho todo lo anterior pulsamos sobre OK y habremos terminado la estructura de
datos, a continuacin vamos a usarla.

Pulsamos donde queramos usar la estructura para que se nos abra el rbol, en mi caso la voy
a crear en el controlador, as que pulsamos sobre el nombre del controlador, y cuando se
despliegue el rbol pulsamos con el lado derecho del ratn sobre Controler Tags

Se nos abrir esta ventana y pulsamos sobre New Tag

En la ventana New Tag


Introducimos los siguientes datos:
-Name: Registro_KWH (Intentaremos que no sea muy largo, porque si no el total de la variable
ser demasiado largo)
-Description: una pequea descripcin (Importante para en un futuro saber para que lo
estamos usando)
-Data Type: Ponemos el dato que habamos creado en este caso Calendario
Pulsamos Create

Y ya tenemos creadas cerca de 400 Variables en un momento, reutilizable el dato tantas veces
necesitemos.

Esta estructura de datos la vamos a usar prximamente para crear un Bloque de funcin.

DIRECCIONAMIENTO INDIRECTO RSLOIX500


El direccionamiento indirecto es muy utilizado para registrar uno o varios datos de forma
sencilla; tambin lo podemos utilizar para las recetas, o lo que se nos ocurra.
Para ello vamos a utilizar la instruccin COP Pag.226 FLL Pag.228, Y Indirect Addressing
Pag.70:http://literature.rockwellautomation.com/idc/groups/literature/documents/rm/1766rm001_-en-p.pdf
En este ejemplo acumulamos un valor cada vez que pulsemos un botn.
Cada vez que pulsemos acumular se copiara el valor que est en N7:5 al canal de
acumulacin que ser N113[N7:6].
Con los corchetes se consigue el [Indirect Addressing] as que el valor que tenga el puntero
N7:6 ser el canal donde se copiar el acumulado. Por ello cada vez que pulsamos acumular
sumamos un uno para que vaya saltando de canal en canal.
Si en vez de un solo valor queremos copiar ms (Mximo 128) nos lo copiara cambiando la
longitud a la deseada, se nos copiara desde N7:5 hasta la longitud que hayamos puesto, en la
suma hay que sumar el valor que le pongamos a la longitud.

Para borrar los valores ponemos un botn que se llame Reset y movemos un 0 a N7:6 que es
el puntero, por seguridad movemos un 0 a N7:7 que es el canal que yo he utilizado para poder
borrar los valores de N113 ya que en la instruccin FLL no admite constantes, como la
instruccin solo admite 128 canales lo hacemos en dos veces.

En el artculo anterior se intento dar una posible solucin del siguiente ejercicio considerando
que la programacin la estabamos realizando en un S7-300/400/1200, hoy veremos como
resolverlo utilizando el RSLogix 5000.
Ejercicio:
Se trata de realizar un FB (Add-On en Rockwell) que filtre una seal de entrada analgica de
tipo WORD de la siguiente manera:
-Se activar el byte de marcas cclicas por hardware y se elegir el bit de marcas que permita
un muestreo de la seal analgica de 1s (Con el RSLogix 5000 no tenemos esta opcin con lo
cual nosotros generaremos la seal cada segundo)
-El FB deber tener una entrada de tipo BOOL (que ser el bit de ciclo mencionado en el
punto anterior) y una entrada de tipo WORD
(correspondiente a la seal analgica que se pretende muestrear)
-El FB tendr una salida (de tipo REAL) que corresponder, en cada instante de muestreo, a
la media de la muestra actual capturada de la seal analgica junto con sus tres muestras
anteriores. Todas ellas debern irse almacenando en el DB de instancia asociado al FB. Por
otro lado, se utilizarn las variables
temporales necesarias.
-El resultado que proporciona el FB (la media indicada) podr declararse como salida o como
variable esttica.

Con el RSLogix 5000 tenemos la opcin de crear nuestras propias funciones y reutilizarlas,
para la creacin de una nueva, en el directorio Add-On -> New Add-On Instruction

Introducimos el nombre que va a tener, un comentario, lenguaje de programacin y por defecto


aparece seleccionado el combo Box Open Definition, que nos abrira una nueva ventana donde
definir las variables que vamos a utilizar.

Se nos ha abierto el siguiente asistente, donde navegando por los diferentes menus, haremos
la configuracin.

Lo primero que vamos a definir, sern las variables de entrada y salida, especificando el tipo
de dato a utilizar en el menu de Parameters

En el menu Local Tags, definiremos las variables que utilizaremos en la programacin de


nuestra funcin y que no son variables de entrada ni salida, haciendo una comparacin con
Siemens, seria equivalente a los datos estticos. Una vez definidos si pulsamos sobre el botn
Logic, se nos abrira una nueva ventana donde insertar nuestro cdigo (El tipo de datos de
sumatorio es REAL, para que en el resultado se aprecien correctamente los decimales)

Como estoy reutilizando el cdigo del ejercicio anterior, hay que hacer unas pequeas
modificacines, pero el cdigo en si, es el mismo, incluso un poco mas simplificadado, ya que
no hace falta las funciones que utilizabamos para las conversion de datos, para una mejor
visualizacin pulsa en la imagen.

Ya podemos utilizar nuestra funcin, pero antes de ello, definimos una nueva variable en
nuestro Program Tags, y especificamos que sea del tipo de nuestra funcin.

La variable que se nos crea, es del tipo estructura con los datos definidos, accedemos a sus
diferentes campos con el nombre de la variable (Estructura) "." seguido del campo que nos
interese.

Para la utilizacin de la funcin creamos una subrutina, donde le pasamos los valores de
entrada a nuestra funcion, seguido de la funcin y obtenemos los resultados al final

Y por ltimo hacemos la llamada desde el programa principal a las diferentes subrutinas y
comprobamos su funcionamiento que es correcto.