El programa: el cerebro de la automatización

En los sistemas de medida y regulación, los programas constituyen el núcleo lógico que determina el comportamiento de la instalación. Transforman la información de sensores en acciones sobre actuadores, cumpliendo los objetivos de control, supervisión y regulación. Un programa bien estructurado garantiza no solo el correcto funcionamiento técnico, sino también la seguridad, la eficiencia y la capacidad de adaptación a futuras modificaciones.

La norma IEC 61131-3 estandariza los lenguajes de programación para PLC (autómatas programables), permitiendo la interoperabilidad entre fabricantes. Esta norma define cinco lenguajes: dos gráficos (Ladder (LD), Diagrama de bloques funcionales (FBD)) y tres textuales (Lista de instrucciones (IL), Texto estructurado (ST), Diagrama de funciones secuenciales (SFC)). La elección depende del tipo de proceso y la complejidad de las operaciones.

Lenguajes de programación IEC 61131-3

  • Ladder (LD): basado en esquemas de contactos, intuitivo para electricistas. Ideal para lógica de enclavamientos y secuencias simples.
  • Diagrama de bloques funcionales (FBD): representación gráfica de bloques con entradas y salidas. Adecuado para control de procesos continuos (PID, filtros).
  • Lista de instrucciones (IL): lenguaje de bajo nivel similar a ensamblador, muy compacto. Actualmente en desuso en favor de ST.
  • Texto estructurado (ST): lenguaje de alto nivel (similar a Pascal o C). Ideal para algoritmos complejos, matemáticas y manejo de datos estructurados.
  • Diagrama de funciones secuenciales (SFC): organiza el programa en pasos y transiciones, perfecto para procesos secuenciales (GRAFCET).

En un proyecto real se suelen combinar varios lenguajes: SFC para la secuencia principal, FBD para lazos PID y ST para cálculos complejos.

Gestión de entradas y salidas (I/O)

El programa actúa como intermediario entre el mundo físico y el digital. Las entradas (sensores, pulsadores, transmisores) proporcionan señales que deben ser leídas, filtradas y validadas. Las salidas (contactores, válvulas, variadores) son activadas según la lógica implementada.

Un buen programa de gestión de E/S incluye:

  • Mapeo de señales: asignación de direcciones físicas (ej. %I0.0, %IW2) a nombres simbólicos (ej. "Sensor_Nivel_Alto").
  • Escalado y conversión: para señales analógicas (4-20 mA → ingeniería).
  • Filtrado: media móvil o filtro paso bajo para eliminar ruido.
  • Detección de fallos: rotura de cable, fuera de rango, etc.

Comunicación con dispositivos de campo

Los programas deben gestionar protocolos industriales para intercambiar datos con dispositivos distribuidos (variadores, sensores inteligentes, módulos remotos). Los más comunes son:

  • Modbus RTU/TCP: simple y ampliamente extendido.
  • PROFIBUS DP / PROFINET: estándar en Europa, alto rendimiento.
  • EtherNet/IP: predominante en entornos Rockwell.
  • OPC UA: para integración con sistemas de nivel superior (MES, SCADA).

La comunicación puede ser cíclica (para supervisión continua) o acíclica (configuración, diagnóstico). El programa debe implementar reintentos, timeouts y detección de fallos de comunicación para garantizar la robustez.

Documentación del programa: la clave para el mantenimiento

Un programa sin documentación es prácticamente inutilizable a largo plazo. Los elementos fundamentales a documentar son:

  • Lista de variables: nombre, tipo de dato (BOOL, INT, REAL), dirección física/simbólica, comentario funcional y rangos válidos.
  • Bloques funcionales (FB/FC): descripción de cada bloque, entradas/salidas, función (PID, temporizador, secuencia).
  • Diagramas: diagramas de flujo, de estados (SFC) o de contactos que representen la lógica.
  • Requisitos de funcionamiento: consignas, tolerancias, condiciones de arranque/parada, respuesta ante fallos.

Además, es esencial mantener un control de versiones (ej. Git) y un registro de cambios con fecha, responsable y justificación (trazabilidad).

📌 Toma nota

Mantener una trazabilidad rigurosa en los programas de sistemas de medida y regulación es clave para garantizar la calidad y la seguridad de las instalaciones. Esto implica registrar todas las versiones del software, los cambios realizados, los responsables de cada modificación y la justificación técnica de cada ajuste. Gracias a la trazabilidad, es posible identificar rápidamente el origen de un problema, restaurar configuraciones anteriores en caso de error, cumplir con normativas de calidad y facilitar auditorías externas, convirtiéndose en una herramienta fundamental para la gestión eficiente del ciclo de vida del sistema automatizado.

