CAPÍTULO 3. OPTIMAX 32
CAPÍTULO 3
OPTIMAX
3.1.- Introducción
En este capítulo se va a describir la herramienta software denominada
OPTIMAX.
El capítulo comienza con una breve reseña histórica del programa, porqué
cúando y cómo fue creado, continúa con la descripción del mismo, englobando en este
subcapítulo las características funcionales del OPTIMAX. A continuación se describe la
sección de las comunicaciones vía OPC, seguida de las descripciones del analizador
léxico y sintáctico. Por último se detalla e ilustra con gráficas el manual de usuario.
3.2.- Historia. Objetivos del OPTIMAX
La programación de OPTIMAX se inicia entre 1997 y 1998 en el marco de un
proyecto de investigación realizado entre Procisa y la Universidad de Sevilla (más
concretamente el grupo de control predictivo). Inicialmente trabajan Eduardo F.
Camacho y Carlos Bordóns en la gestión y dirección del proyecto y Daniel Rodríguez y
Daniel Limón en la programación del software.
CAPÍTULO 3. OPTIMAX 33
Para esta programación se partió de un programa en C publicado en el libro
Model Predictive Control in the Process Industry de E.F. Camacho y C. Bordons. Dicho
programa es una implementación del algoritmo GPC realizándose la optimización
mediante el algoritmo de Lemke, tal y como se recogía en un articulo de E.F. Camacho
publicado en la revista IEEE Transactions on Automatic Control en 1994. El primer
paso fue incorporar este algoritmo en un programa para Windows NT 4.0. Al ser para
Windows NT, el programa podía ser multienhebrado, de manera que el controlador
corre en un subproceso (con mas prioridad además) aparte del que gestiona la interfaz
por ejemplo.
Tras una primera fase, se incorpora en tareas de programación José Miguel
Cañete, que trabaja principalmente en el aspecto gráfico del programa. Tras la marcha
de este último, el equipo anterior continúa con el desarrollo a lo largo de los dos años
siguientes. En estos dos años se incorpora al programa la estrategia de compensación de
retardos basada en el predictor de Smith desarrollada en la tesis de Julio Normey. En
1999, con un OPTIMAX (todavía no se llamaba de esa manera) muy parecido ya al
actual, Daniel Rodríguez y Daniel Limón se apartan de las tareas de programación
siendo relevados por Amparo Núñez Reyes (que siempre había apoyado en la gestión de
CUBE) y José Ramos Cueli.
En los tres siguientes años, Amparo Núñez R. y Jose Ramos C. llevan a cabo
diversas modificaciones del programa, dónde cabe destacar la introducción de las
perturbaciones medibles del controlador. El programa es testeado y corregido
exhaustivamente, además es probado en entornos industriales como por ejemplo, en
una almazara de aceite de oliva y en una planta solar.
Finalmente en 2003, dentro del marco del proyecto europeo NEOXITE (Next
gEneration Open Control System InterneT trEady) Daniel Rodríguez y Daniel Limón
vuelven a primera línea para colaborar en las modificaciones del programa.
En este proyecto, Amparo Núñez R., implementa la parte de comunicaciones del
OPTIMAX, sustituyendo el interfaz propio del propietario CUBE, por el estándar OPC
(Ole for Process Control). Cuya idea básica radica en normalizar el interfaz entre el
servidor y el cliente OPC, independientemente del fabricante del sistema.
CAPÍTULO 3. OPTIMAX 34
Así el OPTIMAX se convierte en una herramienta flexible y abierta para el
control multivariable de procesos industriales, pudiendo acceder a todos los
componentes que estén conectados en red por medio de un bus de campo o Ethernet,
mediante el servidor OPC.
3.3.- Descripción del programa
3.3.1.- Descripción de la aplicación
La aplicación denominada: OPTIMAX consiste en un paquete software
desarrollado bajo el lenguaje de programación Visual C++ (versión 6.0). El programa,
se basa en una aplicación MDI (Multiple Document Interface), donde se administran
múltiples documentos al mismo tiempo gestionados en ventanas individuales del área de
trabajo de la ventana principal.
En concreto, la aplicación MDI, la constituyen tres plantillas o templates, una
de ellas es la principal y las otras dos son hijas de la anterior. Las tres plantillas están
asociadas al mismo documento: “CSIMGPCWApp” y en cada una de ellas se
implementa el marco o ventana y la vista.
La plantilla principal está formada por las variables de procesos
(“CChildFrame”), y las plantillas hijas están constituidas a su vez por los actuadores
(“CChFramAct”) y el centro de control (“CChFramTabla”). La plantilla de las señales
(variable de procesos y actuadores), representan ventanas gráficas donde se muestran la
evolución temporal de las señales pertinentes, así como los valores de las restricciones y
referencias, estas ventanas tienen la posibilidad de cambiar de escala ‘on-line’, desde el
menú principal. En la plantilla del centro de control, se muestran los valores actuales de
las señales, variables de proceso, actuadores, referencias, restricciones e históricos de
las señales. Desde esta ventana es posible modificar una serie de parámetros sin
necesidad de parar el experimento, por ejemplo, el valor de las restricciones, tanto de
salida como de entrada y su amplitud, también es posible cambiar el valor del esfuerzo
de control (lambda).
La aplicación es multihebra, es decir, contiene varías vías de ejecución
paralela, en concreto dos, una hebra referente a la aplicación en sí y una segunda hebra
CAPÍTULO 3. OPTIMAX 35
que corresponde al proceso del controlador, que se ejecuta cada tiempo de muestreo.
Para realizar una aplicación multihebra es necesario tener en cuenta unas
consideraciones adicionales a la hora de la implementación del programa:
• Cada hebra supone una carga adicional al sistema,
• El diseño de aplicaciones multihebra es complejo.
• La depuración de las aplicaciones es difícil.
• Las hebras han de coordinarse de algún modo.
Como se ha mencionado anteriormente, es necesario asignar prioridades a las
diferentes hebras del programa. En nuestra aplicación, la hebra con mayor prioridad
corresponde al proceso donde se ha implementado el controlador GPC
(“mainsimulador”).
3.3.2.- Controlador El controlador desarrollado en el OPTIMAX es un Control Predictivo
Generalizado (GPC) más un compensador de retardo denominado Predictor de Smith
con un filtro paso bajo.
Así el esquema que se utiliza en OPTIMAX es:
Figura 3.1 – Diagrama de bloques de OPTIMAX
Para ver una descripción de las distintas estrategias de control utilizadas por el
OPTIMAX, GPC, predictor de Smith y filtro paso bajo, consultar el Apéndice C.
CAPÍTULO 3. OPTIMAX 36
3.3.3.- Comunicación vía OPC.
El paquete software, denominado OPTIMAX, se comunica con el exterior
mediante el interfaz estándar OPC (Ole for Process Control). Se han implementado las
clases pertinentes, para que la aplicación que nos ocupa, desempeñe las veces de un
cliente OPC. El SCADA CUBE, posee un servidor OPC, el cual ofrece a los clientes
las variables de la base de dato del sistema. Nuestro controlador actúa como cliente
OPC, pudiendo solicitar las variables de proceso convenientes y escribir el valor de las
variables de actuación cuando el controlador así lo determine.
Para la implementación del cliente OPC en el OPTIMAX, se han utilizado
librerías comerciales de Softing, denominadas: OPC Toolbox C++ versión 3.1.
La herramienta OPC Toolbox C++, proporciona determinadas clases en C++,
que ayudan al programador a generar aplicaciones de servidores y clientes OPC,
concentrándose solo en el proceso de la comunicación de los datos, sin necesidad de
profundizar en detalles de la programación a bajo nivel.
Las herramientas C++ de OPC, tiene una estructura modular y pueden dividirse
como sigue:
Module Description SOCmn General basic classes SOSrv OPC Server basic classes SODaS OPC Data Access Server classes SOAeS OPC Alarms and Event Server classes SOAsS Classes for the implementation of an OPC Data Access and an OPC Alarms
and Event Server SOClt OPC Client basic classes SODaC OPC Data Access Client classes SOAeC OPC Alarms and Event Client classes
El paquete software OPC Data Access Client Development Toolkit desarrollado
por Softing, puede usarse para acceder a cualquier servidor OPC Data Access de la
versión 1.0A, 2.05 y 3.0. Además no requiere que la aplicación cliente tenga una
estructura específica, las librerías se pueden usar en aplicaciones de Window GUI,
aplicaciones de consola y en otros tipos de aplicaciones Win32. Las librerías de Softing,
CAPÍTULO 3. OPTIMAX 37
permiten que una aplicación cliente pueda acceder simultáneamente a diferentes
servidores OPC. Cada comunicación con un servidor se maneja con una hebra diferente.
Figura 3.2 – Comunicación con servidores
Un OPC DA Server permite el acceso de múltiples clientes a la vez, a los
valores del proceso del sistema. Los clientes pueden leer y escribir estos valores
síncrona o asíncronamente. Además los clientes también pueden recibir una notificación
cuando la variable del proceso cambia. EL OPC Data Access Client Development
Toolkit, soporta la lectura asíncrona, síncrona y cíclica, así como la escritura asíncrona
y síncrona de los datos. Con un acceso síncrono y asíncrono la conexión con el
servidor es bidireccional (vía IAdviseSink o IOPCDataCallback Interface sobre el
cliente) . Durante la lectura cíclica la conexión que se establece es unidireccional.
Datos del cliente OPC
El cliente OPTIMAX, solo se va a conectar a un servidor (servidor de CUBE:
"OPC.Cube.1"). Para acceder a las variables, se ha creado un grupo, y dentro de este
grupo se han añadido los items. Como es lógico, los items se deben cambiar según el
experimento que se desee en cada momento, la cantidad de items, los tipos y los
nombres, serán diferentes en cada ensayo que se realice.
A continuación se describen, brevemente, los pasos a seguir para la creación de
un cliente OPC, mediante las librerías de Softing:
CAPÍTULO 3. OPTIMAX 38
1. Definición:
SOCmnPointer<SODaCEntry> pEntry;
SOCmnPointer<SODaCServer> m_pServer;
SOCmnPointer<SODaCGroup> m_pGroup;
SOCmnPointer<CItem> m_pItem;
2. Inicialización del paquete de herramientas Softing
Function_OPC * opc1=NULL;
pEntry = ::getSODaCEntry();
opc1->Conection(pEntry);
3. Añadir los datos del Servidor
OPC_Configurar_Objects();
//CUBE OPC SERVER
CLSID CLSID_OPCServer =
{0x3ebb2fc0,0x443b,0x11d3,{0xbf,0x60,0x00,0x4f,0x49,0x04,0x70,0x1e}};
IN LPCTSTR name_server=_T("OPC.Cube.1");
CAPÍTULO 3. OPTIMAX 39
IN LPCTSTR node_server=_T("SOLAR");
m_pServer =
pEntry->addServer(_T("name_server"), node_server,CLSID_OPCServer);
4. Añadir Grupos
IN LPCTSTR name_group=_T("MPC");
IN OPTIONAL DWORD rate=1000;
m_pGroup = (CGroup *)m_pServer->addGroup(name_group,rate);
5. Añadir Items a los grupos
OPC_Add_Item();
6. Conexión con los servidores
pEntry->start();
CAPÍTULO 3. OPTIMAX 40
7. Lee_todas_variables
HRESULT b= m_pGroup->syncRead(OPC_DS_DEVICE);
8. Lectura y escritura de Items
res= m_pGroup->syncRead(OPC_DS_DEVICE);
while (value.vt==0) { leido=cube_out[i]->getReadValue(value);}
cube_out[i]->get_data_variant(value,&valaux2);
ureal[i][Nb]=(double)valaux2;
cube_out[cont]->setWriteValue(SOCmnVariant(ureal_act));
cube_out[cont]->write();
Para más información consultar la ayuda de Softing, adjuntada junto a la
memoria del proyecto, en formato electrónico.
Más que cómo crear un cliente OPC, con la ayuda de las librerías de Softing, lo
que nos interesa saber es cómo añadir, eliminar o modificar un item dentro del software
OPTIMAX. Para ello es necesario lo siguiente:
1. Definición
Dentro de la clase SIMGPCVWDoc.h, se deben declarar, la conexión de
Softing, los servidores, los grupos y los Items, que se van a utilizar en la
aplicación:
CAPÍTULO 3. OPTIMAX 41
SOCmnPointer<CItem> m_pItem;
2. Añadir
En la clase SIMGPCVWDoc.cpp, en concreto el procedimiento
OPC_Add_Item, se añaden todos los items:
cube_pv= (CItem *)m_pGroup->addItem(_T(strItemName));
3. Lectura
res= m_pGroup->syncRead(OPC_DS_DEVICE);
while (value.vt==0) { leido=cube_out[i]->getReadValue(value);}
cube_out[i]->get_data_variant(value,&valaux2);
ureal[i][Nb]=(double)valaux2;
4. Escritura
cube_out_mpc[cont]->setWriteValue(SOCmnVariant((float)ureal_act));
res=m_pGroup->syncWrite(&itemList);
CAPÍTULO 3. OPTIMAX 42
Datos del servidor OPC
CLSID CLSID_OPCServer =
{0x3ebb2fc0,0x443b,0x11d3,{0xbf,0x60,0x00,0x4f,0x49,0x04,0x70,0x1e}};
IN LPCTSTR name_server=_T("OPC.Cube.1");
3.3.4.- Analizador léxico y analizador sintáctico A grandes rasgos un compilador es un programa, en el que pueden distinguirse
dos subprogramas o fases principales: una fase de análisis, en la cuál se lee el programa
fuente y se estudia la estructura y el significado del mismo; y otra fase de síntesis, en la
que se genera el programa objeto. Conceptualmente un compilador opera en fases. Cada
una de las cuales transforma el programa fuente de una representación en otra. La fase
de análisis se compone a su vez de las siguientes etapas:
• Análisis léxico • Análisis sintáctico • Análisis Semántico
El Analizador Léxico y el Analizador Sintáctico interactúan con una estructura
de datos llamada Tabla de Símbolos. El analizador léxico es el encargado de separar los
símbolos en el archivo de entrada. El analizador sintáctico es el encargado de verificar
que el orden en el cuál están colocados estos símbolos sea el correcto según la
definición del lenguaje definido.
Para introducir los datos de la planta a controlar, los parámetros de sintonización
del control y algunos datos necesarios para la comunicación del OPTIMAX con el
SCADA, se ha implementado un analizador léxico y un analizador sintáctico.
CAPÍTULO 3. OPTIMAX 43
Simplificando, los datos anteriormente mencionados, se describirán en un
fichero con extensión GPC, respetando el léxico y la semántica desarrollada.
A continuación se describirá el analizador léxico y el sintáctico.
ANALIZADOR LÉXICO
El analizador léxico, también conocido como scanner, lee los caracteres uno a
uno desde la entrada y va formando grupos de caracteres con alguna relación entre sí
(tokens), que constituirán la entrada para la siguiente etapa del compilador. Cada token
representa una secuencia de caracteres que son tratados como una única entidad. Por
ejemplo, en C un token es la palabra reservada while.
Las principales funciones que realiza son:
• Identificar los símbolos.
• Eliminar los blancos, caracteres de fin de línea, etc...
• Eliminar los comentarios que acompañan al fuente.
• Crear unos símbolos intermedios llamados tokens.
• Avisar de los errores que detecte.
La descripción del analizador léxico se describe en un fichero con extensión l,
y se utiliza un traductor denominado FLEX, para la generación del mismo.
Ejemplo: Con la siguiente sentencia: LEX Gpclex.l -8 –h –l , se genera los dos
ficheros lexyy.c y lexxy.h, que representan el analizador léxico.
FLEXGpclex.llexyy.c
lexxy.h
Figura 3.3 – Ejemplo de funcionamiento del traductor FLEX
DESCRIPCIÓN DEL ANALIZADOR LÉXICO
CAPÍTULO 3. OPTIMAX 44
Se introducirá los conceptos básicos del lenguaje del modelo, destacando los
aspectos léxicos más relevantes y la estructura de dicho modelo.
• COMENTARIOS
La especificación de comentarios en un modelo se realiza mediante los
caracteres: --
Cualquier línea que comience con --, se considera comentario.
• CADENA DE CARACTERES
Las cadenas de caracteres se representan entre comillas simples, y están
formadas por cualquier carácter, excepto fin de línea: /n y las comillas simples: ‘.
Ej: ‘a’, ’ ‘, ‘Amparo’, etc.
• NÚMERO ENTERO
Los números enteros son números sin parte fraccionaria que pueden ser
positivos, negativos o cero. El signo antepuesto al número es opcional.
Ej: 0, 9, -567, +44, +7, 7
• NÚMERO ENTERO CIENTÍFICO
Consiste en la representación científica de un número entero, que se compone de
una base (número entero), seguido de un exponente (número entero), donde el número
expresado sería: base * 10 exponente. Ambas partes quedan separadas por el símbolo E.
Ejemplos de esta notación son los siguientes: +99E-557, -777E54, 87E+2
• NÚMERO REAL
Los números reales se pueden representar de tres modos distintos.
CAPÍTULO 3. OPTIMAX 45
El primero consiste en dos secuencias de dígitos separados por un punto,
representando la parte entera y la parte fraccionaria respectivamente. Ej: +45.777 –4.5
88.77
El segundo consiste en que la secuencia que corresponde a la parte entera esté
vacía. Ej: +.33 .907 .77
Y por último, se puede representar un número real, prescindiendo de la parte
fraccionaria. Ej: +5. 5. –5.
• NÚMERO REAL CIENTÍFICO
Consiste en la representación científica de un número real, que se compone de
una base (número entero o número real), seguido de un exponente (número entero),
donde el número expresado sería: base * 10 exponente. Ambas partes quedan separadas
por el símbolo E.
Ejemplos de esta notación son los siguientes: +99E-557, –777E54, 87E+2,
9.77E-4, .78E5
• IDENTIFICADOR
A la hora de escribir un modelo, es necesario dar nombre a ciertos elementos que
en él se definen. Estos nombres, que son creados por el programador se denominan
identificadores. Un identificador comienza siempre por una letra seguida de una
secuencia de dígitos y letras.
Ejemplos: aux1, TT5_PVT, LT1_PVT, RESISTENCIA.
NOTA: El lenguaje es sensible a mayúsculas, es decir, las letras mayúsculas son
distintas a las correspondientes en letras minúsculas.
ANALIZADOR SINTÁCTICO
El analizador sintáctico, también llamado parser, recibe como entrada los tokens
que le pasa el Analizador Léxico (el analizador sintáctico no maneja directamente
caracteres) y comprueba si esos tokens van llegando en el orden correcto (orden
CAPÍTULO 3. OPTIMAX 46
permitido por el lenguaje). La salida "teórica" de la fase de análisis sintáctico sería un
árbol sintáctico.
Para generar el analizador sintáctico se utiliza el traductor denominado BISON,
y las especificaciones requeridas para el mismo se describen en un fichero con
extensión y.
Ejemplo: Con la siguiente sentencia: BISON Gpcsin.y –d –l , se genera los dos
ficheros Gpcsin_t.c y Gpcsin_t.h.
BISONGpcsin.yGpcsin_t.c
Gpcsin_t.h
Figura 3.4 – Ejemplo de funcionamiento del traductor VISÓN
DESCRIPCIÓN DEL ANALIZADOR SINTÁCTICO
Para la descripción del modelo se utiliza la siguiente estructura:
1. Todos los modelos comienzan con la palabra: LMFD (Left Matriz Fraction
Description).
2. Se indica el tiempo de muestreo, en milisegundos, de la siguiente forma:
TM = número entero;
3. Descripción de la dimensión de los vectores de entrada y salida, con el siguiente
orden:
INPUT = número entero; Indica el número de entradas del modelo. OUTPUT = número entero; Indica el número de salidas del modelo. DISTURBANCE = número entero; Indica el número de perturbaciones. NA = número entero; Indica el máximo grado del polinomio A. NB = número entero; Indica el máximo grado del polinomio B. NAD = número entero; Indica el máximo grado del polinomio A de
las perturbaciones. NB = número entero; Indica el máximo grado del polinomio B de
las perturbaciones.
CAPÍTULO 3. OPTIMAX 47
4. Valor de LAMBDA.
LAMBDA = [lista_números_reales_o_números_enteros];
5. Definición de matriz A.
A = [ lista_números_reales_o_números_enteros; lista_números_reales_o_números_enteros; M ; ];
6. Definición de matriz B.
B = [ lista_números_reales_o_números_enteros; lista_números_reales_o_números_enteros; M ; ];
7. Vector de retrasos. Indica los retrasos de la matriz B.
D = [número_entero];
8. Definición de matriz A de las perturbaciones.
AD = [ lista_números_reales_o_números_enteros; lista_números_reales_o_números_enteros; M ; ];
9. Definición de matriz B de las perturbaciones.
BD = [ lista_números_reales_o_números_enteros; lista_números_reales_o_números_enteros; M ; ];
10. Vector de retrasos de las perturbaciones. Indica los retrasos de la matriz BD.
DD = [número_entero];
11. Horizonte de predicción.
NY = [lista_de_números_enteros];
12. Horizonte de control.
NU = [lista_de_números_enteros];
CAPÍTULO 3. OPTIMAX 48
13. Vector de referencias.
REF = [lista_de_números_enteros_o_reales];
14. Vector de restricciones: YMAX, YMIN, uMAX, uMIN, UMAX, UMIN.
YMAX = [lista_de_números_enteros_o_reales]; Restr. de entrada YMIN = [lista_de_números_enteros_o_reales]; Restr. de entrada uMAX = [lista_de_números_enteros_o_reales]; Restr. de salida en incremento uMIN = [lista_de_números_enteros_o_reales]; Restr. de salida en incremento UMAX = [lista_de_números_enteros_o_reales]; Restr. de salida en amplitud UMIN = [lista_de_números_enteros_o_reales]; Restr. de salida en amplitud
15. Configuración de la planta: Nombre de la zona y el nombre de la unidad.
CONFIGURACION_PLANTA
Cadena_de_caracteres Indica el nombre de la zona, sobre la que trabajaremos.
Cadena_de_caracteres Indica el nombre de la unidad, sobre la que trabajaremos.
16. Configuración de Variables de Procesos (PVS)
CONFIGURACIÓN_PVS
Lista_de_cadena_de_caracteres Indican el nombre de las variables de proceso.
17. Configuración de Variables de Salida (OUTS)
Lista_de_cadena_de_caracteres Indican el nombre de las variables de salida.
18. Configuración de la perturbaciones
CONFIGURACION_DIST
Lista_de_cadena_de_caracteres → → Indican el nombre de las variables perturbadoras.
CAPÍTULO 3. OPTIMAX 49
¿CÓMO REALIZAR MODIFICACIONES EN EL ANALIZADOR LÉXICO?
Cada vez que se desee modificar el analizador léxico es necesario seguir los
pasos que se describen a continuación.
Una vez que se han realizado las modificaciones oportunas en el analizador
léxico y se ha ejecutado la siguiente sentencia: LEX Gpclex -8 -h -l se generan dos
ficheros, como anteriormente se ha mencionado, uno con extensión ‘h’, y otro con
extensión ‘c’. Es necesario realizar algunas modificaciones en dichos archivos
generados.
1) Al principio del archivo de cabecera generadocon extensión ‘h’, se debe
insertar el siguiente código:
#define YY_<nombre escáner>_CHAR unsigned char /*permite caracteres de 8 bits*/ #ifndef YY_USE_CLASS #define YY_USE_CLASS #endif
2) El archivo generado con extensión ‘c’, se debe renombrar con extensión
‘cpp’Al principio del todo.
Al principio es necesario incluir lo siguiente:
#define YY_CHAR unsigned char #ifndef YY_USE_CLASS #define YY_USE_CLASS #endif
Y borrar las líneas de códigos:
#ifndef _MSDOS #include <osfcn.h> #endif
CAPÍTULO 3. OPTIMAX 50
¿CÓMO REALIZAR MODIFICACIONES EN EL ANALIZADOR
SINTÁCTICO?
Cada vez que se desee modificar el analizador sintáctico es necesario seguir los
pasos que se describen a continuación.
Una vez que se han realizado las modificaciones oportunas en el analizador
léxico y se ha ejecutado la siguiente sentencia: BISON Gpcsin.y -d -l se generan dos
ficheros, como anteriormente se ha mencionado, uno con extensión ‘h’, y otro con
extensión ‘c’. Es necesario realizar algunas modificaciones en dichos archivos
generados.
1) Al principio del archivo de cabecera con extensión ‘h’, se debe incluir lo
siguiente:
#ifndef YY_USE_CLASS #define YY_USE_CLASS #endif
2) Es necesario renombrar el archivo con extensión ‘c’ a otro con extensión
‘cpp’.
3) Es necesario buscar en el archivo ‘cpp’ el siguiente código y borrarlo:
/*Added lex prototype */ #ifndef YY_ParserGpc_PURE M #else M #endif
4) Es necesario buscar en el archivo ‘cpp’ la definición de la matriz YY+name
y quitar la primera línea con # por encima y la primera línea por debajo.
Concretamente: #if YY_ParseGPC_DEBUG !=0 y #endif
Después de hacer todos los cambios, los ficheros hay que copiarlos al directorio del proyecto.
CAPÍTULO 3. OPTIMAX 51
EJEMPLO DE UN FICHERO *.GPC
---------------------------------------------------------------------------
-- Modelo de archivo para introducir los datos --
-- OPTIMAX --
---------------------------------------------------------------------------
-- Todas las líneas que no comiencen con los dos guiones serán parte de un ejemplo -- para saber la forma que tienen los datos. Todos los archivos hay que iniciarlos con la -- secuencia LMFD debido a la programación que verifica esto para saber que el archivo -- está echo para el OPTIMAX
LMFD
-- Se introduce el tiempo de muestreo en mseg. Este tiempo de muestreo es con el que -- trabajara el OPTIMAX y debe de ser con el que hemos obtenido la matriz de -- funciones de transferencia de nuestra planta
TM= 4000; --mseg
-- Introducimos el numero de entradas y salidas que tiene nuestra planta
INPUT= 3; --entradas en sistema controlador
OUTPUT=1;
-- Número de perturbaciones que vamos a tratar. Poner a 1 si no hay perturbaciones
DISTURBANCE=1;
-- Para introducir la matriz de funciones de transferencia de nuestro sistema se realiza -- lo que se denomina Matrix Fraction Description de forma que tenemos que una -- matriz G será descompuesta en una matriz A y en otra matriz B resultando que -- G(z^-1)=[A(z^-1)^-1]*B(z^-1), de orden (n*m), resultando A una matriz diagonal, de -- orden (n*n), donde cada polinomio de la diagonal sale de obtener el mínimo común -- múltiplo de los denominadores de cada fila de la matriz G. Así B, de orden (n*m), se -- obtendrá realizando las operaciones pertinentes. NA será el mayor orden de los -- polinomios que forman A, así si tenemos por ejemplo 1-0.987(z^-1)+1.114(z^-2) NA -- será igual a 2. Los polinomios deben tener todos el mismo orden de forma que si -- alguno de ellos es de orden menor se le añadirán ceros por detrás para tener todos los -- polinomios iguales
NA=3;
CAPÍTULO 3. OPTIMAX 52
-- NB será lo mismo pero para los polinomios que conforman la matriz B.
NB=13;
-- NAD y NBD son los correspondientes a las perturbaciones. Poner a 1 si no hay -- perturbaciones
NAD=1;
NBD=1;
-- Factores de corrección lambda, deben de ser iguales al numero de INPUT
LAMBDA= [100 1 10];
-- Matriz A de la Matrix Fraction Description donde los polinomios se escriben en -- orden descendente de z^- empezando por z^-0. Los polinomios deben tener todos el -- mismo orden de forma que si alguno de ellos es de orden menor se le añadirán ceros -- por detrás para tener todos los polinomios iguales.
A =[1.0 -2.2586 1.6731 -0.4046];
-- Matriz B de la Matrix Fraction Description donde los polinomios se escriben en orden -- descendente de z^- empezando por z^-0. Los polinomios deben tener todos el mismo -- número de términos.
B =[0 0 0 0 0 0 0 0 0 0 0.5438 -0.7830 0.2688 0 0 0 0 0 0.249 -0.0345
0.01154 0 0 0 0 0 0 0 0 0 0 0.2176 -0.3686 0.1559 0 0 0 0 0];
-- Mínimo retraso de cada fila de la matriz B. Coincide con el numero mínimo de ceros -- que tenemos al empezar los polinomios de la matriz B.
D= [5];
-- Matrices A, B y D correspondientes a las perturbaciones. Poner de la siguiente forma -- si no hay perturbaciones.
--DISTURBANCE
AD =[1.0 0.0];
BD =[0 0];
DD= [0];
-- NY se aconseja que sea el horizonte de predicción menos el horizonte de control y -- NU el retraso más 1
NY= [30];
CAPÍTULO 3. OPTIMAX 53
NU= [11 6 6];
-- Referencia a conseguir
REF= [700];
-- Rango en el que se va a mover las variables que estamos controlando
YMAX= [50000];
YMIN= [-50000];
-- Restricciones en velocidad de cambio (slew-rate), es el salto máximo que puede pegar -- el actuador que estamos controlando.
uMAX=[1 50 25];
uMIN=[-1 -50 -25];
-- Restricciones en amplitud, valores máximos y mínimos permitidos para la salida del -- controlador
UMAX= [36 4500 500];
UMIN= [30 2000 50];
-- Metemos la configuración de la planta de forma que primero aparece el nombre de la -- zona que estamos tratando y después el nombre de la unidad (PMC) donde se -- encuentran nuestras variables a tratar.
CONFIGURACION_PLANTA
ALMAZARA
EXTRACCION
-- Introducimos el nombre de las variables de entrada de nuestro control que serán las -- salidas en nuestra planta real. Son las variables que queremos controlar.
CONFIGURACION_PVS
FTL1155_PVC2
-- Introducimos el nombre de las variables de entrada a la planta que serán las salidas de -- nuestro controlador. |C| -outs- |P| - pvs –
CONFIGURACION_OUTS
TICL1111_CSSP
CAPÍTULO 3. OPTIMAX 54
FICL1138_CSSP
FTL1139_CORMAN
-- Introducimos el nombre de las perturbaciones. Si no existen perturbaciones, se mete -- una cualquiera
CONFIGURACION_DIST
RT13003_PV
3.4.- Manual de usuario
Este manual va a utilizar un ejemplo monovariable, pero todo lo que se explica
es extrapolable al caso multivariable.
Para arrancar el programa hay que ejecutar el archivo Spgpc.exe, el cual se
puede encontrar con el siguiente icono:
Spgpc.exe Figura 3.5 – Icono del OPTIMAX
Una vez pulsado sobre el icono sale la pantalla inicial del programa donde lo
primero que habrá que realizar es elegir el archivo con extensión “gpc”.
Figura 3.6 – Pantalla inicial del OPTIMAX
CAPÍTULO 3. OPTIMAX 55
Como cualquier programa, para elegir el archivo a ejecutar, abriremos el
comando “File” y elegiremos la opción “Open” o daremos con el botón izquierdo del
ratón sobre la carpeta amarilla, debajo del comando “File”.
Figura 3.7 – Formas de abrir un archivo *.GPC
Se buscará la carpeta donde se ha creado el archivo “gpc” y seleccionaremos el
que se vaya a utilizar.
Figura 3.8 – Elección del archivo *.GPC
Una vez abierto el archivo deseado, lo siguiente que realiza OPTIMAX es la
conexión con el servidor de CUBE. Cuando esto ocurra nos avisará con la siguiente
pantalla:
Figura 3.9 – Pantalla que indica que se ha realizado la conexión con CUBE
CAPÍTULO 3. OPTIMAX 56
Debemos de dar a aceptar para continuar, y nos saldrá una nueva pantalla
avisando de que el OPTIMAX se ha activado:
Figura 3.10 – Pantalla que indica que se ha activado OPTIMAX
Una vez que se escuche un pitido fino todo estará listo para trabajar con el
OPTIMAX. La pantalla que se tendría en este momento en pantalla tendría la siguiente
forma:
Figura 3.11 – Pantalla tras la activación
Una vez llegado a este punto, se describirán las variables que deben estar en la
base de datos de la planta a controlar para que el OPTIMAX funcione correctamente:
CAPÍTULO 3. OPTIMAX 57
- SPTAG00, SPTAG01, SPTAG02, ...
Variables reales. Habrá tantas variables SPTAG0X, como set-points se
implanten en el control. Por ejemplo, si se tienen 3 set-points se necesitará SPATG00,
SPTAG01 y SPTAG02 correspondiendo, respectivamente, cada variable a los set-points
definidos en el archivo “gpc”.
Para cambiar el set-point, se manipulará directamente cada variable, ya que en el
OPTIMAX sólo se visualiza el set-point que se desea y no se puede manipular.
Figura 3.12 – Pantalla que visualiza el set-point
- OUT_MPC00, OUT_MPC01, OUT_MPC02, …
Variables reales. En estas variables es donde escribirá el OPTIMAX las acciones
de control, por lo tanto habrá que copiarlas a las variables manipulables. Los valores
que toman quedan reflejados en la siguiente pantalla:
Figura 3.13 – Pantalla que visualiza las acciones de control
- PVTAG00, PVTAG01, PVTAG02, ...
Variables reales. Son las variables que utiliza OPTIMAX para guardar las
variables de proceso que se están controlando. Los valores que toman quedan reflejados
en el recuadro “PV”.
CAPÍTULO 3. OPTIMAX 58
Figura 3.14 – Pantalla que visualiza el valor de las variables de proceso
- PREDICTOR_SMITH
Variable lógica. Se activa desde Cube. La activa el usuario pero hacerlo sólo
cuando hay retardo la activa el usuario
- NF_FILTRO_MPC
Variable real. Orden del filtro paso bajo. En la fórmula C.13 corresponde a “m”.
Se modifica en Cube. Ponerlo normalmente a 1 y aumentarlo sólo en caso que el control
no se efectivo. El orden del filtro será el mismo para todas las salidas.
- AF_FILTRO_MPC00, AF_FILTRO_MPC01, AF_FILTRO_MPC02, ... Variable real. Polo del filtro para la salida 0...n. En la fórmula C.13 corresponde a “γ”. Se modifica en Cube. En este caso el polo del filtro puede ser distinto para cada una de las salidas. - CTE_FILTRO_MPC00, CTE_FILTRO_MPC01, CTE_FILTRO_MPC02, ...
Variable real. Factor del cero del filtro para la salida 0...n. En la fórmula C.13
corresponde a “β” . En este caso también la constante del filtro puede ser distinto para
cada una de las salidas.
- OPTIMAX AUTOMATIC
Variable lógica. Variable creada para activar a través de una secuencia de Cube
cuando se quiere que el control se esté realizando. Así por ejemplo habrá que crear un
secuencia con contenga una sintaxis parecida a:
IF (OPTIMAX_AUTOMATIC) THEN
VM110001=OUT_MPC00
ENDIF
CAPÍTULO 3. OPTIMAX 59
Una vez descritas las variables, se hará lo propio con los dos recuadros centrales
de los cuáles no se ha hablado aún.
En el recuadro “OUT Constraints” se tienen los valores máximos y mínimos que
pueden tomar cada una de las variables de salida que se tienen en el recuadro “Out”.
Representan las restricciones a las variables manipulables.
Figura 3.15 – Pantalla que visualiza el valor de las restricciones en OUTs
El último recuadro que se tiene, “PV Constraints”, representa las restricciones a
las variables de proceso que se estan controlando.
Figura 3.16 – Pantalla que visualiza el valor de las restricciones en PVs
Los dos tipos de restricciones anteriores se pueden modificar, con el OPTIMAX
en funcionamiento, pulsando sobre el botón “Constraints”
Figura 3.17 – Botón para modificar las restricciones
Una vez pulsado saltará la siguiente pantalla:
CAPÍTULO 3. OPTIMAX 60
Figura 3.18 – Pantalla para modificar las restricciones
Lo primero que se debe de hacer para cambiar alguna restricción es elegir la
variable deseada, ya sea de salida, “Out”, o de entrada, “PV”. Así, si desea cambiar, por
ejemplo las restricciones de una de las variables de salida, habrá que pulsar sobre la
flecha en la parte de “Out” y elegir la variable de la lista que se despliega.
Figura 3.19 – Forma de elegir la variable OUT a cambiar
Esto hará que se muestren los valores asociados a la variable elegida.
Figura 3.20 – Pantalla que muestra las restricciones en OUT
CAPÍTULO 3. OPTIMAX 61
Una vez mostrado los valores actuales, se pueden escribir directamente los
nuevos valores en los cuadros correspondientes. Para el caso de las variables de salida
se puede cambiar la máxima y mínima velocidad de cambio.
De forma análogo se haría para las restricciones de las variables de proceso.
Figura 3.21 – Pantalla que muestra las restricciones en PV
Una vez escritos todos los nuevos valores se pulsará el botón “OK” y entonces
se tendrá una nueva pantalla de confirmación.
Figura 3.22 – Pantalla de confirmación para las modificaciones realizadas en las restricciones
En esta pantalla se confirmarán o se cancelarán los cambios introducidos en la
pantalla anterior a esta.
CAPÍTULO 3. OPTIMAX 62
También podemos pulsar sobre el botón con el nombre “Lambda”
Figura 3.23 – Botón para modificar Lambda
Una vez pulsado, se puede ver en un nuevo recuadro el valor λ que se tiene
actualmente.
Figura 3.24 – Pantalla que muestra el valor de Lambda
Para cambiar este valor habrá que escribir el nuevo valor en el recuadro “New
value” .
Figura 3.25 – Lugar donde introducir el nuevo valor de Lambda
Una vez escrito hay que pulsar el botón “Apply”.
Figura 3.26 – Botón para aplicar el nuevo valor de Lambda
Si no se pulsa este botón antes de salir, el cambio no se hará efectivo. Una vez
pulsado “Apply” cerramos el recuadro bien confirmando los cambios con el botón “OK”
o cancelando con el botón “Cancel”.
CAPÍTULO 3. OPTIMAX 63
A las posibilidades que nos dan los dos botones anteriores, “Constraints” y
“Lambda”, podemos acceder también a través del comando, que se encuentra en la barra
superior, “Parameters”.
Figura 3.27 – Comandos para acceder a modificaciones de restricciones y lambda
El tercer botón que aparece es “Historian”. Este botón activa el siguiente
recuadro:
Figura 3.28 – Pantalla para la consulta de históricos
Como el título del recuadro indica, aquí se puede ver el histórico de algunas de
las variables que se están tratando, ya sea de salida, de entrada o un set-point. Para hacer
la consulta, sólo se tiene que pulsar, con el ratón, sobre la variable deseada y pulsar el
botón seleccionar.
Figura 3.29 – Forma de elegir los históricos a consultar
Una vez pulsado aparecerá una lista con los últimos 10 valores tomados por esa
variable en los últimos 10 tiempos de muestreos pasados. El tiempo de muestreo es el
fijado en el archivo “gpc”.
CAPÍTULO 3. OPTIMAX 64
En la parte inferior de la pantalla, encima de la barra de tares, hay dos ventanas
minimizadas. Estas dos ventanas son dos pantallas gráficas donde podemos seguir la
evolución de nuestro control.
Figura 3.30 – Pantallas gráficas minimizadas
Si se restaura la pantalla “Outs” se podrá visualizar la evolución de las variables
manipulables, además de dos líneas, como en la gráfica anterior, que representan el
valor superior e inferior de la restricciones.
Figura 3.31 – Forma de la pantalla gráfica de OUTs restaurada
Si se restaura la pantalla “PVs” se podrá visualizar la evolución de las variables
de proceso, de los set-points, además de dos líneas que representan el valor superior e
inferior de la restricciones.
Figura 3.32 – Forma de la pantalla gráfica de PVs restaurada
CAPÍTULO 3. OPTIMAX 65
Si los límites de las pantallas gráficas no son adecuados, ya a que al arrancar el
OPTIMAX tiene unos valores predefinidos, con la pantalla gráfica que queramos
cambiar visible, restaurada, pulsamos sobre el comando “Scale” situado en la barra
superior.
Figura 3.33 – Comando para acceder a cambiar los límites de las pantallas gráficas
En la pantalla que se activa podremos poner los nuevos límites.
Figura 3.34 – Pantalla para cambiar los límites de las pantallas gráficas
Otro de los comandos que se tienen es “Edit” donde se podrá activar o
desactivar la barra de herramientas, “Tool bar”, y la barra de tareas del OPTIMAX,
“Task bar”.
Figura 3.35 – Comando Edit
En el comando “Windows” podemos organizar las ventanas que tenemos en el
OPTIMAX, la principal y las dos ventanas gráficas.
CAPÍTULO 3. OPTIMAX 66
Figura 3.36 – Comando Window
Por último, el comando “Help” muestra información sobre la versión del
OPTIMAX con la que se está trabajando.
Figura 3.37 – Comando y pantalla Help
También se puede acceder a esta información pulsando sobre el interrogante
amarillo que aparece en la barra de herramientas.
Figura 3.38 – Icono directo a Help
Para cerrar el OPTIMAX se pulsará sobre la opción “Exit” del comando “File”.
CAPÍTULO 3. OPTIMAX 67
Figura 3.39 – Cómo cerrar OPTIMAX
Una vez pulsada se cerrará la pantalla con la que se ha trabajado, y pasado un
poco de tiempo debe de aparecer, una primera ventana que te avisa que estabas
conectado.
Figura 3.40 – Pantalla que avisa que se está conectado
Y una vez que se pulsa el botón “Aceptar”, se activa una nueva ventana para
desconectar definitivamente.
Figura 3.41 – Pantalla que avisa que se está desconectado
CAPÍTULO 3. OPTIMAX 68
• ERRORES QUE PUEDEN SURGIR
A continuación mostraremos las pantallas que saltan para avisar de que existe
algún error.
Figura 3.42 – Pantalla que avisa que no se ha establecido la conexión
Esta pantalla es debido a que no se ha podido establecer la comunicación OPC,
bien debido a que no hay servidor, bien porque no se ha especificado correctamente el
nombre del ordenador al que se desea conectar o bien debido a que hay algún problema
en la comunicación, ya sea por problema de red o cualquier otra causa.
Se puede solucionar ejecutando manualmente el archivo CubeOPCSvr.exe que
se encuentra ubicado en C:\ICUBESYS\BIN .
Una vez establecida la conexión, el siguiente error que puede aparecer es:
Figura 3.43 – Pantalla que avisa que no se han añadido los items
Este error es debido a que no se pueden añadir los items en la base de datos de
nuestro planta. Esto puede ser debido a que la base de datos está abierta o bien porque
las variables anteriores que hemos descrito, SPTAG, PVTAG, etc, no han sido añadidas
a la base de datos.
Después de tener estos errores, normalmente, hay que abrir el Administrador de
tareas de Windows y terminar el proceso Spgpc.exe, ya que se queda ocupando casi
todo el uso de la CPU y el ordenador se vuelve muy lento.