A2-Programa completo de MATLAB

Anuncio
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
Anejo 2: Programa completo de MATLAB
A continuación se muestran el código (en crudo) de todos los archivos de
MATLAB creadas para este proyecto.
Archivo ayuda.m
Este archivo contiene el mensaje de ayuda que se muestra por pantalla cuando el
usuario pulsa el botón “ayuda” en la interfaz gráfica.
function ayuda()
fprintf('\n');
disp('CONTROL DE LA PLANTA MEDIANTE MATLAB:');
fprintf('\n');
disp(' Una vez ejecutado el comando "control_planta", Matlab conectará');
disp(' con el servidor de OPC y se abrirá la pantalla de control.');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' La pantalla de control permite al usuario programar un bucle de control');
disp(' sin tener que preocuparse de la comunicación con OPC.');
disp(' En "Función de control" se debe introducir el nombre de la función');
disp(' que se haya programado para controlar la planta.');
disp(' El bucle de control se compone de las siguientes partes (en orden):');
fprintf('\n');
fprintf('\t -> Lectura de las variables del autómata\n');
fprintf('\t -> Llamada a la función de control\n');
fprintf('\t -> Escritura de las variables del autómata\n');
fprintf('\t -> Escritura en Excel\n');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' La función de control debe cumplir algunos requisitos.');
disp(' En primer lugar, la función debe tener acceso a las variables globales');
disp(' que representan los distintos sensores y actuadors de la planta:');
fprintf('\n')
fprintf('\t B1: Bomba de alimentación\n');
fprintf('\t B2: Bomba de recirculación\n');
fprintf('\t V4: Válvula de agua caliente\n');
fprintf('\t V5: Válvula de agua fría\n');
fprintf('\t V8: Válvula de agua de recirculación\n');
fprintf('\t PWM: Tiempo de encendido de la modulación PWM\n');
fprintf('\t RES: Resistencia del depósito de trabajo\n');
fprintf('\t TERMO: Resistencia del tanque de agua caliente\n');
fprintf('\n');
fprintf('\t FT1: Caudal de agua caliente\n');
fprintf('\t TT1: Temperatura de agua caliente\n');
fprintf('\t FT2: Caudal de agua fría\n');
fprintf('\t TT2: Temperatura de agua fría\n');
fprintf('\t FT3: Caudal de agua de salida\n');
fprintf('\t TT3: Temperatura de agua de salida\n');
fprintf('\t FT4: Caudal del circuito de recirculación\n');
fprintf('\t TT1: Temperatura de agua de recirculación\n');
fprintf('\t LT1: Nivel de agua del depósito de trabajo\n');
fprintf('\t TT5: Temperatura de agua del depósito\n');
Pag.136
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
fprintf('\t PT1: Presión del depósito de trabajo\n');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
F=figure();
imshow(imread('ImMat.bmp'));
disp(' Las variables del primer grupo (que en la imagen aparecen subrayadas)');
disp(' son variables de lectura y escritura. Al terminar la ejecución de la');
disp(' función de control sus valores se enviarán al autómata. En la pantalla');
disp(' Vijeo Citect "Mímico 2D" de la planta, estas variables deben estar');
disp(' configuradas como MAT para que el autómata acepte estos valroes.');
disp(' Si la variable está configurada como AUTO o MAN, el valor se ignora.');
disp(' Las otras variables son de sólo lectura: MATLAB almacenará su valor');
disp(' durante la ejecución de la función de control, pero lo sobreescribirá');
disp(' al volver al inicio del bucle de control.');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
figure(F);
close;
disp(' Las dimensiones de las variables son las siguientes:');
disp(' ·Válvulas en tanto por ciento.');
disp(' ·Caudales en litros por minuto.');
disp(' ·Temperaturas en grados.')
disp(' ·Presión en bares.');
disp(' ·Bombas y resistencias sin unidad y en binario (0 ó 1).');
disp(' PWM indica el número de centésimas de segundo que la resistencia estará');
disp(' encendida en cada segundo. Además, entre PWM y RES sólo una se envía');
disp(' al autómata cada vez, según éste haya sido configurado.');
fprintf('\n');
disp(' Para la comodidad del usuario se han añadido 5 variables de propósito');
disp(' general, que pueden ser modificadas por el usuario desde MATLAB o');
disp(' desde Vijeo Citect: AUX_A, AUX_B, AUX_C, AUX_D, y AUX_E');
disp(' También se puede acceder desde MATLAB a las referencias de los contro-');
disp(' ladores del autómata: FC1, FC2, FC4, TC5, LC1 y Ratio se refieren');
disp(' respectivamente a las referencias de caudal caliente, caudal frío,');
disp(' caudal de recirculación, temperatura del depósito, nivel del depósito');
disp(' y proporción de agua caliente a la entrada del depósito.');
disp(' Estas variables se deben declarar como globales, y su funcionamiento');
disp(' es el mismo que el de las variables de lectura y escritura: se envían');
disp(' al autómata al final de cada ejecución de la funciónde control.');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' La otra condición que debe cumplir la función de control se refiere a');
disp(' sus propias variables de entrada y salida. La función debe recibir UNA');
disp(' variable de entrada y debe devolver UNA variable de salida.');
disp(' En la primera ejecución del bucle, la función recibirá por entrada');
disp(' la cadena de caracteres ''inicio'' y podrá devolver cualquier valor');
disp(' que el usuario considere necesario para el siguiente ciclo.');
disp(' En cada nuevo ciclo, la función recibirá la variable de salida que');
disp(' devolvió en el ciclo aterior. Esto permite guardar variables de un');
disp(' ciclo al siguiente sin necesidad de más variables globales.');
disp(' La variable de salida puede ser un vector o una matriz de cualquier');
disp(' dimensión, aunque a mayor memoria, mayor tiempo de ejecución.');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' Así pues la función de control sigue el siguiente esquema:');
fprintf('\nfunction Salida=funcion(Entrada)\n \n%%Variables de entrada (sensores)\n');
Pag.137
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
fprintf('global FT1 FT2 FT3 FT4 LT1 PT1 TT1 TT2 TT3 TT4 TT5;\n');
fprintf('%%Variables de salida (actuadores)\nglobal B1 B2 V4 V5 V8 PWM RES TERMO;\n');
fprintf('%%Variables definidas por el usuario\nglobal AUX_A AUX_B AUX_C AUX_D AUX_E;\n
\n');
fprintf('if ischar(Entrada)\n \n %%Entrada es una cadena de caracteres\n \n');
fprintf(' if(STRCMP(Entrada,''inicio''))\n \n
%%Algoritmo de inicialización\n');
fprintf('
%%Asociar un valor a Salida\n\n end\nelse\n \n');
fprintf(' %%Algoritmo de control \n %%Asociar un valor a ')
fprintf('B1, B2, V4, V5, V8, RES, PWM y/o TERMO\n \nend\n \n');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' Puesto que la ejecución de funciones de MATLAB es considerablemente');
disp(' lenta, la duración del ciclo de control puede variar de un ciclo a otro.');
disp(' Para evitar esto, en la pantalla de control, se puede introducir la');
disp(' "duración de un ciclo de control". Cuando MATLAB termina un ciclo de');
disp(' control, no empezará con el siguiente hasta que haya pasado un cierto');
disp(' tiempo desde que se empezó el mismo ciclo. Debe entenderse este tiempo');
disp(' como el mínimo tiempo que puede haber entre dos ciclos consecutivos.');
disp(' MATLAB inicia cada ciclo "a la primera oportunidad después de que pase');
disp(' el tiempo de ciclo". Por ejemplo: si en "duración de un tiempo de');
disp(' ciclo" se introduce un 2, el segundo ciclo se ejecutará, tan pronto');
disp(' como sea posible siempre que ya hayan pasado 2 segundos, el tercero');
disp(' después de que hayan pasado 4, el cuarto después de 6, etc.');
disp(' Si la ejecución de un ciclo tiene mayor duración de la indicada, de');
disp(' la indicada, los ciclos siguientes se ejecutarán antes (si esto es');
disp(' posible) de modo que el error en tiempo vuelva a cero.');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
fprintf(' A modo de ejemplo, se ha hecho correr el programa durante 10 ciclos\n');
fprintf(' con una duración de ciclo de control de 2 segundos, con el fin de\n');
fprintf(' comprobar la fluctuación del tiempo de muestreo. A continuación se\n');
fprintf(' muestra el instante en que se empezó cada ciclo en este ejemplo\n \n');
fprintf('\t0,022469616\n\t2,031324093\n\t4,025760257\n\t6,023338441\n\t8,026029565\n\t10,02
472661\n');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' En "Número de ciclos de control" se debe introducir el número de');
disp(' iteraciones que el programa debe ejecutar antes de pararse. Si este');
disp(' número se deja como 0, el bucle se ejecuta indefinidamente. En ambos');
disp(' casos, si el autómata abandona el modo automático, la función deja');
disp(' de ejecutarse.');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' Por último, el programa también puede pasar a excel los valores de');
disp(' las variables que el usuario considere oportunas. Para ello, en');
disp(' "Archivo de Excel", debe introducirse el nombre (incluida la extensión)');
disp(' de un archivo de excel que ya exista y se encuentre en el directorio');
disp(' de trabajo o en el path de MATLAB. Durante el ciclo de inicialización');
disp(' se creará una nueva hoja en el archivo, y en cada nuevo ciclo, se');
disp(' añadirá una línea. Cada casilla de verificación de la pantalla de');
disp(' control se corresponde con una variable del autómata. Las variables');
disp(' que correspondan a casillas marcadas se añairán a estas líneas.');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' También se pueden añadir los valores al histórico cada cierto número de');
Pag.138
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
disp(' ciclos de control. Basta introducir este valor en "Número de ciclos entre');
disp(' muestras del histórico. Por defecto este valor es 1, es decir, cada ciclo.');
fprintf('\n');
disp(' Una vez configurada la función de control, el tiempo y número de ciclos,');
disp(' y el paso a excel, pulse en el botón "ejecutar" para iniciar el bucle.');
fprintf('\n Pulse cualquier tecla para continuar.');
pause
fprintf('\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b');
disp(' Para salir del programa, debe pulsarse el botón "Salir". Si se cierra');
disp(' la ventana sin pulsar este botón, la conexión con OPC no se cerrará,');
disp(' y se podrá controlar la planta desde la pantalla de comandos o desde');
disp(' otra función (consultar documentación). Para desconectarse de OPC,');
disp(' ejecute la función "desconectar()".');
Archivo celda.m
El archivo celda contiene una función auxiliar (celda) que convierte los índices
de fila y columna de una hoja de Excel en la una cadena de caracteres para este
programa. Por ejemplo, si el índice de la fila es 20 y el de la columna es 3, la función
devuelve la cadena de caracteres ‘C20’. Los valores de los índices deben ser posibles
para una hoja de Excel, es decir, el índice de fila debe estar entre 1 y 65536; y el de
columna, entre 1 y 256.
function cadena=celda(fil, col)
% CASILLA=celda(FILA, COLUMNA) devuelve la cadena de caracteres que
% determinan una celda en Microsoft Excel. Por ejemplo si FILA vale 2 y
% COLUMNA vale 5, CASILLA será 'E2'. De esta forma se pueden usar en Excel
% los mismos índices que se usan en MATLAB.
%
% Se recuerda que una hoja de Excel contiene un máximo de 65536 filas y 256
% columnas, siendo la última celda 'IV65536'.
num=0;
%Caracteres ASCII que componen el número de la fila:
if (fil<1000)
if fil(fil<100)
if (fil<10)
num=1;
else
num=2;
end
else
num=3;
end
else
if (fil<10000)
num=4;
else
num=5;
end
end
cadfil=zeros(1,num);
for i=1:num
cadfil(i)=floor(fil/(10^(num-i)));
fil=fil-(cadfil(i)*(10^(num-i)));
cadfil(i)=cadfil(i)+48; %'0'=char(48)
end
Pag.139
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
%Caracteres ASCII que componen la letra de la columna:
if (col<27)
num=1;
else
num=2;
end
cadcol=zeros(1,num);
for j=1:num
cadcol(j)=floor(col/(26^(num-j)));
col=col-(cadcol(j)*(26^(num-j)));
cadcol(j)=cadcol(j)+64; %'A'=char(65)
end
cadena=char([cadcol cadfil]);
Archivo conectar.m
Este archivo contiene un e ecutable de MATLAB para conectar con OPC. e
crean las variables globales utilizadas en el método manual de control con MATLAB
pero no las correspondientes a la interfaz gráfica.
%Conexión con OPC y creación de variables
%Declaración de variables globales
%Grupo
global da grupo;
%Señales
global MARCHA PARADA;
%OPC
global AuxMat1 AuxMat2 AuxMat3 AuxMat4 AuxMat5;
global BombaAlim BombaAlimConf BombaRecir BombaRecirConf;
global CaudalCaliente CaudalFrio CaudalSalida CaudalRecir;
global NivelDeposito PresionDeposito;
global RefCaudalCaliente RefCaudalFrio RefCaudalRecir;
global RefNivel RefRatio RefTemp;
global Resistencia ResistenciaPWM ResTermo;
global TempCaliente TempFria TempSalida TempRecir TempDeposito;
global ValvulaCaliente ValvulaFria ValvulaRecir;
%Conexión con OPC
da=opcda('127.0.0.1','Schneider-Aut.OFS.2');
connect(da);
grupo=addgroup(da);
%Declaración de variables de OPC:
AuxMat1=additem(grupo,'planta_!Aux_Mat_1'); %Variable auxiliar definida por el usuario
AuxMat2=additem(grupo,'planta_!Aux_Mat_2'); %Variable auxiliar definida por el usuario
AuxMat3=additem(grupo,'planta_!Aux_Mat_3'); %Variable auxiliar definida por el usuario
AuxMat4=additem(grupo,'planta_!Aux_Mat_4'); %Variable auxiliar definida por el usuario
AuxMat5=additem(grupo,'planta_!Aux_Mat_5'); %Variable auxiliar definida por el usuario
BombaAlim=additem(grupo,'planta_!BOMBA_ALIM_MAT'); %Bomba de alimentación (orden de
marcha)
BombaAlimConf=additem(grupo,'planta_!conf_bomba_a'); %Bomba de alimentación
(confirmación)
Pag.140
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
BombaRecirConf=additem(grupo,'planta_!conf_bomba_r'); %Bomba de recirculación
(confirmación)
CaudalCaliente=additem(grupo,'planta_!caudal_caliente'); %Caudal de agua caliente
CaudalFrio=additem(grupo,'planta_!caudal_frio'); %Caudal de agua fría
CaudalSalida=additem(grupo,'planta_!caudal_salida'); %Caudal de agua saliente del depósito
CaudalRecir=additem(grupo,'planta_!caudal_recirculacion'); %Caudal de agua del circuito de
recirculación
NivelDeposito=additem(grupo,'planta_!niv_deposito'); %Nivel de agua del deposito
PresionDeposito=additem(grupo,'planta_!presion_deposito'); %Presión del depósito
RefCaudalCaliente=additem(grupo,'planta_!RefCaudalCaliente'); %Referencia del caudal
caliente
RefCaudalFrio=additem(grupo,'planta_!RefCaudalFrio'); %Referencia del caudal frío
RefCaudalRecir=additem(grupo,'planta_!RefCaudalRecirculacion'); %Referencia del caudal de
recirculación
RefNivel=additem(grupo,'planta_!RefNivel'); %Referencia del nivel del depósito
RefRatio=additem(grupo,'planta_!RefNivProporcion'); %Referencia de proporción de agua de
entrada
RefTemp=additem(grupo,'planta_!RefTempDeposito'); %Referencia de temperatura del
depósito
Resistencia=additem(grupo,'planta_!RESISTENCIA_MAT'); %Resistencia del interior del
depósito (orden de marcha)
ResistenciaPWM=additem(grupo,'planta_!PWM_RESISTENCIA_MAT'); %Modulación por
ancho de pulsos de la resistencia
ResTermo=additem(grupo,'planta_!TERMO_MAT'); %Grupo caliente (orden de marcha)
TempCaliente=additem(grupo,'planta_!tem_caliente'); %Temperatura de agua caliente
TempFria=additem(grupo,'planta_!tem_fria'); %Temperatura de agua fría
TempSalida=additem(grupo,'planta_!tem_salida'); %Temperatura de saliente del depositos
TempRecir=additem(grupo,'planta_!tem_recirculacion'); %Temperatura de agua recirculante
TempDeposito=additem(grupo,'planta_!tem_deposito'); %Temperatura del agua del depósito
ValvulaCaliente=additem(grupo,'planta_!VAL_CALIENTE_MAT'); %Válvula de agua caliente V4
ValvulaFria=additem(grupo,'planta_!VAL_FRIA_MAT'); %Válvula de agua fría V5
ValvulaRecir=additem(grupo,'planta_!VAL_RECIRCULACION_MAT'); %Valvula de agua de
recirculación V8
MARCHA=additem(grupo,'planta_!Modo_Auto_M'); %Modo automático en marcha
PARADA=additem(grupo,'planta_!Modo_Auto_P'); %Modo automático en parada
Archivo control_planta.m
El ejecutable incluido en este archivo es similar al de conectar.m. En este caso,
además, abre la interfaz gráfica y se crean las variables globales para las nuevas
funciones.
% Conecta MATLAB con OPC, declara variables globales para intercambiar
% datos con el autómata de la planta y abre la interfaz con el usuario
% propia de MATLAB.
clc;
%Declaración de variables globales
%Grupo
global da grupo;
%Variables de entrada (sensores)
global FT1 FT2 FT3 FT4 LT1 PT1 TT1 TT2 TT3 TT4 TT5;
%Variables de salida (actuadores)
global B1 B2 V4 V5 V8 PWM RES TERMO;
Pag.141
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
%Variables de referencia
global FC1 FC2 FC4 LC1 TC5 Ratio;
%Variables definidas por el usuario
global AUX_A AUX_B AUX_C AUX_D AUX_E;
%Señales
global MARCHA PARADA;
%Intermedias
global AuxMat1 AuxMat2 AuxMat3 AuxMat4 AuxMat5;
global BombaAlim BombaAlimConf BombaRecir BombaRecirConf;
global CaudalCaliente CaudalFrio CaudalSalida CaudalRecir;
global NivelDeposito PresionDeposito;
global RefCaudalCaliente RefCaudalFrio RefCaudalRecir;
global RefNivel RefRatio RefTemp;
global Resistencia ResistenciaPWM ResTermo;
global TempCaliente TempFria TempSalida TempRecir TempDeposito;
global ValvulaCaliente ValvulaFria ValvulaRecir;
%Propias de la aplicación
global FuncionControl NumeroCiclos TiempoCiclo ArchivoDeExcel;
global VarExcel niterexcel;
VarExcel = zeros(1,25);
%Conexión con OPC
da=opcda('127.0.0.1','Schneider-Aut.OFS.2');
connect(da);
grupo=addgroup(da);
%Declaración de variables de OPC:
AuxMat1=additem(grupo,'planta_!Aux_Mat_1'); %Variable auxiliar definida por el usuario
AuxMat2=additem(grupo,'planta_!Aux_Mat_2'); %Variable auxiliar definida por el usuario
AuxMat3=additem(grupo,'planta_!Aux_Mat_3'); %Variable auxiliar definida por el usuario
AuxMat4=additem(grupo,'planta_!Aux_Mat_4'); %Variable auxiliar definida por el usuario
AuxMat5=additem(grupo,'planta_!Aux_Mat_5'); %Variable auxiliar definida por el usuario
BombaAlim=additem(grupo,'planta_!BOMBA_ALIM_MAT'); %Bomba de alimentación (orden de
marcha)
BombaAlimConf=additem(grupo,'planta_!conf_bomba_a'); %Bomba de alimentación
(confirmación)
BombaRecir=additem(grupo,'planta_!BOMBA_RECIR_MAT'); %Bomba de recirculación (orden
de marcha)
BombaRecirConf=additem(grupo,'planta_!conf_bomba_r'); %Bomba de recirculación
(confirmación)
CaudalCaliente=additem(grupo,'planta_!caudal_caliente'); %Caudal de agua caliente
CaudalFrio=additem(grupo,'planta_!caudal_frio'); %Caudal de agua fría
CaudalSalida=additem(grupo,'planta_!caudal_salida'); %Caudal de agua saliente del depósito
CaudalRecir=additem(grupo,'planta_!caudal_recirculacion'); %Caudal de agua del circuito de
recirculación
NivelDeposito=additem(grupo,'planta_!niv_deposito'); %Nivel de agua del deposito
PresionDeposito=additem(grupo,'planta_!presion_deposito'); %Presión del depósito
RefCaudalCaliente=additem(grupo,'planta_!RefCaudalCaliente'); %Referencia del caudal
caliente
RefCaudalFrio=additem(grupo,'planta_!RefCaudalFrio'); %Referencia del caudal frío
RefCaudalRecir=additem(grupo,'planta_!RefCaudalRecirculacion'); %Referencia del caudal de
recirculación
RefNivel=additem(grupo,'planta_!RefNivel'); %Referencia del nivel del depósito
RefRatio=additem(grupo,'planta_!RefNivProporcion'); %Referencia de proporción de agua de
entrada
RefTemp=additem(grupo,'planta_!RefTempDeposito'); %Referencia de temperatura del
depósito
Pag.142
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
Resistencia=additem(grupo,'planta_!RESISTENCIA_MAT'); %Resistencia del interior del
depósito (orden de marcha)
ResistenciaPWM=additem(grupo,'planta_!PWM_RESISTENCIA_MAT'); %Modulación por
ancho de pulsos de la resistencia
ResTermo=additem(grupo,'planta_!TERMO_MAT'); %Grupo caliente (orden de marcha)
TempCaliente=additem(grupo,'planta_!tem_caliente'); %Temperatura de agua caliente
TempFria=additem(grupo,'planta_!tem_fria'); %Temperatura de agua fría
TempSalida=additem(grupo,'planta_!tem_salida'); %Temperatura de saliente del depositos
TempRecir=additem(grupo,'planta_!tem_recirculacion'); %Temperatura de agua recirculante
TempDeposito=additem(grupo,'planta_!tem_deposito'); %Temperatura del agua del depósito
ValvulaCaliente=additem(grupo,'planta_!VAL_CALIENTE_MAT'); %Válvula de agua caliente V4
ValvulaFria=additem(grupo,'planta_!VAL_FRIA_MAT'); %Válvula de agua fría V5
ValvulaRecir=additem(grupo,'planta_!VAL_RECIRCULACION_MAT'); %Valvula de agua de
recirculación V8
MARCHA=additem(grupo,'planta_!Modo_Auto_M'); %Modo automático en marcha
PARADA=additem(grupo,'planta_!Modo_Auto_P'); %Modo automático en parada
%Nombre corto
% AUX_A=AuxMat1;
% AUX_B=AuxMat2;
% AUX_C=AuxMat3;
% AUX_D=AuxMat4;
% AUX_E=AuxMat5;
% B1=BombaAlim;
% B1C=BombaAlimConf;
% B2=BombaRecir;
% B2C=BombaRecirConf;
% FT1=CaudalCaliente;
% FT2=CaudalFrio;
% FT3=CaudalSalida;
% FT4=CaudalRecir;
% LT1=Nivel;
% PT1=Presion;
% PWM=ResistenciaPWM;
% RES=Resistencia;
% TERMO=Termo;
% TT1=TempCaliente;
% TT2=TempFria;
% TT3=TempSalida;
% TT4=TempRecir;
% TT5=TempDeposito;
% V4=ValvulaCaliente;
% V5=ValvulaFria;
% V8=ValvulaRecir
%Apertura de la interfaz con el usuario.
gui_mat;
Archivo desconectar.m
Con el ejecutable desconectar, descrito en este archivo, se eliminan las variables
globales y la conexión creada en los dos archivos anteriores (conectar y control_planta).
El código del archivo se ejecuta al pulsar el botón “salir” de la interfaz gráfica. También
puede cerrarse la ventana para mantener las variables y la conexión, y ejecutarse
manualmente más tarde.
%Eliminacion de variables y desconexión de OPC:
Pag.143
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
%Grupo
global da grupo;
%Variables de entrada (sensores)
global FT1 FT2 FT3 FT4 LT1 PT1 TT1 TT2 TT3 TT4 TT5;
%Variables de salida (actuadores)
global B1 B2 V4 V5 V8 PWM RES TERMO;
%Variables de referencia
global FC1 FC2 FC4 LC1 TC5 Ratio;
%Variables definidas por el usuario
global AUX_A AUX_B AUX_C AUX_D AUX_E;
%Señales
global MARCHA PARADA;
%Intermedias
global AuxMat1 AuxMat2 AuxMat3 AuxMat4 AuxMat5;
global BombaAlim BombaAlimConf BombaRecir BombaRecirConf;
global CaudalCaliente CaudalFrio CaudalSalida CaudalRecir;
global NivelDeposito PresionDeposito;
global RefCaudalCaliente RefCaudalFrio RefCaudalRecir;
global RefNivel RefRatio RefTemp;
global Resistencia ResistenciaPWM ResTermo;
global ValvulaCaliente ValvulaFria ValvulaRecir;
global TempCaliente TempFria TempSalida TempRecir TempDeposito;
%Propias de la aplicación
global FuncionControl NumeroCiclos TiempoCiclo ArchivoDeExcel;
global VarExcel niterexcel;
%Variables de entrada (sensores)
clear global B1C B2C FT1 FT2 FT3 FT4 LT1 PT1 TT1 TT2 TT3 TT4 TT5;
%Variables de salida (actuadores)
clear global B1 B2 V4 V5 V8 PWM RES TERMO;
%Variables de referencia
clear global FC1 FC2 FC4 LC1 TC5 Ratio;
%Variables definidas por el usuario
clear global AUX_A AUX_B AUX_C AUX_D AUX_E;
%Señales
clear global MARCHA PARADA;
%Intermedias
clear global AuxMat1 AuxMat2 AuxMat3 AuxMat4 AuxMat5;
clear global BombaAlim BombaAlimConf BombaRecir BombaRecirConf;
clear global CaudalCaliente CaudalFrio CaudalSalida CaudalRecir;
clear global NivelDeposito PresionDeposito;
clear global RefCaudalCaliente RefCaudalFrio RefCaudalRecir;
clear global RefNivel RefRatio RefTemp;
clear global Resistencia ResistenciaPWM ResTermo;
clear global ValvulaCaliente ValvulaFria ValvulaRecir;
clear global TempCaliente TempFria TempSalida TempRecir TempDeposito;
%Propias de la aplicación
clear global FuncionControl NumeroCiclos TiempoCiclo ArchivoDeExcel;
clear global VarExcel niterexcel;
%Grupo
disconnect(da);
clear global da grupo;
Archivo gui_mat.m
Este es el archivo asociado a la interfaz gráfica, y por lo tanto el más largo. En él
se describen los procedimientos al crear y modificar cada elemento de control (casillas
Pag.144
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
de verificación, campos de texto y botones). Parte de las funciones aquí mostradas se
crean automáticamente al durante la edición de la interfaz gráfica (ver ayuda
relacionada con el editor GUIDE de MATLAB).
function varargout = gui_mat(varargin)
% GUI_MAT M-file for gui_mat.fig
%
GUI_MAT, by itself, creates a new GUI_MAT or raises the existing
%
singleton*.
%
%
H = GUI_MAT returns the handle to a new GUI_MAT or the handle to
%
the existing singleton*.
%
%
GUI_MAT('CALLBACK',hObject,eventData,handles,...) calls the local
%
function named CALLBACK in GUI_MAT.M with the given input arguments.
%
%
GUI_MAT('Property','Value',...) creates a new GUI_MAT or raises the
%
existing singleton*. Starting from the left, property value pairs are
%
applied to the GUI before gui_mat_OpeningFunction gets called. An
%
unrecognized property name or invalid value makes property application
%
stop. All inputs are passed to gui_mat_OpeningFcn via varargin.
%
%
*See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
%
instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help gui_mat
% Last Modified by GUIDE v2.5 08-May-2010 19:03:35
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @gui_mat_OpeningFcn, ...
'gui_OutputFcn', @gui_mat_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before gui_mat is made visible.
function gui_mat_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to gui_mat (see VARARGIN)
% Choose default command line output for gui_mat
handles.output = hObject;
Pag.145
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes gui_mat wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = gui_mat_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% Salir: Al pulsar el botón
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close(gcbf);
desconectar;
% Ayuda: Al pulsar el botón:
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
pause on;
ayuda;
%Aquí tengo que llamar a la función de ayuda.
% Ejecutar: Al pulsar el botón:
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%Variables globales
%Variables de entrada (sensores)
global FT1 FT2 FT3 FT4 LT1 PT1 TT1 TT2 TT3 TT4 TT5;
%Variables de salida (actuadores)
global B1 B2 V4 V5 V8 PWM RES TERMO;
%Variables de referencia
global FC1 FC2 FC4 LC1 TC5 Ratio;
%Variables definidas por el usuario
global AUX_A AUX_B AUX_C AUX_D AUX_E;
%Señales
global MARCHA PARADA;
%Intermedias
global AuxMat1 AuxMat2 AuxMat3 AuxMat4 AuxMat5;
Pag.146
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
global BombaAlim BombaAlimConf BombaRecir BombaRecirConf;
global CaudalCaliente CaudalFrio CaudalSalida CaudalRecir;
global NivelDeposito PresionDeposito;
global RefCaudalCaliente RefCaudalFrio RefCaudalRecir;
global RefNivel RefRatio RefTemp;
global Resistencia ResistenciaPWM ResTermo;
global TempCaliente TempFria TempSalida TempRecir TempDeposito;
global ValvulaCaliente ValvulaFria ValvulaRecir;
%Propias de la aplicación
global FuncionControl NumeroCiclos TiempoCiclo ArchivoDeExcel;
global VarExcel niterexcel;
%Variables locales intermedias:
FT1_=0;
FT2_=0;
FT3_=0;
FT4_=0;
LT1_=0;
TT1_=0;
TT2_=0;
TT3_=0;
TT4_=0;
TT5_=0;
PT1_=0;
B1_=0;
B2_=0;
%Compruebo que la función es válida
if (length(FuncionControl) == 0);
disp('Debe especificar una función de control.')
return
end
%Compruebo si hay que mandar un histórico a excel
if (length(ArchivoDeExcel) > 0)
[TIPO, HOJAS]=XLSFINFO(ArchivoDeExcel);
if (strcmp(TIPO,'Microsoft Excel Spreadsheet'))
historiar=1;
[i, NumHojas]=size(HOJAS);
HOJA=NumHojas+1;
clear i NumHojas;
else
disp('El archivo de Excel indicado no se puede abrir.');
disp('Los resultados no se guardarán.');
historiar=0;
end
clear TIPO NumHojas;
else
historiar=0;
end
%Ciclo de inicialización:
continuar=0;
%Esperando a la señal para empezar.
while(continuar==0)
AutoParada=read(PARADA);
AutoMarcha=read(MARCHA);
if (AutoParada.Value)
pause(0.01);
else
if (AutoMarcha.Value)
Pag.147
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
continuar=1;
else
disp('La planta debe estar en modo automático para poder controlarla');
disp('desde MATLAB. Pase al modo Parada de configuración o Ensayo');
disp('en marcha y vuelva a intentarlo.');
disp('');
disp('Ejecución abortada');
return;
end
end
end
clear continuar;
%Lectura
lectura=read(AuxMat1);
AUX_A=lectura.Value;
lectura=read(AuxMat2);
AUX_B=lectura.Value;
lectura=read(AuxMat3);
AUX_C=lectura.Value;
lectura=read(AuxMat4);
AUX_D=lectura.Value;
lectura=read(AuxMat5);
AUX_E=lectura.Value;
lectura=read(BombaAlimConf);
B1=lectura.Value;
lectura=read(BombaRecirConf);
B2=lectura.Value;
lectura=read(CaudalCaliente);
FT1=lectura.Value;
lectura=read(RefCaudalCaliente);
FC1=lectura.Value;
lectura=read(CaudalFrio);
FT2=lectura.Value;
lectura=read(RefCaudalFrio);
FC2=lectura.Value;
lectura=read(CaudalSalida);
FT3=lectura.Value;
lectura=read(CaudalRecir);
FT4=lectura.Value;
lectura=read(RefCaudalRecir);
FC4=lectura.Value;
lectura=read(NivelDeposito);
LT1=lectura.Value;
lectura=read(RefNivel);
LC1=lectura.Value;
lectura=read(PresionDeposito);
PT1=lectura.Value;
lectura=read(RefRatio);
Ratio=lectura.Value;
lectura=read(Resistencia);
RES=lectura.Value;
lectura=read(ResistenciaPWM);
PWM=lectura.Value;
lectura=read(ResTermo);
TERMO=lectura.Value;
lectura=read(TempCaliente);
TT1=lectura.Value;
lectura=read(TempFria);
TT2=lectura.Value;
Pag.148
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
lectura=read(TempSalida);
TT3=lectura.Value;
lectura=read(TempRecir);
TT4=lectura.Value;
lectura=read(TempDeposito);
TT5=lectura.Value;
lectura=read(RefTemp);
TC5=lectura.Value;
lectura=read(ValvulaCaliente);
V4=lectura.Value;
lectura=read(ValvulaFria);
V5=lectura.Value;
lectura=read(ValvulaRecir);
V8=lectura.Value;
%Inicio de la función de control
VariableInterna=feval(FuncionControl,'inicio');
%Inicio de excel
if (historiar==1)
t=lectura.TimeStamp;
contiterexcel=0;
Linea={'Año' 'Mes' 'Día' 'Hora' 'Minuto' 'Segundo'};
xlswrite(ArchivoDeExcel, {'Título del Ensayo:'}, HOJA, 'A1');
xlswrite(ArchivoDeExcel, {'Inicio:'}, HOJA, 'A3');
xlswrite(ArchivoDeExcel, t, HOJA, 'B3');
xlswrite(ArchivoDeExcel, Linea, HOJA, 'B4');
fil=7;
Linea2=[];
Linea3={};
if(VarExcel(1))
Linea2={'Inicio'};
Linea3=[{''};{''};{'Tiempo(s)'}];
end
if(VarExcel(2))
Linea2=[Linea2 FT1];
Linea3=[Linea3 [{''};{''};{'Caudal Agua Caliente (l/min)'}]];
end
if(VarExcel(3))
Linea2=[Linea2 FT2];
Linea3=[Linea3 [{''};{''};{'Caudal Agua Fria (l/min)'}]];
end
if(VarExcel(4))
Linea2=[Linea2 FT3];
Linea3=[Linea3 [{''};{''};{'Caudal Agua Salida (l/min)'}]];
end
if(VarExcel(5))
Linea2=[Linea2 FT4];
Linea3=[Linea3 [{''};{''};{'Caudal Agua Recirculación (l/min)'}]];
end
if(VarExcel(6))
Linea2=[Linea2 LT1];
Linea3=[Linea3 [{''};{''};{'Nivel (cm)'}]];
end
if(VarExcel(7))
Linea2=[Linea2 TT1];
Linea3=[Linea3 [{''};{''};{'Temperatura Agua Caliente (ºC)'}]];
end
if(VarExcel(8))
Linea2=[Linea2 TT2];
Linea3=[Linea3 [{''};{''};{'Temperatura Agua Fría (ºC)'}]];
Pag.149
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
end
if(VarExcel(9))
Linea2=[Linea2 TT3];
Linea3=[Linea3 [{''};{''};{'Temperatura Agua Salida (ºC)'}]];
end
if(VarExcel(10))
Linea2=[Linea2 TT4];
Linea3=[Linea3 [{''};{''};{'Temperatura Agua Recirculación (ºC)'}]];
end
if(VarExcel(11))
Linea2=[Linea2 TT5];
Linea3=[Linea3 [{''};{''};{'Temperatura Agua Depósito (ºC)'}]];
end
if(VarExcel(12))
Linea2=[Linea2 PT1];
Linea3=[Linea3 [{''};{''};{'Presión Depósito (bar)'}]];
end
if(VarExcel(13))
Linea2=[Linea2 V4];
Linea3=[Linea3 [{''};{''};{'Válvula Agua Caliente (%)'}]];
end
if(VarExcel(14))
Linea2=[Linea2 V5];
Linea3=[Linea3 [{''};{''};{'Válvula Agua Fría (%)'}]];
end
if(VarExcel(15))
Linea2=[Linea2 V8];
Linea3=[Linea3 [{''};{''};{'Válvula Agua Recirculación (%)'}]];
end
if(VarExcel(16))
Linea2=[Linea2 PWM];
Linea3=[Linea3 [{''};{''};{'Anchura de Pulsos PWM (%)'}]];
end
if(VarExcel(17))
Linea2=[Linea2 AUX_A];
Linea3=[Linea3 [{''};{''};{'Variable auxiliar A'}]];
end
if(VarExcel(18))
Linea2=[Linea2 AUX_B];
Linea3=[Linea3 [{''};{''};{'Variable auxiliar B'}]];
end
if(VarExcel(19))
Linea2=[Linea2 AUX_C];
Linea3=[Linea3 [{''};{''};{'Variable auxiliar C'}]];
end
if(VarExcel(20))
Linea2=[Linea2 AUX_D];
Linea3=[Linea3 [{''};{''};{'Variable auxiliar D'}]];
end
if(VarExcel(21))
Linea2=[Linea2 AUX_E];
Linea3=[Linea3 [{''};{''};{'Variable auxiliar E'}]];
end
if(VarExcel(22))
Linea2=[Linea2 B1];
Linea3=[Linea3 [{''};{''};{'Bomba Alimentación'}]];
end
if(VarExcel(23))
Linea2=[Linea2 B2];
Linea3=[Linea3 [{''};{''};{'Bomba Recirculación'}]];
Pag.150
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
end
if(VarExcel(24))
Linea2=[Linea2 RES];
Linea3=[Linea3 [{''};{''};{'Resistencia Depósito'}]];
end
if(VarExcel(25))
Linea2=[Linea2 TERMO];
Linea3=[Linea3 [{''};{''};{'Resistencia Grupo Termo'}]];
end
Linea=Linea3(3,:);
Linea3(1,1)={'Viene de la página anterior'};
col=length(Linea);
xlswrite(ArchivoDeExcel, Linea, HOJA, celda(6,1));
xlswrite(ArchivoDeExcel, Linea2, HOJA, celda(7,1));
clear Linea2;
Linea=zeros(1,col);
end
tic;
contciclos=0;
%Todos los demás ciclos:
while((NumeroCiclos<=0) || (contciclos<NumeroCiclos))
contciclos=contciclos+1;
%Lectura
lectura=read(AuxMat1);
AUX_A=lectura.Value;
lectura=read(AuxMat2);
AUX_B=lectura.Value;
lectura=read(AuxMat3);
AUX_C=lectura.Value;
lectura=read(AuxMat4);
AUX_D=lectura.Value;
lectura=read(AuxMat5);
AUX_E=lectura.Value;
lectura=read(BombaAlimConf);
B1=lectura.Value;
lectura=read(BombaRecirConf);
B2=lectura.Value;
lectura=read(CaudalCaliente);
FT1=lectura.Value;
lectura=read(CaudalFrio);
FT2=lectura.Value;
lectura=read(CaudalSalida);
FT3=lectura.Value;
lectura=read(CaudalRecir);
FT4=lectura.Value;
lectura=read(NivelDeposito);
LT1=lectura.Value;
lectura=read(PresionDeposito);
PT1=lectura.Value;
lectura=read(Resistencia);
RES=lectura.Value;
lectura=read(ResistenciaPWM);
PWM=lectura.Value;
lectura=read(ResTermo);
TERMO=lectura.Value;
lectura=read(TempCaliente);
TT1=lectura.Value;
Pag.151
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
lectura=read(TempFria);
TT2=lectura.Value;
lectura=read(TempSalida);
TT3=lectura.Value;
lectura=read(TempRecir);
TT4=lectura.Value;
lectura=read(TempDeposito);
TT5=lectura.Value;
lectura=read(ValvulaCaliente);
V4=lectura.Value;
lectura=read(ValvulaFria);
V5=lectura.Value;
lectura=read(ValvulaRecir);
V8=lectura.Value;
AutoMarcha=read(MARCHA);
%Valor original de las variables de sólo lectura
t=toc;
FT1_=FT1;
FT2_=FT2;
FT3_=FT3;
FT4_=FT4;
LT1_=LT1;
TT1_=TT1;
TT2_=TT2;
TT3_=TT3;
TT4_=TT4;
TT5_=TT5;
PT1_=PT1;
B1_=B1;
B2_=B2;
%Llamada a la función de control
VariableInterna=feval(FuncionControl, VariableInterna);
%Escritura
write(AuxMat1, AUX_A);
write(AuxMat2, AUX_B);
write(AuxMat3, AUX_C);
write(AuxMat4, AUX_D);
write(AuxMat5, AUX_E);
write(BombaAlim, B1);
write(BombaRecir, B2);
write(RefCaudalCaliente,FC1)
write(RefCaudalFrio,FC2);
write(RefCaudalRecir,FC4);
write(RefNivel,LC1);
write(RefTemp,TC5);
write(RefRatio,Ratio);
write(Resistencia, RES);
write(ResTermo, TERMO);
write(ValvulaCaliente, V4);
write(ValvulaFria, V5);
write(ValvulaRecir, V8);
write(ResistenciaPWM, PWM);
%Excel
if (historiar==1)
contiterexcel=contiterexcel+1;
if (contiterexcel>=niterexcel)
Pag.152
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
contiterexcel=0;
fil=fil+1;
if (fil>=65536)
xlswrite(ArchivoDeExcel, 'Sigue en la próxima página', HOJA, A65536);
HOJA=HOJA+1;
xlswrite(ArchivoDeExcel, Linea3, HOJA, A1);
fil=4;
end
col=0;
if(VarExcel(1))
col=col+1;
Linea(col)=t;
end
if(VarExcel(2))
col=col+1;
Linea(col)=FT1_;
end
if(VarExcel(3))
col=col+1;
Linea(col)=FT2_;
end
if(VarExcel(4))
col=col+1;
Linea(col)=FT3_;
end
if(VarExcel(5))
col=col+1;
Linea(col)=FT4_;
end
if(VarExcel(6))
col=col+1;
Linea(col)=LT1_;
end
if(VarExcel(7))
col=col+1;
Linea(col)=TT1_;
end
if(VarExcel(8))
col=col+1;
Linea(col)=TT2_;
end
if(VarExcel(9))
col=col+1;
Linea(col)=TT3_;
end
if(VarExcel(10))
col=col+1;
Linea(col)=TT4_;
end
if(VarExcel(11))
col=col+1;
Linea(col)=TT5_;
end
if(VarExcel(12))
col=col+1;
Linea(col)=PT1_;
end
if(VarExcel(13))
col=col+1;
Linea(col)=V4;
Pag.153
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
end
if(VarExcel(14))
col=col+1;
Linea(col)=V5;
end
if(VarExcel(15))
col=col+1;
Linea(col)=V8;
end
if(VarExcel(16))
col=col+1;
Linea(col)=PWM;
end
if(VarExcel(17))
col=col+1;
Linea(col)=AUX_A;
end
if(VarExcel(18))
col=col+1;
Linea(col)=AUX_B;
end
if(VarExcel(19))
col=col+1;
Linea(col)=AUX_C;
end
if(VarExcel(20))
col=col+1;
Linea(col)=AUX_D;
end
if(VarExcel(21))
col=col+1;
Linea(col)=AUX_E;
end
if(VarExcel(22))
col=col+1;
Linea(col)=B1_;
end
if(VarExcel(23))
col=col+1;
Linea(col)=B2_;
end
if(VarExcel(24))
col=col+1;
Linea(col)=RES;
end
if(VarExcel(25))
col=col+1;
Linea(col)=TERMO;
end
xlswrite(ArchivoDeExcel, Linea, HOJA, celda(fil,1));
end
end
%Salida del bucle y de la función
if (AutoMarcha.Value==0)
disp('El modo automático ya no está en marcha');
disp('Saliendo de la función');
return
end
Pag.154
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
%Espera de sincronización
while (toc<(TiempoCiclo*contciclos))
AutoMarcha=read(MARCHA);
if (AutoMarcha.Value==0)
disp('El modo automático ya no está en marcha');
disp('Saliendo de la función');
return
end
end
end
% Función de control: Al cambiar el texto
function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
%
str2double(get(hObject,'String')) returns contents of edit1 as a double
global FuncionControl;
FuncionControl = get(hObject,'String');
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
global FuncionControl;
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'String','');
FuncionControl = '';
% Tiempo de ciclo: Al cambiar el texto
function edit2_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit2 as text
%
str2double(get(hObject,'String')) returns contents of edit2 as a double
global TiempoCiclo;
TiempoCiclo = str2double(get(hObject,'String'));
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
Pag.155
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
% Hint: edit controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
global TiempoCiclo;
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'String','1');
TiempoCiclo = 1;
% Número de ciclos: Al cambiar el texto
function edit3_Callback(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit3 as text
%
str2double(get(hObject,'String')) returns contents of edit3 as a double
global NumeroCiclos;
NumeroCiclos = str2double(get(hObject,'String'));
% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
global NumeroCiclos;
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'String','0');
NumeroCiclos=0;
% Archivo de Excel: Al cambiar el texto
function edit4_Callback(hObject, eventdata, handles)
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit4 as text
%
str2double(get(hObject,'String')) returns contents of edit4 as a double
global ArchivoDeExcel;
ArchivoDeExcel=get(hObject,'String');
% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
Pag.156
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
% Hint: edit controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
global ArchivoDeExcel;
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'String','');
ArchivoDeExcel='';
function edit5_Callback(hObject, eventdata, handles)
% hObject handle to edit5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit5 as text
%
str2double(get(hObject,'String')) returns contents of edit5 as a double
global niterexcel;
niterexcel=str2double(get(hObject,'String'));
% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
global niterexcel;
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'string',1);
niterexcel=1;
% --- Executes on button press in checkbox_t.
function checkbox_t_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_t (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_t
global VarExcel;
VarExcel(1)=get(hObject,'Value');
% --- Executes on button press in checkbox_FT1.
function checkbox_FT1_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_FT1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_FT1
global VarExcel;
VarExcel(2)=get(hObject,'Value');
Pag.157
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
% --- Executes on button press in checkbox_FT2.
function checkbox_FT2_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_FT2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_FT2
global VarExcel;
VarExcel(3)=get(hObject,'Value');
% --- Executes on button press in checkbox_FT3.
function checkbox_FT3_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_FT3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_FT3
global VarExcel;
VarExcel(4)=get(hObject,'Value');
% --- Executes on button press in checkbox_FT4.
function checkbox_FT4_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_FT4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_FT4
global VarExcel;
VarExcel(5)=get(hObject,'Value');
% --- Executes on button press in checkbox_LT1.
function checkbox_LT1_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_LT1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_LT1
global VarExcel;
VarExcel(6)=get(hObject,'Value');
% --- Executes on button press in checkbox_TT1.
function checkbox_TT1_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_TT1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_TT1
global VarExcel;
VarExcel(7)=get(hObject,'Value');
% --- Executes on button press in checkbox_TT2.
function checkbox_TT2_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_TT2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_TT2
global VarExcel;
VarExcel(8)=get(hObject,'Value');
Pag.158
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
% --- Executes on button press in checkbox_TT3.
function checkbox_TT3_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_TT3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_TT3
global VarExcel;
VarExcel(9)=get(hObject,'Value');
% --- Executes on button press in checkboxTT4.
function checkboxTT4_Callback(hObject, eventdata, handles)
% hObject handle to checkboxTT4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkboxTT4
global VarExcel;
VarExcel(10)=get(hObject,'Value');
% --- Executes on button press in checkboxTT5.
function checkboxTT5_Callback(hObject, eventdata, handles)
% hObject handle to checkboxTT5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkboxTT5
global VarExcel;
VarExcel(11)=get(hObject,'Value');
% --- Executes on button press in checkbox_PT1.
function checkbox_PT1_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_PT1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_PT1
global VarExcel;
VarExcel(12)=get(hObject,'Value');
% --- Executes on button press in checkbox_V4.
function checkbox_V4_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_V4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_V4
global VarExcel;
VarExcel(13)=get(hObject,'Value');
% --- Executes on button press in checkbox_V5.
function checkbox_V5_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_V5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_V5
global VarExcel;
VarExcel(14)=get(hObject,'Value');
Pag.159
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
% --- Executes on button press in checkbox_V8.
function checkbox_V8_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_V8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_V8
global VarExcel;
VarExcel(15)=get(hObject,'Value');
% --- Executes on button press in checkbox_PWM.
function checkbox_PWM_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_PWM (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_PWM
global VarExcel;
VarExcel(16)=get(hObject,'Value');
% --- Executes on button press in checkbox_A.
function checkbox_A_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_A (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_A
global VarExcel;
VarExcel(17)=get(hObject,'Value');
% --- Executes on button press in checkbox_B.
function checkbox_B_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_B (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_B
global VarExcel;
VarExcel(18)=get(hObject,'Value');
% --- Executes on button press in checkbox_C.
function checkbox_C_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_C (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_C
global VarExcel;
VarExcel(19)=get(hObject,'Value');
% --- Executes on button press in checkbox_D.
function checkbox_D_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_D (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_D
global VarExcel;
VarExcel(20)=get(hObject,'Value');
Pag.160
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
% --- Executes on button press in checkbox_E.
function checkbox_E_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_E (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_E
global VarExcel;
VarExcel(21)=get(hObject,'Value');
% --- Executes on button press in checkbox_B1.
function checkbox_B1_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_B1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_B1
global VarExcel;
VarExcel(22)=get(hObject,'Value');
% --- Executes on button press in checkbox_B2.
function checkbox_B2_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_B2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_B2
global VarExcel;
VarExcel(23)=get(hObject,'Value');
% --- Executes on button press in checkbox_RES.
function checkbox_RES_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_RES (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_RES
global VarExcel;
VarExcel(24)=get(hObject,'Value');
% --- Executes on button press in checkbox_TERMO.
function checkbox_TERMO_Callback(hObject, eventdata, handles)
% hObject handle to checkbox_TERMO (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox_TERMO
global VarExcel;
VarExcel(25)=get(hObject,'Value');
Archivo plantilla.m
Este archivo no se utiliza en la programación de la interfaz gráfica ni en la
conexión con OPC. El archivo se suministra como plantilla para que el usuario cree sus
propias funciones de control con mayor facilidad.
function Salida=plantilla(Entrada)
Pag.161
Programación y Supervisión de Planta Piloto Utilizada como Plataforma de Ensayo de Controladores Diseñados en MATLAB
%Variables de entrada (sensores)
global FT1 FT2 FT3 FT4 LT1 PT1 TT1 TT2 TT3 TT4 TT5;
%Variables de salida (actuadores)
global B1 B2 V4 V5 V8 PWM RES TERMO;
%Variables definidas por el usuario
global AUX_A AUX_B AUX_C AUX_D AUX_E;
if (ischar(Entrada)) %Entrada es una cadena de caracteres
if(strcmp(Entrada,'inicio'))
%Inicializar el algoritmo aquí
Salida=[]; %Asociar un valor a Salida
else
error('Entrada no válida');
end
else
%Escribir el algoritmo de control aquí
%Dar valores a B1, B2, V4, V5, V8, RES, PWM y/o TERMO
%Actualizar el valor de Salida para usarlo como siguiente Entrada
Salida=Entrada; %Sustituir por la que será la próxima entrada
end
Pag.162
Descargar