viernes, 16 de octubre de 2015

Uso de R_TRIG y F_TRIG.

Capturar un momento, en programación SCL y las instrucciones
R_TRIG y F_TRIG.

A quien no le interesa capturar un momento o instante en función de la activación o desactivación de una señal de entrada, salida o variable y no estoy hablado de usar eventos (interrupciones) no!!.

Vamos hacer algo más sencillo y creo que muy útil para ciertos casos, por ejemplo, cuando se activa una entrada del PLC queremos saber a que hora se ha activado y a que hora se ha vuelto a desactivar y que estos datos, queden registrados para una posterior consulta. Si esto lo intentamos hacer sin usar estas instrucciones os digo que es prácticamente imposible, o nos sale un programa muy complicado.

Como funciona R_TRIG, cuando la entrada clok de la instrucción que sera una variable (Tag), cambia de estado de 0 a 1, en este flanco de subida se dispara la salida Q de R_TRIG y queda activa durante ese ciclo de la maquina en el que ha ocurrido el cambio de estado, en los siguientes ya no permanece activo. Esto ya se que choca con lo que dice la ayuda de TIA portal e incluso el manual, pero si miráis los ejemplos que pongo en este texto podéis juzgar por vosotros mismo y si creéis que me equivoco hacedme lo saber.

Como iba diciendo la salida Q permanece activa durante el ciclo en el que se produce el cambio de estado, circunstancia que aprovecharemos para realizar la captura de algún dato que nos interese, en este caso registrar la hora en que se activa una salida. Para ello nos ayudaremos de la instrucción WHILE DO dentro de esta sentencia colocaremos las instrucciones necesarias para leer el reloj y guardar esa lectura en una variable para su registro. Una vez terminado el ciclo del flaco la condición de WHILE cambia y ya no vuelve a leer ni registrar el dato.

El funcionamiento de F_TRIG es igual que el de R_TRIG pero para el flanco de bajada.

Un ejemplo de uso de lo que aquí digo, lo tenéis en la pagina del blog, Mis programas, control de llenado de fosa, si os descargáis el proyecto en la pagina 39 a la 42 tenéis un ejemplo de uso de R_TRIG y FTRIG.


Si el ejemplo anterior os sabe a poco aquí os dejo otro es un desplazamiento de salida activa cada cinco segundos usando la R_TRIG y SHL que es la instrucción que hace el registro de desplazamiento.

ir al enlace:
https://drive.google.com/folderview?id=0B_H6mOzK5877ejZUWmI1dmVhd1k&usp=sharing



miércoles, 30 de septiembre de 2015

Copiado de funciones, FC y FB.

Copiar funciones.

Puede ocurrir que necesitemos crear una función idéntica a otra que ya tenemos en el mismo programa, por ejemplo una función controla las horas que esta funcionando un motor y resulta que tenemos dos motores mas que controlar, como lo hacemos?. Volvemos a escribir nuevas funciones idénticas a la anterior ?. No es necesario, podemos hacer una copia de la primera función, pero, con una serie de cosas a tener en cuenta pues esto no es solamente hacer click con el ratón y elegir la opción de copiar.

  1. Situaremos el cursor sobre la función a copiar en el árbol de proyecto haremos click con el botón derecho del ratón se abre un menú elegimos la opción copiar y aparece debajo de la actual la función copiada.
  2. Ahora nos situaremos sobre la función copiada, seleccionamos, click con el botón derecho del ratón, se abre el menú y elegimos propiedades, se nos abre otro menú el la opción de General, nos aparecen varias entradas por si queremos cambiar los datos de alguna, en la entrada “Nombre” nos aparece el nombre de la función copiada guión mas un numero, este sera el nombre de la nueva función y el que si debemos de cambiar es el de la entrada que tenemos de bajo de “Tipo” que es “numero” y pondremos si es la primera copia un “dos” e iremos aumentando el numero según las copias que hagamos de la primera función.
Con los pasos anteriores tenemos copiada la función primera, si queremos mas copias de la función original tenemos que repetir estos pasos.

Pero no hemos terminado, si dentro de la función copiada hay instrucciones que usan DB (como es el caso de temporizadores, contadores, etc.). Tendremos que buscarlas en las funciones copiadas y volverlas a escribir para que se genere una DB nueva para esa instrucción, de lo contrario la función no funcionara correctamente cuando la probemos.

Con las variables o “Tag” no hay problema, pueden usar el mismo nombre que la función original.

Programa Control de una fosa de pluviales

Control de llenado de fosa de aguas.

Se me a planteado el siguiente problema de automatización. El control de una Fosa que recogerá aguas pluviales de una zona con escasa evacuación de forma natural de dichas aguas, Para ello se crea una red colectora, que llevara las aguas hasta la fosa, donde se evacuaran a otra red de alcantarillado que las conducirá hasta la depuradora para su tratamiento.

