REGULACIÓN Y CONTROL DE MÁQUNAS NAVALES Tema 13 Implementación de un Regulador PID Gijón - Marzo 2012 1 REGULACIÓN Y CONTROL DE MÁQUNAS NAVALES 1.4 Acciones de Control Clásicas 1.2 x(t) 1 0.8 y(t) 0.6 0.4 e(t) x(t) + P I _ 1 2 + 3 0 - 5 + u(t) y(t) 5 10 15 20 25 30 0.8 Sistema e(t) 0.6 1 + 0 1 0.4 D 0.2 0 - 0.2 - 0.4 - 5 0 5 10 15 20 25 30 0 5 10 15 20 25 30 0 5 10 15 20 25 30 2 1.8 1.6 1- Proporcional e(t ) = x(t ) − y (t ) 1.4 1.2 1 2 0.8 0.6 t 2- Integral ∫0 0.4 e(t )·dt 0.2 0 - 5 2 1.6 1.2 0.8 3- Diferencial de(t ) dt 0.4 3 0 - 0.4 - 0.8 - 1.2 - 1.6 - 2 - 5 Gijón - Marzo 2012 2 REGULACIÓN Y CONTROL DE MÁQUNAS NAVALES Diseño de un regulador PID Se puede sintonizar un regulador PID sencillo para sistemas monovariables que presentan una respuesta en forma de "S" ante entradas escalón, sin necesidad de conocer su modelo matemático. Uno de los métodos es el primero de los propuestos por Ziegler-Nichols cuyo objetivo es obtener una respuesta con una sobreoscilación aproximada del 25%. U(s) Respuesta al escalón unitario K G(s) u(t) y(t) 0 y(t) Ziegler-Nichols considera en realidad un sistema de primer orden con constante de tiempo T y retardo puro L: Tangente en el punto de inflexión (máxima pendiente de la curva) 0 T K y(t) t L T Gijón - Marzo 2012 Y(s) L L+T G( s) = e −L·s K T·s + 1 t 3 REGULACIÓN Y CONTROL DE MÁQUNAS NAVALES Diseño de un regulador PID A partir de los valores de "K", "L" y "T" se pueden obtener los parámetros de un regulador P, PI o PID, para que el sistema en bucle cerrado tenga una respuesta con una sobreoscilación aproximada del 25%. C(s) + c(t) _ E(s) e(t) Y(s) U(s) R(s) Respuesta al escalón unitario G(s) u(t) y(t) 25% y(t) 1 Nota: En el caso de que la realimentación no sea unitaria, H(s)≠1, se debe utilizar la respuesta al escalón unitario de G(s)·H(s) para determinar los valores de "K", "L" y "T". 0 Gijón - Marzo 2012 0 t 4 REGULACIÓN Y CONTROL DE MÁQUNAS NAVALES Diseño de un regulador PID Los parámetros para los distintos reguladores se obtiene a partir de la siguiente tabla: TIPO Kp Ki=1/Ti Kd=Td P T/(K·L) 0 0 PI 0.9·T/(K·L) 0.3/L 0 PID 1.2·T/(K·L) 0.5/L 0.5·L de( t ) u( t ) = K p · e( t ) + K i ·∫ e( t )·dt +K d dt P E(s) + I Kp Ki=1/Ti Kd=Td Gijón - Marzo 2012 1/s D + + U(s) U(s) Ki R(s) = = K p ·1 + + K d ·s E(s) s s 5 REGULACIÓN Y CONTROL DE MÁQUNAS NAVALES Cálculo Iterativo … uk = K p ·(ek + K i ·integral + K d ·derivada) Cálculo en el instante K+1 Cálculo en el instante K integral = integral + ek −1·Tm integral = integral + ek ·Tm ek − ek −1 derivada = pk = Tm ek +1 − ek derivada = pk +1 = Tm e(t) … ek+1 ek+2 ek pk+1 pk ek-1 0 Gijón - Marzo 2012 ∫ e( t)·dt 0 Tm K (K*Tm) K+1 K+2 t 6 REGULACIÓN Y CONTROL DE MÁQUNAS NAVALES Implementación de un regulador PID PROGRAM CONTROL_NIVEL VAR rTM:REAL:=1.0; (* Tiempo de muestreo en segundos *) (* Debe coincidir con el "tiempo de ciclo" del programa *) rREF_NIVEL: REAL; (* REFERENCIA de nivel *) rERROR:REAL:=0.0; (* ERROR en este ciclo *) rERROR_OLD:REAL:=0.0;(* ERROR en el ciclo anterior *) rINTEGRAL:REAL:=0.0; (* INTEGRAL del error *) rDERIVADA:REAL:=0.0; (* DERIVADA del error *) rSPEED:REAL:=0.0; (* CONSIGNA de velocidad para el motor de la bomba *) END_VAR (* Programa ciclico que calcula cada 1 segundos el algoritmo del PID *) rNIVEL:=FU_rLEENIVEL(I_wSENNIV); (* Se actualiza aquí la variable global rNIVEL *) rREF_NIVEL:=FU_rLEEREF(I_iREFNIV); (* Lectura del valor de REFERENCIA *) rERROR:= rREF_NIVEL-rNIVEL; rINTEGRAL:=rINTEGRAL+rERROR_OLD*rTM; rDERIVADA:=(rERROR-rERROR_OLD)/rTM; (* Cálculo del error *) (* Cálculo de la integral del error *) (* Cáculo de la derivada del error *) rSPEED:=rKP*(rERROR+rKI*rINTEGRAL+rKD*rDERIVADA); (* Consigna de velocidad *) rERROR_OLD:=rERROR; (* Se guarda el valor del error para el próximo ciclo *) Gijón - Marzo 2012 7 REGULACIÓN Y CONTROL DE MÁQUNAS NAVALES Implementación de un regulador PID (* Programa ciclico que calcula cada 1 segundos el algoritmo del PID *) rNIVEL:=FU_rLEENIVEL(I_wSENNIV); (* Se actualiza aquí la variable global rNIVEL *) rREF_NIVEL:=FU_rLEEREF(I_iREFNIV); (* Lectura del valor de REFERENCIA *) rERROR:= rREF_NIVEL-rNIVEL; (* Cálculo del error *) IF xPID_ACTIVO THEN (* Se dan las condiciones para el funcionamietno del PID *) IF rKI>0.0 THEN rINTEGRAL:=rINTEGRAL+rERROR_OLD*rTM; (* Cálculo de la integral del error *) ELSE rINTEGRAL:=0.0;(* Evita que la integral del error crezca cuando no se usa la acción integral *) END_IF; rDERIVADA:=(rERROR-rERROR_OLD)/rTM; (* Cáculo de la derivada del error *) rSPEED:=rKP*(rERROR+rKI*rINTEGRAL+rKD*rDERIVADA); (* Consigna de velocidad *) IF rSPEED > 100.0 THEN rSPEED:=100.0; END_IF; (* Límites de velocidad 0->100 % *) IF rSPEED < 0.0 THEN rSPEED:=0.0; END_IF; Q_iSPEED:=10*REAL_TO_INT(rSPEED); (* Se envía la consigna a la salida *) ELSE rINTEGRAL:=0.0;(* Asegura que la integral vuelve a cero cuando el PID no está activo *) rSPEED:=0.0; END_IF; rERROR_OLD:=rERROR; (* Se guarda el valor del error para el próximo ciclo *) Gijón - Marzo 2012 8