FC o FB ¿Cuál de los dos usar?

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.

FC o FB

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.

Referencias:

Acerca de Iñigo Gútiez

Ingeniero industrial por la Escuela de Ingenieros Superiores de Bilbao. Trabajo como ingeniero de proyectos y automatización en Guardian Industries

Te puede interesar

Idea_Proyecto

Buenas prácticas de programación en S7

Siempre que comenzamos a programar, tenemos la incertidumbre de si la forma en la que …

14 Comentarios

  1. 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.

  2. 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.

  3. 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.

  4. 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?

  5. 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,

  6. 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.

  7. 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

  8. 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