Si llevas un tiempo programando en TIA Portal, en algún momento te has encontrado frente a la misma pregunta: ¿creo una FC o una FB? Ambas son bloques de función, ambas sirven para organizar el código, y sin embargo se comportan de forma completamente diferente. Elegir mal tiene consecuencias reales: código que no retiene valores, instancias duplicadas innecesarias, o programas difíciles de mantener.
En este artículo vas a entender con precisión qué es cada una, cómo funcionan internamente, cuándo corresponde usar una u otra, y los errores más frecuentes que cometen los programadores cuando las confunden.
Qué es una FC (Function)
Una FC, o Function, es un bloque de código sin memoria propia. Recibe parámetros de entrada, ejecuta una lógica y devuelve un resultado, pero no guarda ningún dato entre ciclo y ciclo. Cuando la FC termina su ejecución, todas sus variables locales se pierden.
Piénsalo como una función matemática pura: le das unos valores, te da un resultado, y no recuerda nada de la llamada anterior.
Características de la FC
- No tiene bloque de datos de instancia asociado.
- Sus variables temporales (Temp) se reinician en cada llamada.
- Puede devolver un valor mediante el parámetro Return.
- Se llama directamente desde OB, desde otra FC o desde una FB.
- Ideal para cálculos, conversiones y lógica combinacional.
Ejemplo típico de uso de una FC
Imagina que necesitas calcular el caudal volumétrico a partir de una señal analógica de presión diferencial. Esa operación matemática siempre recibe los mismos tipos de datos y devuelve un resultado. No necesita recordar nada entre ciclos. Una FC es exactamente lo que necesitas.
Otro ejemplo clásico: una FC que convierte un valor de temperatura de grados Celsius a Fahrenheit, o una FC que evalúa si una señal analógica está fuera de rango y activa una salida de alarma.
Qué es una FB (Function Block)
Una FB es un bloque de código con memoria propia. A diferencia de la FC, la FB tiene asociado un bloque de datos llamado DB de instancia, donde se almacenan todas sus variables entre ciclos de ejecución. Esto significa que los valores que tenía la FB en el ciclo anterior siguen disponibles en el siguiente.
Piénsalo como un objeto con estado: tiene sus propias variables internas que persisten en el tiempo y pueden ser leídas o modificadas desde fuera.
Características de la FB
- Requiere un DB de instancia para ser llamada.
- Sus variables Static mantienen el valor entre ciclos.
- Puede tener múltiples instancias independientes (cada una con su propio DB).
- Ideal para control de máquinas, secuenciadores, PIDs, temporizadores personalizados.
- Permite encapsular lógica compleja con estado propio.
Qué es el DB de instancia
Cuando llamas a una FB, TIA Portal te obliga a asociarle un DB de instancia. Este bloque de datos es donde se guardan físicamente las variables Static de la FB. Cada vez que llamas a la misma FB para controlar una máquina diferente, usas un DB de instancia distinto. De esa forma, las dos máquinas tienen su propio estado independiente aunque compartan el mismo código.
Esto es una de las ventajas más potentes de las FB: puedes escribir la lógica una vez y reutilizarla para diez motores, diez válvulas o diez zonas de temperatura, sin duplicar código.
Tabla comparativa: FC vs FB
| Característica | FC (Function) | FB (Function Block) |
|---|---|---|
| Memoria propia | No | Sí (DB de instancia) |
| Variables estáticas (Static) | No disponibles | Disponibles |
| Variables temporales (Temp) | Sí (se reinician cada ciclo) | Sí (se reinician cada ciclo) |
| DB de instancia obligatorio | No | Sí |
| Múltiples instancias independientes | No aplica | Sí |
| Valor de retorno | Sí (parámetro Return) | No (usa parámetros Output) |
| Uso recomendado | Cálculos, conversiones, lógica combinacional | Control con estado, secuenciadores, reutilización |
| Complejidad de llamada | Simple | Requiere gestión de DB de instancia |
Cuándo usar una FC
Usa una FC cuando la lógica que vas a implementar no necesita recordar ningún valor entre ciclos de ejecución. Los casos más frecuentes son:
Cálculos y conversiones matemáticas
Conversión de unidades, escalado de señales analógicas, cálculo de potencia activa a partir de tensión y corriente. La FC recibe los valores como parámetros de entrada y devuelve el resultado. Sin estado, sin memoria, sin complicaciones.
Lógica combinacional
Evaluación de condiciones que dependen únicamente de las entradas actuales, no del historial. Por ejemplo: detectar si un conjunto de sensores cumple simultáneamente una condición de seguridad.
Rutinas de diagnóstico puntuales
Comprobaciones que se ejecutan cuando se solicitan y devuelven un estado o código de error. No necesitan recordar el resultado de la llamada anterior.
Estructuración del código
Dividir un programa largo en partes más manejables cuando cada parte es independiente y no necesita memoria. Las FC ayudan a ordenar el código sin añadir complejidad de DB.
Cuándo usar una FB
Usa una FB cuando la lógica necesita mantener un estado entre ciclos, o cuando vas a reutilizar la misma lógica para múltiples elementos independientes.
Control de motores y actuadores
Un motor tiene estados: parado, arrancando, en marcha, frenando, en fallo. Esos estados deben persistir entre ciclos. La FB guarda el estado actual en sus variables Static y lo usa en el siguiente ciclo para decidir la transición correcta.
Secuenciadores de proceso
Cualquier lógica que avance de un paso al siguiente según condiciones necesita recordar en qué paso está. La variable Static «Paso_Actual» de la FB cumple exactamente esa función.
Temporizadores y contadores personalizados
Si implementas tu propio temporizador dentro de un bloque, necesitas guardar el tiempo acumulado entre ciclos. Solo la FB te permite hacer eso sin recurrir a marcas globales.
Reutilización con múltiples instancias
Tienes diez bombas en la instalación con la misma lógica de control. Escribes la FB_Bomba una sola vez y la llamas diez veces, cada vez con un DB de instancia diferente. Cada bomba tiene su propio estado, sus propios parámetros, su propia historia. Sin duplicar una sola línea de código.
Bloques de librería estandarizados
Cuando desarrollas bloques que van a formar parte de una librería reutilizable en distintos proyectos, la FB es la estructura correcta. Encapsula lógica y datos, es portable, y se puede proteger contra modificaciones.
DB de instancia único vs DB de instancia múltiple
Cuando tienes varias FB del mismo tipo en un proyecto, puedes organizar sus DB de dos formas:
DB de instancia individual
Cada llamada a la FB tiene su propio DB. Es la forma más habitual y la más clara. FB_Motor → DB_Motor1, FB_Motor → DB_Motor2. Cada DB es un bloque independiente en el árbol del proyecto.
DB de instancia múltiple
Varias FB del mismo tipo comparten un único DB. Las variables Static de cada instancia se almacenan como sub-estructuras dentro del mismo DB. Reduce el número de bloques en el proyecto, lo cual puede ser útil en proyectos grandes con muchas instancias del mismo tipo. La contrapartida es que el DB se vuelve más complejo de leer.
En proyectos industriales con cientos de instancias del mismo tipo de máquina, el DB múltiple puede simplificar considerablemente la gestión del proyecto.
Errores más comunes al trabajar con FC y FB
Usar una FC cuando se necesita memoria
El error más frecuente de los programadores que vienen de otros lenguajes o de sistemas más simples. Crean una FC para controlar un motor, usan variables Temp para guardar el estado, y se preguntan por qué el motor no mantiene su estado entre ciclos. La respuesta es simple: las variables Temp no persisten. Si necesitas estado, necesitas una FB.
Crear marcas globales para sustituir variables Static
Cuando el programador no quiere lidiar con el DB de instancia, a veces opta por usar marcas globales (M) para guardar el estado de cada elemento. Esto funciona, pero genera un programa lleno de marcas globales difícil de mantener, imposible de reutilizar y muy propenso a conflictos de direcciones. La FB con DB de instancia es la solución correcta.
No reutilizar la FB para elementos idénticos
Programar diez motores con diez FC diferentes (FC_Motor1, FC_Motor2…) porque no se entiende el concepto de múltiples instancias de FB. El resultado es un programa diez veces más grande de lo necesario, donde cualquier cambio de lógica hay que repetirlo diez veces.
Confundir parámetros InOut con Static
Los parámetros InOut son valores que se pasan desde fuera del bloque y se devuelven modificados. Las variables Static son internas del bloque y no se pasan como parámetros. Confundirlos lleva a interfaces de bloque innecesariamente complejas o a perder datos que deberían haberse guardado internamente.
Olvidar inicializar las variables Static
Las variables Static conservan su valor entre ciclos, incluyendo el primer ciclo tras la descarga del programa. Si no se inicializan correctamente, el bloque puede arrancar con un estado indefinido. TIA Portal permite definir valores iniciales en el DB de instancia y también usar el primer ciclo (OB100) para inicializar estados críticos.
FC y FB en los distintos lenguajes de programación
Tanto FC como FB pueden programarse en cualquiera de los lenguajes disponibles en TIA Portal: KOP (Ladder), FUP (FBD), AWL (STL) y SCL (Structured Control Language). La elección del bloque es independiente del lenguaje.
En la práctica, las FC suelen programarse en KOP cuando la lógica es sencilla y combinacional, o en SCL cuando se trata de cálculos matemáticos. Las FB tienden a usar KOP para lógica de control clásica, o SCL cuando la lógica secuencial es compleja y se beneficia de estructuras tipo IF-THEN-ELSE y CASE.
Compatibilidad con S7-1200 y S7-1500
FC y FB están disponibles tanto en S7-1200 como en S7-1500. El comportamiento es idéntico en ambos sistemas en lo que respecta a la gestión de memoria y DB de instancia.
Donde sí existen diferencias es en las capacidades adicionales del S7-1500: mayor número de bloques permitidos, bloques de mayor tamaño, soporte completo de tipos de datos estructurados complejos (STRUCT, ARRAY de tipos de usuario) tanto en FC como en FB, y acceso optimizado a DB que mejora el rendimiento.
En S7-1200, el tamaño máximo de los bloques y algunas funcionalidades avanzadas de los tipos de datos tienen limitaciones respecto al S7-1500. Para proyectos complejos con muchas FB y DB de gran tamaño, esto puede ser un factor a considerar.
Resumen: la regla práctica
Si tienes dudas sobre cuál usar, aplica esta regla:
¿El bloque necesita recordar algo entre ciclos? Si la respuesta es sí, usa una FB. Si la respuesta es no, usa una FC.
Y si vas a usar la misma lógica para múltiples elementos independientes (varios motores, varias válvulas, varias zonas), la FB con múltiples instancias no es una opción, es la solución correcta.
La diferencia entre un programa bien estructurado y uno que crece como un plato de espaguetis muchas veces se reduce a esta decisión. FC para calcular, FB para controlar.
¿Tienes dudas sobre cómo estructurar un proyecto concreto en TIA Portal? Nuestra formación aporta todos los conocimientos de programación desde nivel básico hasta el más avanzado , conviértete en un Programador Industrial , visita nuestro catálogo de cursos.

