Documentos de Académico
Documentos de Profesional
Documentos de Cultura
El regulador 20 de diciembre
PID 2010
1.1 Introducción
Cuando se regula un proceso se busca generar una señal de control (CO, Controller Output)
que lleve, a la variable de medida del proceso (PV, Process Variable), a alcanzar un determinado valor
de referencia (SP, Set Point).
Para ello se implementa lo que se llama un lazo de control cerrado, donde la actuación sobre la
planta se realiza por medio de un controlador que actúa según el valor de referencia y la medida del
proceso.
En este caso, se trata de un controlador Proporcional-Integral-Derivativo (PID), donde la
actuación depende de la selección de sus parámetros (sintonización del controlador), siendo: P
proporcional al error instantáneo, I proporcional al error acumulado y D proporcional a la velocidad
del error.
<grrodi@gmail.com> 1
© 2010 Jorge Rodríguez Araújo
U s=K c 1
1
T i⋅s
T d⋅s ⋅E s
Ecuación frecuencial del PID ideal
– La acción de control P depende del error en cada momento, actuando de forma inmediata y
proporcional ante su aparición. Con lo que consigue reducir el error de seguimiento, aunque
nunca anularlo, dado que según este disminuye, también lo hace su acción. Por tanto, es más
eficaz cuanto mayor es la ganancia ( K c ), aunque sin descuidar que valores excesivos
pueden producir respuestas sobreoscilatorias o incluso inestables.
u t= K c⋅e t
– La acción de control I depende del histórico, o suma acumulada, del error, con lo que permite
obtener errores estacionarios nulos. Dado que por muy pequeño que este sea, su suma crece
con el tiempo, haciendo crecer la influencia del término integral, que actuará mientras exista
error de control. Sin embargo, al basarse en el histórico del error, su actuación conlleva un
cierto retraso que origina dinámicas lentas, más oscilatorias o incluso inestabilidad. Así,
mejora el amortiguamiento y reduce la sobreoscilación, pero empeora el transitorio,
aumentando el tiempo de establecimiento y disminuyendo el ancho de banda del sistema.
Kc t
u t= ∫ e t dt
Ti 0
– La acción de control D depende de la velocidad de cambio del error en cada momento, con lo
que presenta un carácter anticipativo que acelera la reacción ante un cambio del error,
mejorando el amortiguamiento y disminuyendo el tiempo de establecimiento y la
sobreoscilación, en general, mejorando el comportamiento del sistema.
d e t
u t= K c⋅T d
dt
Finalmente, cada una de estas tres acciones contribuye a la generación de la salida de control,
de tal modo que la expresión temporal del PID, en su forma ideal, viene dada por:
t
d e t
ut =K p e t K i∫ e tdt K d
0 dt
Ecuación temporal del PID ideal
Así, para conseguir que la respuesta del sistema se ajuste a unos determinados requerimientos,
se debe proceder al ajuste de los parámetros del regulador.
Hay que tener presente que, en la mayoría de los casos, bastará con lograr la eliminación del
<grrodi@gmail.com> 2
© 2010 Jorge Rodríguez Araújo
error mediante le ajuste del PI. Sin embargo, en aquellos donde los retardos son considerables, como
en la regulación de temperatura, se hace necesario el ajuste del PID para, por medio de la acción
derivativa, lograr una acción anticipativa que produzca una corrección significativa antes de que el
error se haga excesivo (extrapolación), añadiendo amortiguamiento y permitiendo una mayor ganancia
proporcional.
Aunque pudiera parecer resuelto el problema del diseño del PID, existen una serie de
limitaciones y problemas prácticos que dificultan su diseño y sintonización, y que llevan a que existan
diferentes formas, o variaciones, del algoritmo PID.
El segundo, conocido como “derivative kick”, se debe a que cuando el error cambia de forma
brusca, debido a un nuevo establecimiento de consigna, su derivada se hace muy grande, tendiendo
teóricamente a infinito, lo que provoca que la acción derivativa genere un pulso instantáneo de valor
muy elevado, que resulta del todo indeseable.
Como se puede ver en la gráfica de la [Figura 3], cuando se utiliza la forma ideal del PID, un
<grrodi@gmail.com> 3
© 2010 Jorge Rodríguez Araújo
cambio de valor de consigna provoca que se produzca en ese instante un impulso derivativo. Y
aunque, como en este caso, el impulso derivativo sólo sea por un instante y no afecte al
comportamiento del sistema, no se debe asumir que esto siempre será así, dado que en algún
momento, de forma eventual, podrá llevar fuera de control a determinados elementos del sistema.
<grrodi@gmail.com> 4
© 2010 Jorge Rodríguez Araújo
Para solucionar el problema del impulso derivativo, como se puede ver en la [Figura 4], se
sustituye la derivada del error por la derivada de la medida, pues después de establecido el valor de
referencia, la derivada será igual a menos la derivada de la variable de proceso, por ser la referencia
constante y su derivada igual a cero. Dado que mientras que cuando se establece un nuevo valor de
consigna, el error experimenta un cambio instantáneo que provoca que se produzca un impulso
derivativo, la medida no experimenta estas variaciones instantáneas debidas a un cambio de consigna,
eliminándose por tanto el impulso derivativo.
t
de t d r – y t −dy t d y t
= = => ut =K p e t K i∫ e tdt −K d
dt dt dt 0 dt
<grrodi@gmail.com> 5
© 2010 Jorge Rodríguez Araújo
Así, se define la ecuación en diferencias del PID sin impulso derivativo, como:
k
u [k ]=K p⋅e [k ]K i⋅∑ e [i]−K d⋅ y [k −1]− y [k −2]
i=0
Dado que el signo del término derivativo es negativo, significa que el impacto sobre la salida
de control será oponiéndose a la variación de la variable de proceso y, por tanto, inhibiendo
movimientos rápidos de la variable de proceso.
Así, al calcular el término derivativo en función de la variable de proceso, desaparece el
impulso derivativo, y su influencia aumenta con la rapidez con que cambia la variable de proceso,
contrarrestándola, mientras se conservan iguales los valores de sintonización.
Además, para garantizar que el valor de salida es el correcto, dado que se pueden producir
errores por desbordamiento, hay que añadir una última etapa en la que se limita la actuación al rango
establecido por los límites del actuador.
K⋅e −T⋅s
G s =
1⋅s
[Función de transferencia de una planta de primer orden con retardo]
Para determinar los parámetros que caracterizan el modelo de la planta de primer orden con
retardo: ganancia estática ( K ), constante de tiempo ( )1 y retardo temporal ( T ), se traza la
recta tangente en el punto de inflexión de la curva de respuesta temporal a entrada escalón en lazo
abierto (curva de reacción), de tal modo que:
1. Con la planta en lazo abierto, se lleva al proceso a que alcance el estado estacionario, en un
punto de operación normal con una salida estabilizada ( y 0 ) y una entrada constante ( u 0
).
2. En el instante inicial ( t 0 ), con la planta en lazo abierto, se excita el proceso por medio de
una entrada tipo escalón, cuyo valor ( u 1 ) debería estar en torno a un 30% del rango
completo.
3. A partir de ahí, se registran los datos de respuesta hasta que se estabilice el nuevo punto de
operación ( y 1 ), alcanzándose nuevamente la estabilización del proceso.
1 La constante de tiempo es igual al tiempo necesario para que la señal de salida alcance el 63,2% de su valor final.
<grrodi@gmail.com> 6
© 2010 Jorge Rodríguez Araújo
4. Finalmente, sobre la curva de reacción construida a partir de los datos adquiridos, se traza la
recta tangente de máxima pendiente, obteniéndose los instantes de tiempo ( t 1 y t 2 ),
donde la recta de máxima pendiente corta a los valores de salida inicial y final ( y0 , y1
).
Así:
y1 – y 0
K= ; T =t 1 – t 0 ; =t 2 −t 1
u1−u0
Finalmente, modelada la planta, los parámetros del controlador PID por el método de Ziegler-
Nichols, con un objetivo de diseño para alcanzar un amortiguamiento tal que exista una relación de 4:1
para el primer y segundo pico de la respuesta a una referencia escalón (criterio de amortiguamiento
1/4)2, se obtienen a partir de las expresiones de la siguiente tabla:
<grrodi@gmail.com> 7
© 2010 Jorge Rodríguez Araújo
Kp Ti Td
Controlador P - -
K⋅T
Controlador PI 0,9 3⋅T -
K⋅T
Controlador PID 1,2 2⋅T 0,5⋅T
K⋅T
Tabla 1: Parámetros de ajuste del controlador por el método de la curva de reacción
Donde los parámetros del PID vienen dados por: la ganancia proporcional ( K p ), el tiempo
integral ( T i ) y el tiempo derivativo ( T d ).
T
G z =
z –1 1
z {
s z
}
⋅ ⋅G s ⋅z −d ; d=
Ts
(entero positivo)
a=e−T / ;
s
b=K⋅1−a ; c=1−a ⋅y0 ; d =T /T s
<grrodi@gmail.com> 8
© 2010 Jorge Rodríguez Araújo
1.4.2 Implementación
El siguiente listado recoge el “script” implementado para la simulación y ajuste del PID.
class ZieglerNichols:
""" Método de Ziegler-Nichols en lazo abierto """
# Constantes
self.SHIFT = 256 # desplazamiento (coma fija)
self.UMAX = 255 # límite de actuación superior (8 bits)
self.UMIN = 0 # límite de actuación inferior
self.MAX = (2**(16))-1 # límite de precisión superior (16 bits)
self.MIN = -(2**(16))-1 # límite de precisión inferir (16 bits)
# Valores iniciales
self.y0 = 0
self.u0 = 0
# Parámetros de muestreo
self.Ts = Ts # período de muestreo
self.samples = len(t) # número de muestras
self.u0 = u[0]
u1 = u[-1]
self.y0 = int(mean(y[0:100]))
<grrodi@gmail.com> 9
© 2010 Jorge Rodríguez Araújo
y1 = int(mean(y[-100:-1]))
for k in range(len(t)):
if u[k] > u[k-1]:
t0 = t[k]
break
t1 = t0 + 1
t2 = t0 + 15
return y[k]
<grrodi@gmail.com> 10
© 2010 Jorge Rodríguez Araújo
return int(u[k])
def simulate_plant(self):
""" Simula la respuesta de la planta en lazo abierto """
self.plot_plant(self.t, self.u, y)
return y
self.plot_pid(self.t, self.r, u, y)
<grrodi@gmail.com> 11
© 2010 Jorge Rodríguez Araújo
return (y, u)
subplot(211)
plot(self.t, self.y, 'b.')
plot(t, u, 'g--', t, y, 'r-', lw=1.2)
xlabel("Tiempo [s]")
ylabel("Variable de proceso (PV)")
subplot(212)
plot(self.t, self.u, 'r-')
xlabel("Tiempo [s]")
ylabel("Salida de control (CO)")
subplot(211)
grid(True)
axis([self.t[0], self.t[-1], 0, 255])
subplot(212)
grid(True)
axis([self.t[0], self.t[-1], 0, 255])
subplot(211)
plot(t0, r0, 'g--', t0, y0, 'b-')
xlabel("Tiempo [s]")
ylabel("Variable de proceso (PV)")
subplot(212)
plot(t0, r0, 'g--', t0, u0, 'r-')
xlabel("Tiempo [s]")
ylabel("Salida de control (CO)")
#subplot(212)
#plot(self.t, self.P, self.t, self.I, self.t, self.D)
<grrodi@gmail.com> 12
© 2010 Jorge Rodríguez Araújo
#ylabel("Accion de control")
#legend(("P", "I", "D"), 'best')
subplot(211)
grid(True)
axis([t0[0], t0[-1], 0, 255])
subplot(212)
grid(True)
axis([t0[0], t0[-1], 0, 255])
subplot(211)
plot([self.t[0], self.t[-1]], [y0, y0], 'k--',
[self.t[0], self.t[-1]], [y1, y1], 'k--',
[t1, t1], [0, 255], 'k--',
[t2, t2], [0, 255], 'k--',
[t1, t2], [y0, y1], '--')
if y0 != 0: text(-1, y0, "y0", va='center', ha='right',
fontsize=9, color='blue')
if y1 != 0: text(-1, y1, "y1", va='center', ha='right',
fontsize=9, color='blue')
if t1 != 0: text(t1, -1, "\nt1", ha='center', va='top',
fontsize=9, color='green')
if t2 != 0: text(t2, -1, "\nt2", ha='center', va='top',
fontsize=9, color='green')
subplot(212)
plot([self.t[0], self.t[-1]], [u0, u0], 'k--',
[self.t[0], self.t[-1]], [u1, u1], 'k--',
[t0, t0], [0, 255], 'k--')
if u0 != 0: text(-1, u0, "u0", va='center', ha='right',
fontsize=9, color='red')
if u1 != 0: text(-1, u1, "u1", va='center', ha='right',
fontsize=9, color='red')
if t0 != 0: text(t0, -1, "\nt0", ha='center', va='top',
fontsize=9, color='green')
self.simulate_plant()
def load(filename):
""" Devuelve los datos (t, u, y, Ts) a partir del archivo de datos de
respuesta del sistema """
print ">> Leyendo los datos de respuesta temporal del sistema "
try:
# Leer archivo de datos (U Y)
file = open(filename, 'r')
# Leer valor de Ts en us expresado en hexadecimal en la primera línea
Ts = int(file.readline(), 16) / 1000000.
# Ignorar la segunda línea que identifica las columnas U Y
<grrodi@gmail.com> 13
© 2010 Jorge Rodríguez Araújo
line = file.readline()
# Leer la información que se encuentra en el resto de líneas del
archivo
lines = file.readlines()
file.close()
if __name__ == "__main__":
<grrodi@gmail.com> 14
© 2010 Jorge Rodríguez Araújo
f.show()
<grrodi@gmail.com> 15