Hace unas semanas desde Italia (¡ciao Alessandro!) me preguntaban si su CPU 318 además del OB 35 y el OB32, podía activar otro OB cíclico.
Nos estamos mal acostumbrado (en el buen sentido) con TIA Portal y los nuevos PLC, pero en la serie 300 y 400 los OB cíclicos vienen definidos por la CPU.
¿Comooor?
Pues sí, es lo que hay.
Así como en TIA Portal con los S7-1200 y S7-1500 puedes crear diferentes OB cíclicos en función de necesidades y eligiendo el numero de OB cíclico, con las series 300 y 400, esto no es así.
Los OB cíclicos en estas series quedan definidas por el modelo de CPU que estés usando.
No solamente eso, ya que el número de cada OB cíclico está pre determinado.
Para modelos actuales, no es un gran problema ya que típicamente tienen cuatro OB ciclico: desde el OB32 al OB35
Pero los modelos más antiguos o modestos pueden tener solamente 1 ó 2 OB cíclicos. Por ejemplo, el caso de Alessandro: solo tiene disponible el OB32 y el OB35 como se muestra en la imagen:
La cuestión es que si tienes diferentes tareas a realizar a tiempo fijo ¿cómo lo haces si solamente tienes 1 o 2 OB ciclico?
Vamos a suponer que tienes una CPU un poco viejita que solo tiene 1 OB cíclico para que sea todo más claro.
Ni que decir tiene que esto que te voy a contar es exportable si tienes un número mayor y lo puedes aplicar parcial o totalmente si fuera necesario.
Contenido
Crear tareas a tiempo fijo con solo un OB cíclico
La idea es tan sencilla que seguro que se te ha ocurrido, pero quiero compartir esta idea tan básica con personas que igual no han caido en ello como tú y yo.
Imagina que quieres que el PLC de Siemens realice 4 tareas a tiempo fijo: 50, 60, 100, 500 ms.
He puesto 50 y 60 aunque sea muy raro, para que veas la pequeña limitación.
Como ves, con el OB35 out of the box que dicen los ingleses tendrías la opción 3: cada 100ms.
Pero ¿y el resto?
Pues muy sencillo.
Lo que vas a hacer es buscar el MCD o Máximo Común Divisor…
¡tóma! ¡tóma! y ¡tóma!
…lo que estudiaste en primaria, ¡resulta que te va a servir cuando tienes unas cuantas canas ya!
Ahora ya en serio: vamos a buscar el ciclo más alto que hagan que se puedan ejecutar todos los intervalos.
En este caso, nuestro MCD es 10ms.
¿Por qué?
Porque si ponemos el OB35 a 10ms, nos aseguramos que cada 5 veces podemos ejecutar la tarea de 50ms, cada 6 veces la de 60ms, cada 10 veces la de 100ms y cada 50 veces la de 500ms.
¿Sí, verdad?
Vale. ¿Cómo hacemos para que solo se ejecute cuando nosotros queramos como si tuviéramos un OB cíclico para cada periodo?
La forma más sencilla es con una marca a modo de contador que vaya de 1 a 50 y que en función del valor de éste, ejecute una u otra tarea.
Cuando el contador llegue a 50, lo pones a cero, de tal forma que va a pasar por todas los ciclos al menos una vez.
¿Como hacemos con las tareas de 50, 60 y 100ms?
Como ves, si lo ponemos de 1 a 50, como idea está bien para ejecutar el de 500ms, ya que así nos aseguramos que ejecutamos este ciclo cada 500ms.
Pero en el caso de 50ms, tendrá que ejecutarse en el ciclo 5, en el 10, 15.. etc.
Podrías hacer que el contador cuando valga 5 o 10, o 15 o 20… ejecute la tarea.
Pues sí. Pero sería poco elegante ¿no crees?
La forma PRO de hacerlo es usando el comando MOD.
¿Qué es el comando MOD?
El comando MOD nos devuelve el resto de una división.
Por tanto, si cogemos ese contador y hacemos MOD con 5 y su resto es cero significa que es 5, o múltiplo de 5, con lo que tienes que ejecutar la tarea de 50ms.
¿Mola o no mola?
Houston, tenemos un problema…
Antes de que empieces a llorar de la emoción, igual has detectado un pequeñísimo problema.
Si hacemos de 1 a 50 el contador, y cuando llegue a 50 lo ponemos a cero… funcionará genial para 50, 100 y 500… pero ¿y con 60?
También… ¿o no?
Pues no.
No funcionará del todo bien.
La razón es muy sencilla: 50 no es múltiplo de 6 y por tanto, en el primer ciclo, genial hasta que el contador vale 48… pero es que el siguiente debería ser 54… es decir… ¡el 4 de la siguiente vuelta!
¡Maldita sea! El MOD no nos valdría.
Pero tranquilo, porque tus estudios de primaria, vienen al rescate:
Mínimo Común Múltiplo
¡No me digas que esto no es una fiesta!
Si hemos usado el Máximo Común Divisor para determinar el periodo de nuestro OB cíclico… el Mínimo Común Divisor se tenía que apuntar a la juerga ¿no crees?
Pues va a ser que sí.
Así pues, nuestro contador o índice, no irá de 1 a 50, sino de 1 a … redoble de tambor… ¡150!
Ahora sí, haciendo MOD, todos las tareas se ejecutarán cuando deben ya que cerramos de forma perfecta los ciclos del contador.
Estoy viendo cómo se resbalan las lágrimas por las mejillas y te tiembla el labio inferior de pura emoción…
¿Es un problema bajar mucho el tiempo de ciclo del OB cíclico?
La respuesta es un depende de libro.
Si las tareas son muy básicas, podrás bajarlo muchísimo.
Si las tareas son muy complejas y largas, entonces lógicamente la cosa se complica más.
La idea es que la suma de las tareas no superen los 10ms.
Pero si no tienen los tiempos iguales… ¡melón!
Ya, pero cada 1500ms, se van a ejecutar todas: la de 50, 60, 100 y 500… porque todas tendran MOD igual a cero cuando el contador valga 150.
Por tanto, ojo con esto… ¡listo!
El sistema no es perfecto, pero vale para salir airoso del envite.
El vídeo
En el siguiente vídeo te dejo con un pequeño ejemplo ilustrativo de lo que estamos tratando de poner un OB cíclico a trabajar de esta manera
¿Qué te ha parecido?
Espero que te haya gustado y te haya abierto alguna puerta en el futuro.
Como otras veces, este ejemplo con el proyecto lo colgaré en los anexos del bloque 2 del Curso de TIA Portal para que los alumnos lo tengáis siempre a mano.
Como imaginarás, esto es más aplicable en las CPU antiguas que solo tenían un OB cíclico.
Hoy en día, ya no es necesario porque puedes programar muchos más aunque sea de la serie 300.
Pero como nunca se sabe con qué vas a tener que lidiar, está bien saber estas cosillas ¿no crees?
Enseño a programar PLC de Siemens a través de mis cursos.
Más información sobre mi aquí
Puedes seguirme en cualquiera de las siguientes redes sociales.
12 Comentarios
Puff! Se me acaba de deshacer un poco la pelota al ver en el ejemplo que el “resto” de todas las operaciones sea la MD204!
No se si lo he acabado de entender del todo (el hecho de que no se machaque el valor de MD204) pero…
al ejecutarse los segmentos, el último que se ejecuta sobreescribe al anterior sin que afecte al valor de la marca en los segmentos anteriores en ese mismo ciclo? Y si no afecta a los anteriores, los posteriores tampoco? Porque lo sobreescribirian?
Madre! Qué duda!
Hola Jorge,
Creo que te estás liando.
La variable Resto, como bien dices, es machacada en cada segmento por un nuevo MOD. ¿y que mas da?
Fíjate que lo que haces es realizar el MOD, obtener el resto en MD204 e INMEDIATAMENTE evaluar su valor para decidir si ejecutar el FC pertinente o no.
Evidentemente, en el siguiente segmento, se le da nuevo valor, pero se vuelve a evaluar seguidamente.
Realmente el MD204 es una variable auxiliar necesaria para evaluar el resto, pero no es necesario tener una por cada MOD ya que digamos que solo necesito el contenido de esta variable durante la ejecución de cada segmento. Luego, una vez evaluado,su valor es irrelevante.
¿me sigues?
Saludos
Gracias Íñigo;
Si, me estaba liando la verdad…
Digo siempre lo mismo, eres um crack!!!!
Muchas gracias !!!!
Buena opcion. Siempre es bueno ser conscientes de las posibilidades de un automata. Gracias
Me parece Maravilloso, creo q debo dedicarme un poco mas…agradecida
Hola Íñigo:
Eres el hombre S7.
Tras un periodo de descanso vuelvo a poder ver tus vídeos y como siempre son del todo amenos e instructivos.
Aprovecho para desearte una feliz Navidad.
Saludos
Jaja
Muchas gracias Juan!
Felices fiestas también !
genial gracias..
Buen video… Lo bueno si breve 2 veces bueno.
Buen trabajo, yo estoy buscando información del ob35 para ejecutarlo a 1ms, lo necesito para hacer una medición con fotocelula infrarrojas, pero necesito un ciclo muy bajo para precisión y no se si se puede que el ob 35 trabaje a 1ms.
Depende del PLC y de la tarea que quieras ejecutar cada 1ms. no es lo mismo querer hacer una suma cada 1ms que mil sumas.
Si puede trabajar a 1ms, es fácil de saber ¿te deja configurarlo a 1ms? ¿has mirado las especificaciones de la CPU?
Respecto el trabajo a realizar, pues eso ya es lo que quieras programar.
Si la CPU es moderna, un 1200, o un 1500, puede seguro. CPU 300 viejas, pues no.