Cuando empiezas a programar tal vez te surjan una duda cuasi existencial… ¿Qué es mejor usar? ¿FC o FB?… pues básicamente, depende.
En general con ambos se pueden hacer lo mismo. Cambia la forma. Pero digamos que no están pensados para lo mismo.
- Los FC serán ideales para generar resultados que no tengamos que almacenar. Dentro de la automatización lo usaremos en la lógica general de los programas. Pueden ser usados en líneas generales de actuación de las máquinas, secuencias e interrelación entre ellas.
- Los FB son como los FC, pero vitaminados. No solamente podremos hacer lo que hacemos con los FC sino que además podremos almacenar valores ya que tienen asociados DB. Además podremos usar los temporizadores IEC de forma muy sencilla evitando complicarnos con los temporizadores de S5 para nuestros propósitos. Serán adecuados para el manejo de motores, variadores etc ya que podremos juntar similares funcionalidades bajo el mismo FB usando DB para cada uno de ellos.
Está claro entonces… uso FB siempre y ya está.
Esta es la conclusión a la que fácilmente podrías llegar tras lo expuesto. Antes de dar este paso hay que tener en cuenta que los FB siempre han de tener un DB asociado.
Eso en sí mismo no es un problema, pero puede serlo si el programa es extenso y has de tener muchas funciones para una correcta organización del programa. El uso inecesario de FB hacen que se ocupe memoria de forma innecesaria ya que generarás un DB lo necesites o no.
Si todo lo haces con FB, y el proyecto es suficientemente complejo, tendrás un sinfín de DB. Hay que elegir por tanto los FB en general cuando:
- El FB controle un actuador o motor y tengas varios del mismo tipo de tal forma que puedas reutilizar el FB no necesitando usar marcas. Esto hace que sea más fácil de mantener y más difícil de cometer errores ya que no necesitarás tener en cuenta qué marcas están usadas y cuales no.
- Necesitas guardar datos de forma permanente. Qué mejor hacerlo a través de un FB ya que así tienes un DB asociado donde guardar estos datos.
- Si vas a usar el FB con diferentes motores por ejemplo, y necesitas temporizadores. Puedes usar los temporizadores IEC y usarlos como multiinstancias.
¿Cuándo usaremos los FC entonces?
- Para planteamientos generales de las aplicaciones, o para actuadores que no necesiten ser reutilizados.
- Funciones aritméticas, trigonométricas o de otra índole que no necesiten almacenar los datos y que simplemente nos devuelva un valor o que se utilicen marcas globales.
En definitiva, habrá que evaluar cada caso para saber qué usar. Por lo general personalmente uso más los FC que FB, pero dependerá del proyecto en concreto.
Para finalizar adjunto un video en el cual presento las diferencias entre los FB y los FC en ejemplos muy sencillos: un sumador, un totalizador de tiempo y el uso de temporizadores. Ahí quiero mostrarte las diferencias entre ambos para que puedas intuir con más facilidad cuál es el concepto para cada caso.[divider]
Referencias:
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.
19 Comentarios
Hola Íñigo:
O yo entiendo mal o en el vídeo dices que no se puede utilizar una FC dos veces en el mismo ciclo. Yo siempre he creído que si, supongo que la FC coge la memoria temporal, hace lo que tiene que hacer, deposita los resultados en la memoria de trabajo, y, si es necesario se vuelve a ejecutar, borrando los resultados de la memoria temporal que tenía previamente y usando los que tiene en ese momento. O he entendido mal, o me he perdido algo ¿a qué te refieres diciendo que no se puede usar una FC varias veces en el mismo ciclo?.
Un saludo.
Hola,
A ver, por partes.
Siempre se pueden hacer varias llamadas al FC o FB, otra cosa es que sea necesario o conveniente. Me explico:
Si el FC es una función en la que tiene unas entradas y unas salidas, para hacer por ejemplo la suma del ejemplo, por supuesto que puedes hacer tantas llamadas como quieras ya que su trabajo es eso, una función, no repetir código y mediante unas entradas, dar unas salidas.
Otra cosa es que por ejemplo tengas dividido tu máquina en 10 FC, cada uno con sus llamadas a otros FC y FB. Estos sólo los llamaras una vez por ciclo de scan ya que su función no es la de reutilizar código, sino la de estructurar el código de la máquina dividiendolo en secciones. En este caso, estos FC serán llamados una vez, típicamente desde el OB1 o un OB cíclico.
Y sí, todas las variables temporales usadas en un FC una vez terminado la ejecución del FC son borradas. Pero OJO, las temporales. Si usas una marca o DB dentro de ese FC no son borrados. De ahí que cuando se usa para reutilizar el código, se usan las temporales salvo que sacrifiques marcas para usarlas como temporales, borrándolas al principio del FC para que al inicio siempre tengan valor nulo. Pero esto es absurdo ya que para eso, pues usas las temporales y no malgastas marcas.
No sé si he respondido a tu duda. En cualquier caso, sobre qué momento digo lo que comentas?
Porque desde luego, me he expresado fatal para que me hayas entendido lo que comentas.
Un saludo y gracias como siempre por comentar.
Esta semana, más de direccionamiento indirecto ;P
Hola de nuevo:
Es verdad, acabo de hacer un programa con una FC con un arranque paro-marcha, la he llamado tres veces y le he metido diferentes entradas y salidas, probado y funcionando… Los problemas han venido al meterle una temporización para que retrase la puesta en marcha de la salida… Bueno, veo que tus respuestas son rapidísimas, te lo agradezco. Respecto al vídeo, esta tarde he estado viendo varios, si no te importa, mañana lo visualizo otra vez y te lo comento, si no ya no sé ni lo que puedo entender, como te he dicho, a lo peor lo he confundido. Un saludo Íñigo.
Muchas gracias por tu ayuda!
Creo que ambos estamos ahora cacharreando…
Si vas a hacer varias llamadas a un Fc de marcha paro y necesitas temporizar la mejor opción es usar un FB y usar temporizadores IEC (TON y TOF). Los metes en los Stat y listo.
También se podría usar un FC y pasarle un número de temporizador y aplicar el direccionamiento indirecto. Pero es un poco más cutre y además tienes un problema muy gordo.
El direccionamiento indirecto tiene un problema: no se ve.
Es decir, si le pasas el número de temporizador y haces el código bien, funcionará. Pero amigo, el problema va a ser cuando vayas a ver las referencias cruzadas y esos temporizadores que quieres usar aparecen como no usados y entonces un día, dentro de X meses uses uno ocupado sin querer y la lies muy parda.
Y como con los temporizadores, digo las marcas, por ejemplo.
Si se van a usar direccionamiento indirectos siempre que se pueda, hay que usar DB porque es algo que has construido tú, y ya ves que está ahí por algo, no como las marcas, que están de serie y si te dice el sistema que no están usadas, pues piensas que no lo están.
Seguimos en contacto.
Hola estoy programando s7 300, y estoy viendo los FC y FB. Estoy haciendo un FB para el arranque directo de motores. Mi pregunta es en donde se guardan las entradas I0.0, I0.1 y la salida Q0.0 en el mismo DB de instancia?, cuando yo abro el DB de instancia solo veo los datos locales del FB, entonces si tengo 20 motores y llamo 20 veces EL FB de arranque pero con el mismo DB de instancia, igual me corre el programa y no lo he hecho con 20 DB’s de instancia, solo con uno, entonces cuando debo utilizar DB’s de instancia para cada motor?
Hola Diego,
Las entradas y salidas se almacenan en el DB de instancia. Si miras en las STAT deberían estar ahí.
Lo que ocurre es que si sólo usas entradas y salidas y no usas variables remanentes (STAT), estás actualizando en cada llamada las entradas y salidas, pero conceptualmente NO deberías usarlo así.
Si no vas a usar mas que variables locales no remanentes, es decir, que no sean necesarias de ciclo a ciclo, usa FC y no FB.
Un saludo,
Hola Iñigo, tengo una duda . He creado un fb para controlar motores donde uso unos temporizadores ton. Me gustaría saber cuantas instancias puedo usar de ese fb. Gracias Gregorio.
En principio no deberías tener de usarlo tanto como quieras limitado a la memoria del PLC, pero dudo que eso sea un limitante.
Un saludo
Buenas tardes iñigo, yo creo que para aclarar las dudas de un fb y un fc y db te pido porfavor si puedes explicar las basea para poder utilizarlos (diferencias y aplicaciones), esto seria con un ejemplo ya que las ayudas por internet no son muy claras, gracias
En el vídeo hay un ejemplo.
Saludos
Hola
He programado un fc en el cual dentro tengo una función con timers y de esa combinación tengo, por ejemplo «T1» ,asignado a una Q.0.0, pero en el momento que lo llamé y se está ejecutando y después mando un paro de emergencia, en teoría se desactiva el FC pero los valores de Q0.0 se quedan ya sea en 1 o 0
Porque no se desactiva la señal de Q0.0 en el momento que mando un paro, además de que mando un reset a los timer? LA SALIDA Q SI SE DESACTIVA SOLO SI TAMBIÉN LE ASIGNO UN RESET
Arturo,
Si desactivas un FC donde se maneja una salida la salida se quedará tal y como esté la ultima vez que se le dio valor. De ahí que se quede en alta.
Saludos
Hola Iñigo, gusto en saludarte…
Primero que nada agradezco cada uno de tus articulos, los leo una y otra vez buscando ideas… Gracias…
Deseo consultarte lo siguiente: el plc S7 1200 posee alguna función que totalice el valor recibido de señal analógica? O debo crearla? Por ejemplo: el flujo instantáneo como señal analógica e ir acumulando el valor de litros a través del tiempo.
Gracias
Que yo conozca, no existe. Tienes que crearla
Hola Profe, tengo un problema que no llego a resolver, ni comprender, aunque creo que está relacionado con la Máquina de Mealy para el reconocimiento de una secuencia 101. Quiero Implementar una máquina de estados reconocedora de la secuencia de caracteres binarios 101. La entrada la realiza un operario de forma manual a partir de uno de los interruptores de la periferia integrada. La entrada será validada cada 3 segundos.
Este es la descripción del montaje para practicar con el entorno Simatic Manager:
El PLC hará el papel de reconocedor y existirá una sola entrada de datos (E 124.0) operada por el propio alumno mediante el interruptor correspondiente con la interpretación natural de nivel alto->1 y nivel bajo->0.
La validación de los datos estará controlada por el propio autómata y será cada 3 segundos por dato.
Cada vez que se admita un dato como válido se activará la salida A 124.0 durante un segundo, para avisar al operario de que el dato se ha leído correctamente.
Al caer la salida el operario tendrá todavía 2 segundos para introducir el nuevo valor.
Al terminar el proceso el número de secuencias 101 encontradas se almacenarán en el byte AB 125 (y, por tanto, se iluminarán los leds correspondientes en la periferia integrada).
El ciclo termina cuando se hayan leído un número de caracteres N determinados al inicio del ciclo (por ejemplo N = 10). En ese momento se muestra el número de secuencias detectadas en el byte AB 125.
El sistema debe contar con un pulsador P_ON disparado por flanco para arrancar la cuenta y un pulsador de RESET para reiniciar el proceso en cualquier momento.
Hasta que no se pulse RESET no se considerará el ciclo terminado, con lo que la palabra AW
125 seguirá conteniendo el resultado del último ensayo hasta entonces.
Para una mejor estructuración de la implementación, se empleará un bloque de datos global para almacenar el tiempo de validación entre datos (3 segundos) y el número de caracteres totales a leer (por ejemplo 10 bits).
La estructura del bloque es la siguiente:
• OB1 y OB100: Boque principal y de arranque completo.
• FC1: Bloque relativo a la parte secuencial del automatismo (activación de etapas).
• FC2: Bloque relativo a los actuadores.
• FC3: Bloque relativo a la detección de flancos.
• FC4: Bloque que lanza el temporizador para la validación de datos.
• DB1: Bloque de datos global con la información del número de caracteres total de la secuencia de entrada (10 bits) y del tiempo de validación (3s).
Lo siento, pero no resuelvo ejercicios de estudiantes. Se trata de que lo resuelvas el estudiante, no que alguien se lo haga.
Solo soy técnico electricista de mantenimiento y , sin haber recibido cursos o adiestramiento, con un SLC500 de Allen Bradley he hecho subrutinas, escalados, temporizaciones, contadores, sumatorias, divisiones, etc. Y ahora, tratando de entender los Siemens, luego de horas y horas viendo cursos por YouTube, estoy más desorientado y perdido que Tarzan en Nueva York. Definitivamente, SIEMENS tiene una gran debilidad en cuanto a su concepción, debido a que pone las cosas más difíciles. Pero bueno, seguiré intentando hasta que algún día pueda hacer lo que ahora hago con Allen Bradley…
Bueno, error en la concepción.. si has trabajado con Siemens, no tienes problemas. Solo estás acostumbrado a trabajar de otra forma. Para mi, la forma extraña de concepción sería la de Allen Bradley, que es con la que no trabajo.