Las condiciones son las siguientes.

  • En la fosa habrán tres bombas que funcionando las tres a la vez tienen que ser capaces de evacuar todo el caudal entrante máximo.

  • Las bombas irán poniéndose en marcha según se valla llenando la fosa, para saber que nivel de llenado de fosa tenemos, disponemos en el interior de la fosa de cuatro boyas situadas a distinto nivel que nos indicaran el estado de llenado de la fosa.

  • El sistema tiene que ser tolerante a fallos en la lectura de los niveles de la fosa, es decir que si se produce una situación anómala a lo normal, el sistema tiene que poder reaccionar ante esa lectura errónea de las boyas.

  • Registro de horas de funcionamiento de cada una las bombas.

  • Registro de hora de inicio de arranque de cada bomba y ultima hora de paro.
  • Estado actual de cada bomba, Funcionando, Parada y Averiada.

  • Los tres puntos anteriores se tienen que poder observar en una única pantalla de HMI.

  • Cada vez que la fosa se vacía en el siguiente ciclo de funcionamiento, deberá entrar primero la bomba que menos horas de funcionamiento tenga. En caso de mayor necesidad evacuación la siguiente bomba que entre sera la menos horas de funcionamiento tenga de las dos que quedan por poner en funcionamiento.
  • En caso de estar una única bomba trabajando el sistema deberá de poder ir turnando las tres bombas, durante el tiempo prefijado por el usuario en el HMI.

  • Las bombas tienen que poder ser activadas de forma manual, la desactivación de las mismas también tiene que ser manual o cuando la boya de vacío quede colgando lo cual es indicativo que el nivel de agua es ya muy bajo. Si hay activación manual activa, tiene que aparecer en la pantalla principal del HMI, la indicación de MANUAL.

  • Mediante una pantalla del HMI debemos de observar, estado de las bombas nivel de fosa y estado de boyas.

  • En caso de una bomba averiada, lectura errónea de boya, esto tiene que provocar que dispare una alarma sonora y otra luminosa y que se tienen que poder desconectar, de forma temporal e individual y una vez pasado el tiempo prefijado, se volverá a conectar. Si la avería persiste las alarmas tanto sonoras como luminosas volverán a activarse.

Bien pues aquí tenéis la solución.


Descarga de proyecto:


lunes, 17 de agosto de 2015

Uso de temporizadores en programación SCL.

Uso de temporizadores en programación SCL.

He creado un pequeño programa que creo que ayudara a aprender como usar las temporizaciones en programación SCL. Este programa lo que hace es uso de las tres temporizaciones mas usuales, TON, TOF y TP, su funcionamiento es el siguiente, en la entrada I0.0 tenemos un interruptor, cuando este es cerrado la entrada de disparo IN del temporizador TP pasa a nivel alto lo cual provoca el disparo de de la temporización pasando a nivel alto la salida Q de TP y permanecerá así hasta que termine el tiempo fijado en la entrada PT.

La temporización TOF se inicia o arranca cuando cuando la salida Q de TP pasa a nivel bajo, después del tiempo fijado en la entrada PT de TOF su salida pasara a nivel bajo también. Por si no queda claro, cabe indicar que la salida Q de TOF desde el primer momento que arranca el programa la salida Q de TOF a estado a nivel alto y que una vez pasa a nivel bajo la salida Q de TP es cuando se inicia la temporización, por eso se llama retardo a la des-conexión.

La temporización TON es arrancada cuando el interruptor de la entrada I0.0 es cerrado, pasando a nivel alto la entrada IN de TON y trascurrido el tiempo fijado en PT de TON la salida Q de TON pasara a nivel alto, quedándose así hasta que se reinicia la temporización mediante una instrucción
RESET_TIMER, si no hacemos uso de esta instrucción, las temporizaciones no vuelven a arrancar a un que abramos y volvamos a cerrar el interruptor de la entrada I0.0.


