Guía 2: Influencia de las acciones de control en el comportamiento de la respuesta transitoria de un sistema de segundo orden.
Objetivo.
Comprobar el efecto que produce en el comportamiento transitorio de un sistema, la variación de las acciones de control básicas conocidas (Proporcional, Derivativa e Integral).
Preparación previa.
Revisar la literatura técnica a su disposición en la cual pueda analizar teóricamente Posibles respuestas transitorias de sistemas de primer y segundo orden.
Influencia de la razón de amortiguamiento y de la frecuencia natural en los diferentes tipos de respuesta de los sistemas de segundo orden.
Modificación en la forma de la respuesta producida por la presencia de un cero en la función de transferencia del lazo cerrado.
Modelo matemático de un motor de corriente continua.
Sugerencias:
Modern Control Engineering. K. Ogata Automatic Control Systems. B.Kuo.
Desarrollo
El esquema de control a utilizar en los ejercicios es el mostrado a continuación en la figura AII.1.
Figura AII.1: Esquema de control.
Ejercicio1.Obtención de la ganancia y constante de tiempo del motor.
Es posible medir la velocidad del motor una vez que se produce un cambio de voltaje en forma de paso a su entrada tal como se muestra en la figura AII.2 siguiente, abriendo el lazo.
Del comportamiento de la salida en forma exponencial (sistema de primer orden), se puede identificar el valor de la ganancia Km como el cambio total que se produce en la velocidad del motor y el valor de la constante de tiempo Tm como el tiempo que demora la velocidad en alcanzar el 63.2 % del valor final .
Realice el experimento y obtenga ambos valores
Ejercicio 2. Obtención de la respuesta transitoria del sistema en presencia de diferentes acciones de control.
2.1 Controlador en modo P.
Ponga en cero las acciones integral y derivativa del controlador PID.
Varíe el valor de la acción Proporcional en el rango que se da en la tabla, observe las especificaciones de la respuesta transitoria mas sobresalientes (máximo sobreimpulso, y tiempo de subida), llene la tabla con los valores que faltan.
Kp Mp tr 30 50 70 90 110 2.2. Controlador en modo PD
Deje en cero la acción integral del controlador PID. Sitúe el valor 110 en la ganancia Proporcional
Varíe el valor de la acción Derivativa en el rango que se da en la tabla, observe las especificaciones de la respuesta transitoria mas sobresalientes (máximo sobreimpulso, y tiempo de establecimiento), llene la tabla con los valores que faltan. Kp Kd Mp ts 110 0.3 0.5 0.8 1 1.5
2.3. Controlador en modo PI
Deje en cero la acción derivativa del controlador PID. Mantenga el valor 30 en la ganancia Proporcional
Varíe el valor de la acción Integral en el rango que se da en la tabla, observe las especificaciones de la respuesta transitoria mas sobresalientes (máximo sobreimpulso, y tiempo de establecimiento), llene la tabla con los valores que faltan. Kp Ki Mp ts 30 12 120 300 600
Una vez realizado los tres experimentos, con las observaciones y los resultados numéricos que ha obtenido. Concluya haciendo un análisis teórico que le permita explicarse lo sucedido, le ayudaría en este sentido responderse las siguientes preguntas: ¿Qué efecto causa en el comportamiento de la respuesta transitoria de un sistema como el mostrado (segundo orden tipo 1), aumentos sucesivos de la ganancia proporcional, la ganancia derivativa y la ganancia integral?
¿Qué influencia tienen esos valores de ganancia en el valor de la razón de amortiguamiento y de la frecuencia natural de oscilación de los polos de lazo cerrado?
¿Que influencia adicional tienen los valores de la ganancia derivativa y ganancia integral al formar un cero en la función de transferencia de lazo cerrado mas o menos cercano de los polos complejos?
Guía 2: Diseño de PID
Objetivo.
Obtener comportamientos predeterminados en la respuesta transitoria de un sistema partir de diseñar adecuadamente un controlador.
Preparación previa.
Revisar la literatura técnica a su disposición en la cual pueda analizar teóricamente
Posibilidades de variación de las figuras representativas de la respuesta transitoria de un sistema de segundo orden tipo uno, en función de un parámetro variable, su ganancia.
Modificación que sufre la localización de las raíces de lazo cerrado y por tanto las figuras anteriormente mencionadas cuando se adiciona un cero y/ o un polo en la función de transferencia de lazo abierto.
Analizar la metodología de trabajo necesaria para obtener resultados deseados. A continuación se propone una variante (ver figura AII.3) para acometer el diseño.
Figura AII.3: Variante propuesta
Desarrollo
El esquema de control a utilizar es la que se muestra a continuación en la figura AII.4. Selecione a Km = 2 y Tm = 0.02 seg
Figura AII.4: Esquema de control.
A manera de entrenamiento se le propone el siguiente ejercicio.
Ejercicio
Obtenga las respuestas transitorias del sistema ante cambio paso en la entrada si el regulador está en modo P con ganancias 20; 50; 100 150 200
Observe los valores del máximo sobreimpulso y del tiempo de crecimiento
Trate de ajustar el regulador en modo PD de manera que mantenga el valor de sobreimpulso cuando la ganancia tomó el valor de 20 pero que disminuya el tiempo de subida hasta un valor menor o igual que 0.02 seg.
¿Qué valores deben tener los parámetros del controlador en modo PID si desea lo mismo?
Una vez realizado los ajustes anteriores propóngase usted mismo índices nuevos y diferentes de comportamiento, esta vez incluya el modo PI.
Anexo III: Código estándar de los ficheros *.m de las prácticas.
Plantilla para prácticas paramétricas simuladas Validación de Variables
vars = who;
if length(vars) == No. de varialbles(n)
if V1 > n && V1 <= n && ... && Vn > n && Vn <= n
bdclose('all');
Datos específicos de la práctica
id = 'Identificador';
PracticeFile = 'Nombre de la practica'; Graph1File = 'Esquema de la practica.jpg'; Plot1 = 'plot(vel(:,1),vel(:,2:3))';
Graph2File = 'Grafico de respuesta 1.jpg'; Plot2 = 'plot(pos(:,1),pos(:,2))';
Graph(n)File = 'Grafico de respuesta n.jpg'; Plot(n) = 'plot(man(:,1),man(:,2))';
Inicializar la cadena de retorno. retstr = char('');
Inicialización de la estructura de datos
p = what;
mldir = p.path; Ruta completo donde esta el mdl y el html plantilla
outdir = [p.path '\out']; Ruta donde quedara el html resultante con sus
graficas OjO: debe copiarse a el el esquema
htmldir = [p.path '\html'];
pf = PracticeFile;
Realice los cálculos de MATLAB
eval(pf);
set_param([pf '/PID'],'V1',num2str(V1)); set_param([pf '/PID'],'Vn',num2str(Vn));
%Establezco el tiempo de muestreo set_param(gcs,'FixedStep',num2str(T)); sim(pf);
cd(outdir);
h = figure('visible','off');
Ajuste del tamaño de la figura
p = get(gcf, 'position'); p(3) = 380;
p(4) = 310;
set(gcf, 'Position', p, 'PaperPosition', [.25 .25 10 7.5]); Creando figura 1 eval(Plot1); grid on; legend('Deseada','Simulada'); GraphFile = sprintf(Graph1File); wsprintjpeg(h,GraphFile); Creando figura 2 eval(Plot2); grid on; GraphFile = sprintf(Graph2File); wsprintjpeg(h,GraphFile); Creando figura n eval(Plotn); grid on; GraphFile = sprintf(Graph(n)File); wsprintjpeg(h,GraphFile); close(h);
Creando el fichero de respuesta.
tim = (0:T:25)'; fin = length(tim);
vec = [tim vel(1:fin,2:3) pos(1:fin,2) man(1:fin,2)]; str = ['save ' PracticeFile ' vec -ascii -tabs']; eval(str);
Coloque las variables que ud quiera devolver al documento HTML de salida dentro de una estructura de salida. cd(mldir); Cierra el mdl close_system(gcs,0); clear all clc else disp('1')
clear all end else disp('2') clear all end
1= ERROR: Hay variables fuera de rango.
2= ERROR: Las variables no se han introducido correctamente.
Plantilla para prácticas paramétricas reales Validación de Variables
vars = who;
if length(vars) == No. de varialbles(n)
if V1 > n && V1 <= n && ... && Vn > n && Vn <= n
bdclose('all');
Datos específicos de la práctica
id = 'Identificador';
PracticeFile = 'Nombre de la practica'; Graph1File = 'Esquema de la practica.jpg'; Plot1 = 'plot(vel(:,1),vel(:,2:3))';
Graph2File = 'Grafico de respuesta 1.jpg'; Plot2 = 'plot(pos(:,1),pos(:,2))';
Graph(n)File = 'Grafico de respuesta n.jpg'; Plot(n) = 'plot(man(:,1),man(:,2))';
Inicilizar la cadena de retorno.
retstr = char('');
Inicialización de la estructura de datos
p = what;
mldir = p.path; Ruta completo donde esta el mdl y el html plantilla
outdir = [p.path '\out']; Ruta donde quedara el html resultante con sus
graficas OjO: debe copiarse a él, el esquema
htmldir = [p.path '\html'];
pf = PracticeFile;
Realice los calculos de MATLAB
eval(pf);
set_param([pf '/PID'],'V1',num2str(V1)); set_param([pf '/PID'],'Vn',num2str(Vn));
set_param(gcs,'FixedStep',num2str(T));
ESTABLEZCO LOS PARAMETROS DE LA SIMULACION
Establezco el tiempo de inicio
set_param(gcs,'Start time','0.0')
Establezco el tiempo final de la simulación
set_param(gcs,'Stop time','25')
Establezco la forma de solucion (RTW solo acepta Fixed-step)
set_param(gcs,'Solver','Fixed')
Establezco el algoritmo de solucion (ode5 es de proposito general)
set_param(gcs,'algorithm','ode5')
Establezco el tiempo de muestreo
set_param(gcs,'FixedStep',num2str(T))
ESTABLEZCO LOS PARAMETROS PARA TRABAJAR EN TIEMPO REAL
set_param(gcs,'ExtModeTrigType','manual'); set_param(gcs,'ExtModeTrigMode','normal'); stoptime =(get_param(gcs,'Stop time') ); duracion=str2num(stoptime)/T;
set_param(gcs,'ExtModeTrigDuration', duracion); set_param(gcs,'ExtModeArmWhenConnect','on'); set_param(gcs,'RTWInlineParameters','off');
Modifico el tiempo de muestreo de los bloques del modelo real
set_param([gcs '/Motor/Analog Output'],'SampleTime',num2str(T)); set_param([gcs '/Motor/Analog Output1'],'SampleTime',num2str(T)); set_param([gcs '/Motor/Analog Output2'],'SampleTime',num2str(T)); set_param([gcs '/Motor/Analog Output3'],'SampleTime',num2str(T)); set_param([gcs '/Motor/Encoder Input'],'SampleTime',num2str(T));
Creo el código
make_rtw;
Graba las variables del directorio
save globales
Simulink cambia a modo externo
set_param(gcs,'SimulationMode','external');
MatLab carga la aplicación en tiempo real y la conecta con los bloques de simulink
set_param(gcs,'SimulationCommand','connect');
Inicializa la simulación en tiempo real
pause (25);
Creando las figuras
cd(outdir);
h = figure('visible','off');
Ajuste del tamaño de la figura
p = get(gcf, 'position'); p(3) = 380;
p(4) = 310;
set(gcf, 'Position', p, 'PaperPosition', [.25 .25 10 7.5]); Creando figura 1 eval(Plot1); grid on; legend('Deseada','Simulada'); GraphFile = sprintf(Graph1File); wsprintjpeg(h,GraphFile); Creando figura 2 eval(Plot2); grid on; GraphFile = sprintf(Graph2File); wsprintjpeg(h,GraphFile); Creando figura n eval(Plotn); grid on; GraphFile = sprintf(Graph(n)File); wsprintjpeg(h,GraphFile); close(h);
Creando el fichero de respuesta.
tim = (0:T:25)'; fin = length(tim);
vec = [tim vel(1:fin,2:3) pos(1:fin,2) man(1:fin,2)]; str = ['save ' PracticeFile ' vec -ascii -tabs']; eval(str);
Coloque las variables que ud quiera devolver al documento HTML de salida dentro de una estructura de salida.
cd(mldir);
close_system(gcs,0); clear all clc else disp('1') clear all end else disp('2') clear all end
1 = ERROR: Hay variables fuera de rango.
2 = ERROR: Las variables no se han introducido correctamente.
Plantilla para prácticas con cambio de regulador simuladas
bdclose('all');
Datos específicos de la Práctica
id = 'Identificador';
filemuestra = 'mdl de muestra'; PracticeFile = 'Nombre de la practica'; Graph1File = 'Grafico de respuesta 1.jpg'; Plot1 = 'plot(pos(:,1),pos(:,2))';
Graph(n)File = 'Grafico de respuesta n.jpg'; Plot(n) = 'plot(man(:,1),man(:,2))';
Inicializar la cadena de retorno. retstr = char('');
Inicialización de la estructura de datos
p = what;
mldir = p.path; Path completo donde esta el mdl y el html plantilla
outdir = [p.path '\out']; Path donde quedara el html resultante con sus graficas OjO: debe
copiarse a él, el esquema
filemdl = [p.path '\regulador\ureg.mdl']; filemat = [p.path '\data.mat'];
[path,name,ext,ver] = fileparts(filemdl); mdlsourcepath = filemdl; mdlsource = name; mdldestin = PracticeFile; matsource = filemat; mdlmuestra = filemuestra;
Realice los cálculos de MATLAB if exist(matsource) == 2 eval(['load ' matsource]); end try open_system(mdlsourcepath); catch mdlsourcepath = ''; end if exist(mdlsourcepath) == 0 error = '1';
1-No se manda ningún modelo para ejecutar
disp(error); else
open_system(mdlsourcepath);
tmsource = get_param(gcs,'FixedStep'); obtengo tm de la fuente
open_system(mdldestin);
set_param(gcs,'FixedStep', tmsource); cambio tm
error = replace( mdlsource, mdldestin ); end
if isempty(error) try
sim(mdldestin); catch
error = 'Error ejecutando el modelo'; disp(error);
end
Creando las figuras
cd(outdir);
h = figure('visible','off');
Ajuste del tamaño de la figura
p = get(gcf, 'position'); p(3) = 380;
p(4) = 310;
set(gcf, 'Position', p, 'PaperPosition', [.25 .25 10 7.5]); Creando figura 1 eval(Plot1); grid on; legend('Deseada','Simulada'); GraphFile = sprintf(Graph1File); wsprintjpeg(h,GraphFile);
Creando figura n eval(Plotn); grid on; GraphFile = sprintf(Graph(n)File); wsprintjpeg(h,GraphFile); close(h);
Creando el fichero de respuesta
tim = (0:T:25)'; fin = length(tim);
vec = [tim vel(1:fin,2:3) pos(1:fin,2) man(1:fin,2)]; str = ['save ' PracticeFile ' vec -ascii -tabs']; eval(str);
Coloque las variables que usted quiera devolver al documento HTML de salida dentro de una estructura de salida.
cd(mldir);
error = 'Práctica ejecutada sin dificultad'; instruct.text = error; delete(filemdl); end Cierra el mdl bdclose('all'); clear all clc
Plantilla para práctica con cambio de regulador real
bdclose('all');
Tiempo de muestreo
T='n';
Datos específicos de las practicas
id = 'Identificador';
filemuestra = 'mdl de muestra';
PracticeFile_S = 'Nombre de la practica simulada'; Para llevar a cabo una simulación
PracticeFile = 'Nombre de la práctica real'; Graph1File = 'Grafico de respuesta 1.jpg'; Plot1 = 'plot(pos(:,1),pos(:,2:3))'; Graph2File = 'grafico de respuesta 2.jpg';
Plot2 = 'plot(vel(:,1),vel(:,2))'; Graph(n)File = 'mandoprc.jpg'; Plot(n) = 'plot(man(:,1),man(:,2))';
Inicializar la cadena de retorno. retstr = char('');
Inicialización de la estructura de datos
p = what;
mldir = p.path; Path completo donde está el mdl y el html plantilla
outdir = [p.path '\out']; Path donde quedara el html resultante con sus graficas OjO: debe
copiarse a él, el esquema.
filemdl = [p.path '\regulador\ureg.mdl']; filemat = [p.path '\data.mat'];
[path,name,ext,ver] = fileparts(filemdl); mdlsourcepath = filemdl;
mdlsource = name; matsource = filemat; mdlmuestra = filemuestra;
Realizo la simulación del modelo
mdldestin = PracticeFile_S; Voy a realizar el reemplazo en el modelo simulado
if exist(matsource) == 2 eval(['load ' matsource]); end try open_system (mdlsourcepath); catch mdlsourcepath = ''; end if exist(mdlsourcepath) == 0 error = '3'; disp(error); else open_system(mdlsourcepath);
tmsource = get_param(gcs,'FixedStep'); %obtengo tm de la fuente open_system(mdldestin);
set_param(gcs,'FixedStep', tmsource); %cambio tm error = replace( mdlsource, mdldestin );
end
if isempty(error) try
sim(mdldestin); catch
error = '4'; disp(error); end
end
Chequeo oscilaciones que pueden dañar la planta
if isempty(error) respuesta_osc=0;
if(respuesta_osc==1) El sistema es muy oscilatorio, solo creo los gráficos e informo de la
situación.
cd(mldir);
Creando las figuras
cd(outdir);
h = figure('visible','off');
Ajuste del tamaño de la figura
p = get(gcf, 'position'); p(3) = 380;
p(4) = 310;
set(gcf, 'Position', p, 'PaperPosition', [.25 .25 10 7.5]); Creando figura 1 eval(Plot1); grid on; legend('Deseada','Simulada'); GraphFile = sprintf(Graph1File); wsprintjpeg(h,GraphFile); Creando figura 2 eval(Plot2); grid on; GraphFile = sprintf(Graph2File); wsprintjpeg(h,GraphFile); Creando figura n eval(Plot(n)); grid on; GraphFile = sprintf(Graph(n)File); wsprintjpeg(h,GraphFile); close(h);
Tm = str2num(tmsource); Tiempo de muestreo
Tf = str2num(get_param(mdldestin,'StopTime'));
fin = length(tim);
vec = [tim pos(1:fin,2:3) vel(1:fin,2) man(1:fin,2)]; str = ['save ' PracticeFile ' vec -ascii -tabs']; eval(str); cd(mldir); bdclose('all'); else
mdldestin = PracticeFile; Realizo el remplazo sobre el modelo real
open_system(mdlsourcepath); open_system(mdldestin);
error = replace( mdlsource, mdldestin ); if isempty(error)
text=('La práctica se ha realizado sin problemas'); open_system(mdldestin);
Establezco el tiempo de inicio
set_param(gcs,'Start time','0.0')
Establezco el tiempo final de la simulación
set_param(gcs,'Stop time','10')
Establezco la forma de solucion (RTW solo acepta Fixed-step)
set_param(gcs,'Solver','Fixed')
Establezco el algoritmo de solucion (ode5 es de propósito general)
set_param(gcs,'algorithm','ode5')
ESTABLEZCO LOS PARAMETROS PARA TRABAJAR EN TIEMPO REAL
set_param(gcs,'RTWInlineParameters','off');
CREACION MODIFICACION Y COMPILACION DEL CODIGO DEL SISTEMA
Creo el código
make_rtw;
Graba las variables del directorio
save globales
CONECTAR EL SISTEMA A LA TARJETA Y CORRER
set_param(gcs,'SimulationMode','external');
MatLab carga la aplicación en tiempo real y la conecta con los bloques de simulink
set_param(gcs,'SimulationCommand','connect');
Inicializa la simulación en tiempo real
set_param(gcs,'SimulationCommand','start'); pause (10);
Creando las figuras
cd(outdir);
h = figure('visible','off');
Ajuste del tamaño de la figura
p = get(gcf, 'position'); p(3) = 380;
p(4) = 310;
set(gcf, 'Position', p, 'PaperPosition', [.25 .25 10 7.5]); Creando figura 1 eval(Plot1); grid on; legend('Deseada','Simulada'); GraphFile = sprintf(Graph1File); wsprintjpeg(h,GraphFile); Creando figura 2 eval(Plot2); grid on; GraphFile = sprintf(Graph2File); wsprintjpeg(h,GraphFile); Creando figura n eval(Plotn); grid on; GraphFile = sprintf(GraphnFile); wsprintjpeg(h,GraphFile); close(h);
Creando el fichero de respuesta.
Tm = str2num(tmsource); %Tiempo de muestreo Tf = str2num(get_param(mdldestin,'StopTime')); tim = (0:0.01:25)';
fin = length(tim);
vec = [tim pos(1:fin,2:3) vel(1:fin,2) man(1:fin,2)]; str = ['save ' PracticeFile ' vec -ascii -tabs']; eval(str);
cd(mldir); bdclose('all'); end end end Cierra el mdl bdclose('all'); clear clc