Captura de pantalla de la interfaz de TIA Portal mostrando el árbol de proyecto, un bloque de código programado en Texto Estructurado (ST) con sintaxis coloreada, y una tabla de variables detallada.
Figura 19: Ejemplo de entorno de programación y documentación en TIA Portal. Fuente: Wikimedia Commons / Licencia: CC BY-SA 4.0
🐍 Generador automático de documentación de programa a partir de una lista de variables
# doc_generator.py - Lee un archivo CSV con la definición de variables y genera documentación en Markdown
# Útil para estandarizar la documentación de programas PLC

import csv
import os
from datetime import datetime

class VariableDoc:
    """Clase para almacenar la información de una variable."""
    def __init__(self, nombre, direccion, tipo, rango, comentario):
        self.nombre = nombre
        self.direccion = direccion
        self.tipo = tipo
        self.rango = rango
        self.comentario = comentario

class ProgramDocumentation:
    """Genera documentación estructurada a partir de una lista de variables."""
    def __init__(self, proyecto, autor):
        self.proyecto = proyecto
        self.autor = autor
        self.variables = []      # lista de objetos VariableDoc
        self.bloques = []        # lista de diccionarios con info de bloques funcionales

    def cargar_variables_csv(self, archivo):
        """Carga variables desde un archivo CSV con columnas: Nombre,Dirección,Tipo,Rango,Comentario"""
        with open(archivo, 'r', encoding='utf-8') as f:
            reader = csv.DictReader(f)
            for row in reader:
                var = VariableDoc(
                    nombre=row['Nombre'],
                    direccion=row['Dirección'],
                    tipo=row['Tipo'],
                    rango=row['Rango'],
                    comentario=row['Comentario']
                )
                self.variables.append(var)
        print(f"✅ Cargadas {len(self.variables)} variables desde {archivo}")

    def agregar_bloque(self, nombre, descripcion, entradas, salidas):
        """Añade información de un bloque funcional."""
        self.bloques.append({
            "nombre": nombre,
            "descripcion": descripcion,
            "entradas": entradas,
            "salidas": salidas
        })

    def generar_markdown(self):
        """Genera el contenido en formato Markdown."""
        doc = f"# DOCUMENTACIÓN DEL PROGRAMA\n\n"
        doc += f"**Proyecto:** {self.proyecto}\n\n"
        doc += f"**Autor:** {self.autor}\n\n"
        doc += f"**Fecha:** {datetime.now().strftime('%d/%m/%Y')}\n\n"

        doc += "## 1. Lista de variables\n\n"
        doc += "| Nombre | Dirección | Tipo | Rango | Comentario |\n"
        doc += "|--------|-----------|------|-------|------------|\n"
        for v in self.variables:
            doc += f"| {v.nombre} | {v.direccion} | {v.tipo} | {v.rango} | {v.comentario} |\n"

        doc += "\n## 2. Bloques funcionales\n\n"
        for b in self.bloques:
            doc += f"### {b['nombre']}\n"
            doc += f"**Descripción:** {b['descripcion']}\n\n"
            doc += "**Entradas:**\n"
            for e in b['entradas']:
                doc += f"- {e}\n"
            doc += "**Salidas:**\n"
            for s in b['salidas']:
                doc += f"- {s}\n"
            doc += "\n"

        doc += "## 3. Requisitos de funcionamiento\n\n"
        doc += "- **Modos de operación:** Manual / Automático\n"
        doc += "- **Condiciones de seguridad:** Parada de emergencia prioritaria, enclavamientos.\n"
        doc += "- **Respuesta ante fallos:** Alarma, paso a modo seguro.\n\n"

        doc += "## 4. Control de versiones\n\n"
        doc += "| Versión | Fecha | Autor | Cambios realizados |\n"
        doc += "|---------|-------|-------|--------------------|\n"
        doc += "| 1.0 | - | - | Versión inicial |\n"

        return doc

    def guardar(self, archivo):
        with open(archivo, 'w', encoding='utf-8') as f:
            f.write(self.generar_markdown())
        print(f"✅ Documentación guardada en {archivo}")

