viernes, 17 de febrero de 2012

Control Borroso


Dejo este artículo que escribí en el año 2005 sobre la lógica borrosa para la empresa 4D, y que fue publicado en la sección de historias de éxito. Está basado en mi proyecto de fin de carrera y me pareció interesante compartirlo.

______________________________________________________________________

Desde el nacimiento de la lógica borrosa hasta nuestros días, se ha encontrado y desarrollado numerosas aplicaciones de la misma, desde el control de una máquina de vapor, hasta los modernos chips borrosos que controlan lavadoras, hornos o las luces de la casa. Aún así, se trata de una tecnología relativamente reciente, que incita a ser investigada y aplicada por los ingenieros de control.

Control Borroso: ¿Sabes llenar un tanque?

Me decidí a implementar un software de control borroso para mi proyecto de fin de carrera, con ánimo de demostrarme a mí mismo que era capaz de aplicar en la vida real, todo lo que aprendí en la asignatura de Automática de sexto curso de Ingeniería Superior de Minas. El sistema que elegí para aplicar el control fue un tanque de agua con válvulas de entrada y salida. Como no podía disponer de dicho sistema físicamente, lo que hice fue desarrollar un simulador por ordenador, que se comportase de forma idéntica al sistema a controlar. Dicho simulador genera datos que indican el estado del sistema, es decir, el llenado del tanque, la apertura de la válvula, etc. Estos datos se envían al control a través de puerto serie, como si se tratase de un sistema real, cuyos sensores de medida envían los datos de la medición al control. El control, toma la decisión en función de los datos recibidos, de abrir o cerrar la válvula de admisión de agua, regulando así la altura de llenado del tanque.


La implementación del simulador consiste en desarrollar las funciones que nos den el parámetro adecuado. Por ejemplo, en nuestro caso, existe una función que nos da el caudal de salida de la válvula en función del tanto por ciento de apertura de la misma. El caudal de agua que sale de la válvula se alimenta al tanque, que almacenará la cantidad que ya tenía más la cantidad de agua que sale a cada instante de la válvula. Esta operación se realiza en cada iteración del programa del simulador. 

Control 

La lógica borrosa nace de la teoría de los conjuntos borrosos del profesor Zadeh. El objetivo del profesor Zadeh era expresar en lenguaje matemático el modo de razonamiento aproximado, característico de los humanos.  Contraria a la lógica tradicional en la que solo son posibles dos valores, en la lógica borrosa todo es cuestión de grado. El grado es el concepto fundamental de la lógica borrosa. Las cosas ya no son blancas o negras, ahora los tonos grises están permitidos.  
Los conjuntos borrosos, son conjuntos en los que se define una función llamada " función de pertenencia ", que asigna a cada elemento del conjunto, un valor que representa el grado en que dicho valor pertenece al conjunto. A cada conjunto se le asocia un cuantificador lingüístico, como por ejemplo, mucho, poco, bastante etc., de forma que relacionamos el modelo matemático con el lenguaje humano. La función de pertenencia, puede ser cualquiera, pero una de las más utilizadas es la función triangular por la sencillez y eficacia de la misma. Por ejemplo, si hablamos de temperatura, para mí la temperatura del agua entre 5 y 22 grados centígrados, la considero fría, entre 20 y 35, templada, y de 33 a 45, caliente. Ya tengo los intervalos definidos, a los cuales les he asociado un cuantificador lingüístico. Ahora solo falta definir las funciones de pertenencia, para tener los conjuntos borrosos. Usando funciones triangulares: 



El hecho de que las funciones se solapen significa que la frontera entre lo frío y lo templado, y entre lo templado y lo caliente no está clara. Esto refuerza más la idea de difuso, ya que en la lógica tradicional, un valor dado de temperatura pertenece al conjunto de frío o al de templado, pero no puede pertenecer a los dos. Por ejemplo el valor de temperatura de 21 ºC, pertenece al conjunto de fría y de templada. Por otro lado, la elección de los intervalos de temperatura varía en función de la persona, la experiencia, el sistema a controlar y como lo quieras controlar... 

