El PID de temperatura es de esos temas que todo el mundo cree que domina hasta que le toca poner en marcha un horno de verdad y ve que la temperatura oscila como un balancín. Aquí vamos al grano con un lazo de temperatura real en el S7-1200 usando PID_Compact, que es la instrucción que Siemens te da hecha y que, bien configurada, funciona muy bien.
No es lo mismo un PID genérico que un controlador de temperatura PID. La temperatura tiene inercia térmica, tiempos muertos y respuesta lenta, así que hay detalles del escalado de la PV, del autoajuste y de la salida que conviene tener claros antes de tocar nada.
El lazo, de un vistazo
Antes de la fórmula, conviene tener claro por dónde va cada señal. El PID no mide la temperatura: mide el error, que es lo que sale de restar la temperatura real a la consigna.
Realimentación negativa: la medida vuelve al comparador con signo menos. Ahí nace el error, y es lo único que el regulador ve.
Fórmula de referencia
En la forma estándar (la que usa Siemens en PID_Compact, y la mayoría de fabricantes):
Los tres términos, en colores: el proporcional mira el error de ahora, el integral el que se ha ido acumulando y el derivativo hacia dónde va. Ojo a la variable de integración: se integra en τ, porque la t ya es el límite superior.
Ambas, Ti y Td, son tiempos (segundos), no ganancias. Ahí está la trampa de la intuición.
Ti — tiempo integral (tiempo de acción integral)
Es el tiempo que tarda la acción integral en aportar lo mismo que ha aportado la proporcional ante un escalón de error. También se le llama "tiempo de reajuste" o "repetición".
Como aparece dividiendo, la relación es inversa: Ti pequeño = integral fuerte.
|
Ti |
Efecto |
|---|---|
|
Más pequeño |
Elimina el error estacionario rápido, pero sobreoscila, tiende a oscilar y desestabiliza. Aumenta el riesgo de windup (que la integral siga acumulando error mientras el actuador ya está al máximo: cuando por fin hay que bajar, el regulador tarda un mundo en reaccionar y se pasa de largo) si el actuador satura. |
|
Más grande |
Respuesta más suave y estable, pero el offset (el error que queda fijo entre consigna y temperatura real) tarda en desaparecer; el lazo "arrastra" el error mucho tiempo. |
|
Ti → ∞ (o desactivado) |
Control puramente P/PD: queda error permanente. |
Td — tiempo derivativo (tiempo de anticipación)
Es el tiempo que el PID "se adelanta" al futuro, extrapolando la pendiente actual del error. Actúa sobre la velocidad de cambio, no sobre la magnitud.
|
Td |
Efecto |
|---|---|
|
Más grande |
Amortigua, frena la sobreoscilación, acelera la estabilización de procesos con inercia. Pero amplifica el ruido de la medida: la salida empieza a bailar y castiga la válvula o el variador. |
|
Más pequeño / 0 |
Sin anticipación. Es lo habitual en procesos rápidos y ruidosos. |
Criterio práctico
-
Temperatura, nivel con inercia, hornos: procesos lentos y con retardo → Td aporta, merece la pena.
-
Caudal, presión, par de motor: rápidos y ruidosos → PI puro, Td = 0. Casi todos los lazos industriales son PI.
-
En PID_Compact, la derivada actúa por defecto sobre la variable de proceso y no sobre el error (ponderación
c), justo para evitar el derivative kick (el salto brusco de salida que suelta la derivada cuando cambias la consigna de golpe: ve un escalón enorme y responde como si el proceso se hubiera disparado) al cambiar la consigna. Además hay filtro derivativo (Td/a, cona ≈ 3…5) que te salva del ruido — no lo pongas a 0.
Ojo con las unidades entre fabricantes: algunos no dan Ti sino Ki en repeticiones por minuto (Ki = 1/Ti). Si copias parámetros de un lazo a otro sin mirar esto, el comportamiento se invierte.
Qué es PID_Compact y por qué usarlo para temperatura
PID_Compact es una instrucción tecnológica del S7-1200 (y del S7-1500) que implementa un regulador PID con autoajuste incorporado. Te ahorra programar el algoritmo a mano, que es lo que hacíamos antaño en Step 7 clásico. Si vienes de aquello, échale un ojo a cómo se montaba el PID en Step 7, porque el concepto de fondo es el mismo, solo que ahora está encapsulado.
Para un lazo de temperatura te interesa por tres cosas:
-
Trae autotuning (autoajuste: el propio bloque lanza una prueba sobre tu proceso y calcula Kp, Ti y Td por ti, en vez de que los tantees a mano) que funciona razonablemente bien con procesos lentos.
-
Puede sacar la salida como valor analógico (0.0 a 100.0) o como PWM para gobernar un relé de estado sólido de una resistencia.
-
Escala la PV internamente, así que no tienes que pelearte tanto con las cuentas de la entrada analógica.
El lazo de temperatura que vamos a montar
Planteamos algo típico: un depósito o un horno pequeño con una sonda PT100 (o un termopar con transmisor) que entra por una entrada analógica, y una resistencia calefactora gobernada por un relé de estado sólido con señal PWM (modulación por ancho de pulso: se enciende y se apaga muy rápido, y regulas la potencia cambiando cuánto tiempo está encendido). El objetivo: mantener 80 °C estables.
-
Setpoint: 80.0 °C.
-
PV (process variable, la variable de proceso): temperatura medida por la sonda, en °C.
-
Salida: PWM sobre una salida digital que enciende y apaga el SSR (solid state relay, el relé de estado sólido).
Datos que necesitas de tu módulo analógico
Antes de nada, cómo llega la señal de temperatura. Si usas un módulo con entrada directa de RTD o termopar (por ejemplo un SM 1231 RTD/TC), ese módulo ya te entrega la temperatura escalada en su propio formato y no tienes que escalar tú. Si en cambio metes un transmisor 4-20 mA por una entrada analógica estándar, tendrás que convertir la palabra cruda a grados. De eso hablo en detalle en el artículo de escalado de señales analógicas.
Escalado de la PV (temperatura medida)
PID_Compact tiene dos formas de leer la PV:
-
Input: le pasas ya la temperatura en unidades físicas (REAL, en °C). Es lo cómodo si tu módulo RTD ya te da grados o si escalas tú antes. -
Input_PER: le pasas directamente el valor periférico (WORD) de la entrada analógica y él lo escala internamente con los parámetrosConfig.InputLowerLimiteInputUpperLimit.
Si vas por Input y tienes un transmisor 4-20 mA que representa 0 a 150 °C, el escalado clásico con NORM_X y SCALE_X queda así:
Ver código · 11 líneas
// Escalado de entrada analógica 4-20 mA a temperatura en REAL
// Rango PLC 4-20 mA: 5530 (4 mA) ... 27648 (20 mA)
// Rango físico: 0.0 ... 150.0 grados C
"Temp_norm" := NORM_X(MIN := 5530,
VALUE := "IW_Temperatura", // WORD de la entrada analogica
MAX := 27648);
"Temp_grados" := SCALE_X(MIN := 0.0,
VALUE := "Temp_norm",
MAX := 150.0); // REAL en grados C
Ese "Temp_grados" es lo que le pasarás al parámetro Input del PID_Compact.
Ojo con el rango 4-20 mA. En el S7-1200, 4 mA no es 0, es 5530 en el rango de tensión/corriente. Si pones MIN := 0 te saldrán las cuentas mal por debajo. Consulta el rango exacto de tu módulo en el manual.
Insertar PID_Compact en un OB cíclico (importante)
Este es el error más repetido. PID_Compact tiene que llamarse en un OB de interrupción cíclica con tiempo constante, no en el OB1. El regulador necesita un tiempo de muestreo fijo y estable para calcular bien los términos I y D. Si lo metes en OB1, el ciclo varía y el autotuning y la regulación se degradan.
-
Añade un OB de interrupción cíclica (en TIA Portal lo verás como Cyclic interrupt) en el árbol del proyecto.
-
Para temperatura, un tiempo de muestreo del orden de 100 a 500 ms es más que suficiente. La temperatura es lenta. No necesitas 10 ms.
-
Arrastra PID_Compact dentro de ese OB. TIA Portal creará automáticamente su DB de instancia tecnológico.
PID_Compact detecta él solo el ciclo del OB donde está insertado y lo usa como tiempo de muestreo. Por eso es tan crítico que sea un OB cíclico.
Llamada básica en SCL
Ver código · 8 líneas
// Dentro del OB de interrupcion ciclica (p.ej. OB30, 200 ms)
"PID_Temp"(Setpoint := "Consigna_temp", // REAL, 80.0
Input := "Temp_grados", // REAL, PV escalada
ManualEnable := FALSE,
ManualValue := 0.0);
// La salida del lazo esta en "PID_Temp".Output (0.0 ... 100.0)
// y la salida PWM en "PID_Temp".OutputPWM (BOOL)
Salida: analógica o PWM para la resistencia
PID_Compact ofrece tres salidas a la vez y tú eliges cuál cableas:
-
Output: valor REAL de 0.0 a 100.0 %. Útil si quieres mandarlo a una salida analógica que gobierne un actuador proporcional. -
Output_PER: el valor de salida ya en formato periférico (WORD), listo para volcar directo a una salida analógica. -
OutputPWM: salida booleana modulada en ancho de pulso, pensada exactamente para tu caso de la resistencia con SSR.
Para calefacción con resistencia y relé de estado sólido, lo natural es OutputPWM. Se configura la salida en la ventana de parámetros de PID_Compact eligiendo "PWM" como tipo de salida, y ajustas el tiempo mínimo de conexión/desconexión para no machacar el actuador. Luego mapeas el bit a una salida física:
Ver código · 2 líneas
// Volcado del PWM del PID a la salida fisica del SSR
"Q_Resistencia" := "PID_Temp".OutputPWM;
Si en cambio usas una salida analógica proporcional (por ejemplo controlando la potencia por 4-20 mA), usa Output_PER:
Ver código · 1 línea
"QW_Potencia" := "PID_Temp".Output_PER; // directo a la salida analogica
Autoajuste (autotuning) que funciona
Aquí está la parte que a la gente le suele fallar. PID_Compact tiene dos modos de ajuste:
-
Puesta en marcha inicial (en TIA Portal, Pretuning): identifica el proceso arrancándolo desde una temperatura estable. Para lanzarlo, el proceso debe estar en reposo y estable, y la consigna debe estar suficientemente lejos de la PV actual.
-
Ajuste fino (en TIA Portal, Fine tuning): refina los parámetros haciendo oscilar controladamente alrededor de la consigna una vez ya estás cerca.
El procedimiento que a mí me funciona en temperatura:
-
Abre la puesta en marcha del regulador (el botón Commissioning) en TIA Portal, con el PLC online.
-
Arranca con el proceso frío y estable. Pon la consigna real (80 °C).
-
Lanza la puesta en marcha inicial. El PID meterá potencia y medirá la respuesta térmica. En un horno esto puede tardar bastante, ten paciencia.
-
Cuando termine sin errores, lanza el ajuste fino.
-
Guarda los parámetros calculados en el proyecto para que no se pierdan al reiniciar.
El estado del ajuste lo ves en "PID_Temp".State y los errores en "PID_Temp".ErrorBits. Si el pretuning aborta, casi siempre es porque el proceso no estaba estable al empezar o porque la consigna estaba demasiado cerca de la PV. Consulta la ayuda de TIA Portal para el significado exacto de cada bit de ErrorBits.
Consejo de fábrica: no lances el autotuning con producto dentro si una sobreoscilación puede estropearlo. La identificación empuja el proceso a propósito.
Lanzar el ajuste por código (opcional)
Normalmente el tuning se dispara desde la ventana de puesta en marcha, pero puedes forzar el modo por el parámetro Mode:
-
Mode = 0: inactivo. -
Mode = 1: puesta en marcha inicial (pretuning). -
Mode = 2: ajuste fino (fine tuning). -
Mode = 3: modo automático (regulación normal).
Ver código · 3 líneas
// Forzar modo automatico tras un arranque en frio
"PID_Temp".Mode := 3;
"PID_Temp".ModeActivate := TRUE; // flanco para activar el modo elegido
El cambio de modo se aplica con un flanco de subida en ModeActivate, así que gestiona ese bit con un flanco, no lo dejes fijo en TRUE.
Límites y arranque seguro
Configura los límites de la PV en los parámetros del bloque. Si la temperatura medida sale del rango Config.InputLowerLimit / InputUpperLimit, PID_Compact pasa a estado de error y detiene la salida, que es justo lo que quieres si se te rompe la sonda. Aprovecha esto como seguridad básica frente a rotura de sensor.
En el primer arranque, con parámetros aún sin ajustar, el regulador puede comportarse fatal. Por eso el flujo correcto es: cargar programa, comprobar que la PV lee bien la temperatura, y solo entonces lanzar el pretuning.
Resumen del montaje
-
Lee y escala la temperatura a °C (REAL), o usa un módulo RTD que ya te la dé.
-
Inserta PID_Compact en un OB de interrupción cíclica (100 a 500 ms para temperatura).
-
Conecta
Setpoint,Inputy elige la salida (PWM para SSR de resistencia). -
Con el proceso frío y estable, lanza pretuning y luego fine tuning desde la puesta en marcha.
-
Guarda parámetros y deja el bloque en modo automático.
Con esto tienes un controlador de temperatura PID serio, sin programar el algoritmo a mano y con un autoajuste que, si respetas el proceso de puesta en marcha, deja el lazo estable de verdad.
Pruébalo tú mismo: laboratorio de ajuste PID
Ajusta los parámetros y observa la respuesta del sistema en directo:
¿Qué te ha parecido?
Espero que te haya parecido interesante. Como siempre te invito a que comentes y propongas si te apetece nuevos objetos que se puedan desarrollar y compartir en la plataforma

No hay comentarios todavía. Sé el primero en dejar uno.