jueves, 4 de febrero de 2016

Primeras impresiones con el LOGO 8

Primeras impresiones con LOGO 8

Conozco gente, profesionales como electricistas, ingenieros, informáticos, que andan metidos en este mundo de la automatización y cuando a salido el tema de los relés lógicos mucha de esa gente no quiere ni oír hablar de ellos, refiriéndose a ellos de una manera despectiva (esa mi.....); Bueno, esta claro que yo no comparto su opinión, creo que son unos dispositivos muy interesantes que nos pueden dar buenas soluciones a los problemas de automatización.

Debe de quedar claro que no tienen las mismas prestaciones que un autómata (S7 200,300,1200,1500), pero no por esto hay que dejar de contar con ellos, pienso que a cada problema una solución concreta, o dicho de otra forma a cada paciente su medicina.

Características del LOGO 8.

Todo módulo base LOGO! soporta las siguientes conexiones para crear programas,
independientemente del número de módulos conectados:
• Entradas digitales I1 hasta I24
• Entradas analógicas AI1 a AI8
• Salidas digitales Q1 a Q20
• Salidas analógicas AQ1 a AQ8
• Marcas digitales M1 a M64:
– M8: marca de arranque
– M25: marca de retroiluminación: display integrado en el LOGO!, blanca
– M26: marca de retroiluminación: LOGO! TDE, blanca
– M27: marca del juego de caracteres para textos de mensajes
– M28: marca de retroiluminación: display integrado en el LOGO!, ámbar
– M29: marca de retroiluminación: display integrado en el LOGO!, roja
– M30: marca de retroiluminación: LOGO! TDE, ámbar
– M31: marca de retroiluminación: LOGO! TDE, roja
• Bloques de marcas analógicas: AM1 a AM64
• Bits de registro de desplazamiento: S1.1 a S4.8 (32 bits de registro de desplazamiento)
• 4 teclas de cursor
• Salidas no conectadas: X1 a X64
El LOGO! 0BA8 soporta adicionalmente la visualización de las siguientes entradas y salidas
digitales/analógicas de red, siempre y cuando el usuario las haya preconfigurado en el
programa con LOGO!Soft Comfort V8.0 y haya descargado el programa al dispositivo 0BA8:
• 64 entradas digitales de red: NI1 a NI64
• 32 entradas analógicas de red: NAI1 a NAI32
• 64 salidas digitales de red: NQ1 a NQ64
• 16 salidas analógicas de red: NAQ1 a NAQ16

Es programable a través del teclado del propio LOGO o mas cómodo, mediante el programa LOGO Soft y con un cable de ethernet podemos conectarlo al ordenador para realizar la trasferencia del programa y datos o bien también se puede realizar dicha trasferencia mediante una memoria micro-SD.

Programación Del LOGO

Como he dicho anteriormente es mejor programar el LOGO a través de LOGOSoft, ya que con el teclado esta tarea se puede hacer muy pesada y a parte no ofrece la visión del programa que ofrece el LOGOSoft.

No voy hacer aquí un tutorial de como hay que manejar el LOGOSoft (no de momento) solo dire como me a ido la experiencia de programar.

Lo primero que tenemos que saber la gente que programamos autómatas, es que lenguaje de programación debemos de emplear, bueno pues en el caso del LOGO no hay mucho donde elegir o FUP o KOP no hay mas. Yo personalmente me apaño bien con los dos a un que tengo cierta debilidad por las puertas lógicas. Se nos permite jerarquizar el diseño a través de las UDF o bloques lógicos que emplearemos para clarificar el diseño.

Bien pues con todo esto me he puesto manos a la obra y he querido hacer el programa de control de vaciado de fosa que tengo hecho para el S7 1200 adaptarlo al LOGO, evidentemente no es igual ni tiene el HMI o pantalla, pero si que comparte sus características de control, como son, control de tres bombas, control de las boyas de nivel y una novedad control del vaciado de la fosa según el numero de bombas que estén en marcha.



El control de las tres bombas, consiste en poner tantas bombas haya en funcionamiento, según el nivel de llenado de la fosa y mantener esas bombas funcionando hasta que se vacíe la fosa. Una vez vaciada la fosa si esta se vuelve a llenar no entraría otra vez la bomba que lo hizo con anterioridad si no otra para que así las tres bombas lleven un relevo y que las horas de diferencia funcionamiento sean lo mas cortas posible.

El control de las boyas de nivel, se encarga vigilar de que si alguna boya no sigue una secuencia de activación correcta el sistema de control reacciona, primero generando una alarma y segundo tomando una decisión sobre que numero de bombas debe de poner en marcha, si se da el caso.

El control de vaciado, Una vez están caídas las boyas de nivel y solo queda la de vaciado, aremos un seguimiento de la misma con una temporización, es decir que si esta boya permanece un tiempo activa después de la caída de la boya de nivel 1 se desconectaran las bombas pasado este tiempo, como medida de protección. El tiempo de seguimiento varia según el numero de bombas que haya en funcionamiento, a mayor numero de bombas, menor tiempo.


Bueno pues con todo esto me puse a trabajar y he creado un programa para el LOGO que me habrá llevado unas 15 horas en total crearlo (un ratito hoy y otro mañana) y este a sido el resultado.


Programa de control de fosa para LOGO 8:


DEMOs de SIEMENS de LOGO soft con la que podrás simular  el funcionamiento de mi programa.

Directamente de Siemens:

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.