Difuminar un valor real, consiste en calcular el grado en que dicho valor real pertenece a cada conjunto borroso: 
 


En el ejemplo, el valor de 24 grados pertenece en un grado de 0,9 a conjunto de "Templado" y en grado cero a "Fría" y "Caliente". Es decir, hemos traducido el valor real de 24ºC al siguiente vector (array en programación): ( 0 , 0.9 , 0 ). 
Por otro lado, en el modo de razonamiento humano, se utilizan reglas del tipo 
  
Si CONDICION ENTONCES ACCION 

para transmitir instrucciones y conocimiento. 
Relacionándolo con el concepto de grado, en la medida o grado en que se cumpla la condición, será en la medida o grado en que se cumpla la acción. Un ejemplo de regla de control para nuestro sistema puede ser:

                   Si el tanque esta Lleno entonces la apertura de la válvula debe ser cero.

Esto quiere decir que, si el grado de pertenencia al conjunto de lleno es 1, entonces la salida que debe dar el control debe pertenecer en grado 1 al conjunto de apertura cero. Sin embargo, si la pertenencia al llenado del tanque es de 0,5 la salida pertenecerá también al conjunto apertura cero en un grado de 0,5.

De esta forma se toma la decisión de la salida del sistema. 

El software borroso debe contemplar los siguientes bloques: 

1.  Bloque de difuminación: Como hemos visto, las reglas de trabajo son reglas borrosas, las cuales nos indican que hacer  si el valor real que envía el simulador pertenece a un  conjunto u otro. Para poder comparar el valor de la medida con las reglas de trabajo, dicho valor debe expresarse en forma de variable borrosa. Es en este bloque donde una variable real se transforma en borrosa. 
2.  Motor de inferencia: Es en este bloque donde se toma la decisión. Se compara la entrada con las reglas de trabajo y se ve en que grado se cumple cada una de ellas, evaluando así el resultado. 
3.  Concretización: La salida borrosa hay que convertirla a un valor real que pueda ser interpretado por el dispositivo real, en nuestro caso la válvula. 

Nota: Puede que la utilización de los términos "Difuminación" y "Concretización" no le sean familiares a aquellos que conocen algo de lógica borrosa, pero me he permitido la licencia de utilizar los términos castellanos en lugar de los términos en inglés(fuzzy y defuzzy) reivindicando el uso del idioma castellano allí donde existe una palabra para identificar el concepto, en lugar de asimilar directamente 
el término inglés. 

¿Y cómo se implementa todo esto en 4D? 

En primer lugar hay que definir los intervalos  de los conjuntos borrosos para cada variable. Es aquí donde especificamos que rango de la variable esta asociado a cada cuantificador lingüístico, como por ejemplo poco lleno, medio lleno, lleno etc. También diremos la función de pertenencia que vamos a utilizar, que en nuestro caso es la función triangular. 

Esto se implementa con dos tablas: 
•  En la primera que llamaremos “Particiones”, se recogen los valores inicial y final del rango y el cuantificador lingüístico que se le asocia a la variable. 
•  Los valores de la segunda tabla, que llamaremos “CalculoPartVar”, se componen a partir de la primera.

Las funciones triangulares definidas en cada intervalo se pueden descomponer a su vez en dos subintervalos, uno por cada recta que compone la función triangular. 



En esta tabla se almacenan los valores de Inicio del Rango, Punto medio del rango, pendiente (m) de la recta y término independiente (n ) de la recta. De esta forma, dado un valor real, lo primero que hacemos es un "query" para identificar a que tramo pertenece, componiendo después la recta que nos da el grado de pertenencia, ya que disponemos de los valores de m y n de la recta. 
Las tablas utilizadas fueron las siguientes:





¿Cómo se traducen las reglas de trabajo del lenguaje humano al lenguaje matemático?

Las reglas de trabajo en lógica borrosa, recogen la experiencia del operador en el control del sistema. Cualquiera sabe que si el tanque está casi lleno debemos cerrar la válvula para que no rebose. Estas reglas de trabajo, se expresan como: 

                                             SI CONDICIÓN ENTONCES ACCIÓN 

y es así como se recogen en el software.