No se si os habéis dado cuenta de una cosa, sobretodo cuando he explicado el funcionamiento de TON, pero existe una diferencia de funcionamiento cuando se usa la temporización TON en lenguaje de programación SCL a KOP, sobretodo si el tiempo fijado en PT es de forma directa (T#2s), en programación KOP, cuando la entrada IN cambia de estado de alto a bajo y volvemos a alto la temporización TON se ha reiniciado sola. Si el tiempo en PT es fijado de forma indirecta mediante una variable funciona igual que en SCL.


Cosas a tener en cuenta a la hora de trabajar con las temporizaciones.


Como podéis observar en la imagen de bloques del programa el estado de la entrada I0.0 es la que dispara las temporizaciones TP y TON, a un que esto se vera mejor leyendo el programa del bloque, si la entrada esta a nivel bajo, retorna del bloque sin hacer nada. Si la entrada esta a nivel alto, dispara las temporalizaciones, estando estas temporalizaciones activas volvemos a poner la entrada a nivel bajo durante un breve instante sin que llegue a superar el tiempo de PT, volvemos a poner la entrada a nivel alto no ocurrirá nada. Pero si una vez activadas las temporalizaciones dejamos en nivel bajo la entrada I0.0, por tiempo superior al de PT o indefinido las salidas Q de las temporalizaciones podríamos decir que se quedan “congeladas”, es decir si las salidas las teníamos activas a nivel alto así se quedan de forma permanente aunque halla trascurrido el tiempo de PT. Solo se actualizaran los estados de las salidas cuando la entrada I0.0 vuelva a estado alto entonces se actualizaran.
Esto es importante a tener en cuenta, por que si se nos ocurre poner una temporalización dentro de una sentencia WHILE_DO o como en el programa una IF esta tendrá que mantener la condición, hasta que la temporalización halla acabado por que de lo contrario ya sabemos que la salida Q de la temporalización se puede quedar congelada.


Si quieres puedes descargarte el programa en el siguiente enlace:

https://drive.google.com/folderview?id=0B_H6mOzK5877fkhVZHlzY1ZIQUlTMzN6MnluaGhOaWsxZExHR2tTU0dIWGI2clYxZkQxaDg&usp=sharing


lunes, 3 de agosto de 2015

Temporizadores del S7 1200, Casos prácticos.


A un que lo explicado con anterioridad en el tema de los temporizadores está en lo cierto, tengo que aclarar unas cuantas cosas. Cuando el dato de tipo “time” es colocado de manera directa en la entrada PT del temporizador este arrancara de forma inmediata una vez activada la entrada IN en caso de ser el temporizador del tipo TON este arranca y una vez trascurrido el tiempo que marca PT la salida Q pasa a nivel alto habiendo hecho correctamente su función.



Pues bien, esto mismo ocurre si PT recibe el dato de una variable tipo marca del autómata.
La cuestión cambia y bastante, cuando la variable es de una función FC o FB y el temporizador esta en la OB es decir el dato de tiempo de PT nos viene de una función. Aquí tendremos que actuar de otra manera por supuesto que tendremos que arrastrar la función del temporizador que queramos usar hasta su segmento en OB y ademas la instrucción de arranque correspondiente al tipo que usemos. Una vez la función de temporizador este en su sitio y la instrucción de arranque en el suyo, la forma de hacer que el temporizador funcione es la siguiente para los tipos TON y TOF.

  1. Tenemos que arrancar el temporizador con la instrucción -(TON)- o -(TOF)- ,esta acción no disparara el temporizador.
  2. Pondremos la entrada IN de la función del temporizador a nivel alto si es un temporizador TON provocara que este realice su función de activación de la salida Q trascurrido el tiempo de PT. Si es un temporizador TOF después de arrancar debemos de poner a nivel alto la entrada IN y cuando la pongamos a nivel bajo se activara el temporizador, pasado el tiempo PT se desactivara la salida Q.
Hay que advertir que no podemos activar a la vez la o con la misma señal la entrada IN y el arranque por que si no el temporizador se bloquea y no realiza su función.


Con el temporizador TP ocurre algo bien distinto a lo narrado con anterioridad, pues este si que arrancara una vez hallamos activado la instrucción de arranque de TP sin necesidad de llevar la entrada IN de la función a nivel alto.




El Contacto de temporizador que vemos a la entrada IN del temporizador TP es el de la fotografía anterior y corresponde al temporizador IEC Timer 0 DB 12. Se puso hay para evitar la activación simultanea del arranque y puesta a nivel alto de IN, pero luego se pudo comprobar que no servia de nada puesto que con la llamada de la instrucción de arranque el temporizador TP ya realizaba su función.

martes, 14 de julio de 2015

Como crear un programa en SCL

Como crear un programa en SCL.
Cosas a tener en cuenta si queremos que nuestro programa no genere fallos de ciclo.

Lo primero que tengo que deciros, es que la ejecución se realiza de forma lineal, linea por linea, es decir y para dejarlo de una manera muy clara, lee el programa en SCL igual que si estuviese escrito en FOP o KOP, no como un programa normal escrito en un lenguaje de programación tipo C+ o VB. Ademas tenemos que tener cuidado con los saltos dentro del programa por que se pueden quedar variables sin cambiar de estado por culpa del salto.

Voy a poneros un ejemplo, imaginaros que tenemos una variable tipo booleana, que llamaremos Var
esta variable si esta a 1 activa una temporización, pero antes de llegar a la linea que la activa tenemos una instrucción IF, que en función del valor de esa variable u otra puede provocar un salto a otra linea del programa sin pasar por la linea que activa la temporización. Que es lo que ocurre? Pues que aunque Var halla cambiado de valor, al haberse producido el salto, en esa linea en concreto donde se activa la temporización Var sigue valiendo 1.

Tened esto en cuenta, por que en otros lenguajes de programación esto no ocurre y si estáis acostumbrados a que sea así puede traeros problemas, a la hora de poner el programa en funcionamiento.

El sistema operativo del autómata realiza una lectura cíclica de nuestro programa ese ciclo se puede controlar su tiempo de duración (mínimo 150ms y máximo 6000ms) esto se hace así para evitar bloqueos del programa si trascurrido el tiempo máximo que le hemos configurado a la CPU el sistema operativo genera una alarma que hace que el sistema operativo busque la OB 80 es la encargada de registrar el fallo que ha realizado el programa y evitar el bloqueo de la CPU pero trascurridos unos pocos ciclos mas si el fallo persiste acaba bloqueándo la CPU.

Os cuento esto por que ciertas instrucciones pueden provocar fallos de ciclo si no son usadas correctamente.

Instrucciones FOR NEXT, WHILE DO, REPEAT-UNTIL.

Estas instrucciones pueden provocar fallos de ciclo y consecuentemente bloqueo de la CPU sino se usan correctamente, que quiere decir esto?
Voy a poneros un ejemplo, ya que en el manual de programación del S7 1200 trae a bastante confusión debido pienso yo a una mala traducción que se ha podido hacer del original.

WHILE (#RiegoDomingo = TRUE)DO
IF (#EHoraCalendario.HOUR >= #IRDomingo AND #EHoraCalendario.HOUR <= (#IRDomingo + #TRDomingo)) THEN #Sector1 := true;#BombaRiego:= true;
ELSIF (#EHoraCalendario.HOUR > (#IRDomingo + #TRDomingo)) THEN #BombaRiego := FALSE; #Sector1 := false;
END_IF;
#VisInicioReg := #IRDomingo; #VisiTiempoReg := #TRDomingo;
EXIT;
END_WHILE;

Aquí os pongo un ejemplo con una instrucción WHILE, fijaros bien donde esta situada la instrucción EXIT. Por que esta situada ahí y para que sirve?.

Si olvidamos de poner la instrucción EXIT lo que ocurrirá es que si la condición de WHILE es cierta se ejecuta de forma permanente esta rutina hasta que salta la alarma de tiempo de ciclo excedido. EXIT lo que hace es que una vez ejecutada la rutina el programa continué su marcha por eso se coloca al final de la rutina.


En las de mas instrucciones hay que hacer lo mismo. 

viernes, 10 de abril de 2015

Conversión analógica a digital con la CPU del S7 1200

Conversión analógica a digital con S7 1200.

En el S7 1200 tenemos dos entradas analógicas, en la parte superior de la CPU en el conector X11,
estas entradas solo leen valores en tensión de 0 voltios a 10 voltios suficiente para poder realizar algún que otro ejercicio interesante.


El ejercicio que he realizado consiste en leer la entrada analógica 0 y en función de su valor activar o desactivar las cinco salidas a relé que tiene la CPU. Para ello, utilizo un divisor de tensión compuesto por una resistencia de 15Kohm y un potenciómetro de 10Kohm, la salida intermedia del potenciómetro es la que va conectada a la entrada analógica de la CPU y en función de la posición del potenciómetro, tendremos un valor u otro de tensión a la entrada analógica 0.




La programación la he realizado nuevamente en SCL (para ir practicando), y utilizo las instrucciones NORM_X y SCALE_X, primero tenemos que normalizar el valor de la entrada entre dos valores uno MIN y otro MAX existente entre 0 y 27648. El valor de entrada tiene que ser del tipo real y la función nos devuelve otro valor normalizado entre el mínimo y máximo del tipo real, también a pesar de lo que dice el manual a mi no me ha dejado cambiar de tipo de variable por lo menos en programación SCL.

Una vez ya tenemos el valor de la entrada normalizado procedemos a escalarlo en este caso de 0 a 6
es decir los 27648 valores posibles estarán divididos en 6 partes. SCALE_X funciona de la misma forma que NORM_X tiene una entrada de valor y otras dos para el máximo y el mínimo de la escala
(ver fotografía de panel).

El programa sigue con una instrucción CASE, en la que, en función del valor devuelto por SCALE, activaremos unas salidas u otras yendo de estar todas desconectadas a conectadas en en función de como movamos el potenciómetro.


Descargar el programa en el siguiente enlace:
Ejercicio de de conversión analógica a digital

Descargar el programa en el siguiente enlace:
El voltimetro

Fotografía: El voltímetro