# --- Ejemplo de uso ---
if __name__ == "__main__":
    # Crear objeto documentación
    prog_doc = ProgramDocumentation("Control de temperatura reactor R-101", "Ing. Laura Gómez")

    # Simular carga desde CSV (en realidad leeríamos un archivo real)
    # Por simplicidad, creamos algunas variables manualmente
    prog_doc.variables = [
        VariableDoc("Temp_Reactor", "%IW0", "INT", "0-27648", "Señal analógica PT100"),
        VariableDoc("Setpoint_Temp", "%MD10", "REAL", "0.0-200.0", "Consigna de temperatura (°C)"),
        VariableDoc("Salida_Calefactor", "%QW0", "INT", "0-27648", "Señal a variador de calefacción"),
        VariableDoc("Alta_Temperatura", "%M0.0", "BOOL", "0/1", "Alarma por sobrepasar límite")
    ]

    # Añadir información de bloques funcionales
    prog_doc.agregar_bloque(
        "FB_PID_Temp",
        "Control PID de temperatura del reactor",
        ["Setpoint (REAL)", "PV (REAL)", "Manual (BOOL)"],
        ["Output (REAL)", "Error (REAL)"]
    )
    prog_doc.agregar_bloque(
        "FC_Alarmas",
        "Gestión de alarmas de proceso",
        ["Temp_Alta (BOOL)", "Presion_Baja (BOOL)"],
        ["Alarma_General (BOOL)"]
    )

    # Generar y guardar
    prog_doc.guardar("documentacion_programa.md")

Este script lee una lista de variables (desde CSV o definida en código) y genera documentación estructurada en Markdown, incluyendo tabla de variables, descripción de bloques funcionales y control de versiones. Es una herramienta excelente para estandarizar la documentación de programas PLC.

Tendencias Actuales 2026

La programación de PLC evoluciona hacia la programación orientada a objetos (OOP) dentro de IEC 61131-3, con clases, métodos y herencia. Las herramientas de IA generativa ayudan a redactar código estructurado a partir de descripciones en lenguaje natural. Además, la integración continua (CI/CD) permite pruebas automáticas del programa antes de la descarga al PLC, mejorando la calidad y reduciendo tiempos de puesta en marcha.

Aplicaciones con Raspberry Pi

Una Raspberry Pi puede ejecutar un PLC virtual (OpenPLC, CODESYS) y servir como plataforma de pruebas para programas desarrollados en IEC 61131-3. También se pueden generar scripts Python que simulen el comportamiento de un PLC y sirvan para validar la lógica antes de pasarla a hardware industrial.

Aplicaciones con Arduino

El Arduino PLC IDE permite programar en los lenguajes IEC 61131-3, siendo una excelente herramienta educativa. Además, se pueden exportar las listas de variables y la documentación generada por scripts Python para integrarla en el proyecto.

💼 Caso Práctico Industrial: Documentación de programa

Contexto: En una planta de tratamiento de aguas, el técnico de mantenimiento necesita localizar rápidamente la dirección de la señal "Alarma_Nivel_Alto" para comprobar su funcionamiento. El programa está documentado con una lista de variables.

Pregunta: ¿En qué documento o sección del programa encontrará esa información?

🍓 Raspberry Pi + Python

Contexto: Se ha generado la documentación de un programa PLC usando el script Python proporcionado, que produce un archivo en formato Markdown. Se desea convertirlo a PDF para distribuirlo al equipo de mantenimiento.

Pregunta: ¿Qué herramienta o librería podría utilizarse desde Python para esta conversión?

🐍 Trazabilidad de versiones

Contexto: Se ha implementado un sistema de control de versiones para un programa PLC. Se desea registrar cada cambio con fecha, autor y descripción.

Pregunta: ¿Cuál de los siguientes métodos es el más adecuado para gestionar la trazabilidad?

Tabla 1: Comparativa de lenguajes IEC 61131-3
LenguajeTipoVentajasDesventajasAplicación típica
Ladder (LD)GráficoIntuitivo para electricistas, fácil diagnósticoLimitado para algoritmos complejosEnclavamientos, lógica de seguridad
FBDGráficoClaro para flujo de señales, reutilización de bloquesPoco eficiente para lógica secuencial complejaControl de procesos, PID, filtros
ST (Structured Text)TextualAlto nivel, manejo de datos estructurados, matemáticasRequiere conocimientos de programaciónAlgoritmos complejos, comunicaciones
IL (Instruction List)TextualCompacto, bajo nivelObsoleto, difícil de mantenerMigración de sistemas antiguos
SFCGráficoIdeal para procesos secuenciales, fácil de seguirPoco adecuado para lógica combinacionalMáquinas de estados, secuencias de producción

📚 Recursos Técnicos y Normativos 2026

Normativas y Estándares

Recursos Raspberry Pi y Python