Lo que hacemos es traducir estas reglas matemáticamente para poder compararlas con el valor que viene del simulador. Esto se hace mediante las siguientes tablas: 



La tabla Reglas recoge las mismas escritas en lenguaje humano. La tabla MatrizReglas, se compone a partir de la primera. Los campos C1 a C10 representan los códigos de cada uno de los diez intervalos en que se permite dividir una variable. Todos los valores se rellenan a cero con excepción de aquel que cumple la condición de la regla, que se rellena con un uno. Por ejemplo, supongamos que C1 representa al intervalo de "poco lleno" del tanque y C2, al intervalo "Medio lleno", ambos para la variable de llenado del tanque. Con respecto a la variable de apertura de la válvula, C1 representa cerrada a tope y C2 abierta a tope. Supongamos también la siguiente regla de trabajo: 

                  Si el tanque esta poco lleno ENTONCES abre la válvula a tope.

Esto lo podemos representar en la siguiente tabla: 



Es decir, hemos traducido las reglas a un array de dos dimensiones. Más arriba explicábamos cómo traducíamos a un array borroso un valor real. Ahora hemos hecho lo mismo con las reglas. Lo tenemos todo expresado en forma de arrays numéricos que son fácil de comparar. 

Protocolo

El simulador y el control se ejecutan en dos equipos diferentes, simulando una situación de la vida real. Para comunicarlos se utiliza el puerto serie, definiendo un protocolo para el trasiego de datos. El control puede enviar al simulador dos tipos de tramas:

•  Trama de pregunta: Tiene una longitud de 14 bytes. Se pregunta el estado de las variables del sistema 
•  Trama de orden: Tiene una longitud de 17 bytes. Se envía una orden al simulador para la nueva posición de los actuadores.

Las tramas constan de una cabecera, un emisor, un receptor, un cuerpo del mensaje y un CRC (código de redundancia cíclica). Este CRC, fue también diseñado por mí para chequear la correcta transmisión de las tramas de datos. El software incorpora un control de errores, emitiendo señales de alarma si no 
recibe respuesta del simulador en tres intentos de comunicación. El ciclo completo de pregunta, respuesta, orden y aceptación de la orden que tiene lugar entre el control y el simulador, se completa cada dos segundos. 4D en el proyecto. Existen dos partes diferenciadas en la industria: el control, propiamente dicho y la gestión de la información. Los dispositivos de medida generan grandes cantidades de información que es almacenada en bases de datos, y que se utiliza después para evaluar el rendimiento de nuestro proceso de control. En este sentido, 4D cumple perfectamente su función, al integrar el entorno de desarrollo y el motor de base de datos. 
  
Por otro lado, el proyecto se basa en el manejo de arrays, por lo que utilicé mucho el juego de instrucciones que 4D tiene para su manejo, así como la posibilidad de pasar punteros a arrays, con objeto de construir métodos especializados en una tarea, que se dedican a cargar los valores adecuados en las posiciones correspondientes. 
Como crítica constructiva para los responsables del producto diré que el manejo del puerto paralelo es bastante complejo. El uso de este puerto en lugar del serie, permitiría la aplicación directa del software sobre un dispositivo real, utilizando únicamente un convertidor digital / analógico, ya que posee 8 bits de datos utilizables para transmitir directamente el valor que debe tomar el actuador de la válvula.



Resultado final

El software se configuró para que funcionase como un control P.I (Proporcional Integral). Este tipo de controles son muy conocidos en la industria. El control PI borroso se comparó con un PI clásico, obteniendo unos resultados muy parecidos en el comportamiento. 
Como opción de futuro y aunque a priori no pensé en ello ya que se trataba de un desarrollo sencillo y monopuesto, se me ocurrió utilizar la tecnología de 4D Client par lo siguiente: puesto que software admite almacenar las configuraciones que permiten el control de diferentes sistemas, el hecho de montar el software sobre un 4D Server implica el control simultaneo de tantos sistemas diferentes como clientes 4D tengamos, comportándose cada control  como lo hayamos definido previamente en la configuración y utilizando el mismo programa de control.



Alejandro Palacios Rodrigo
Madrid – Febrero 2005