Capítulo 5 Programas desarrollados

Anuncio
Capítulo 5
Programas desarrollados
5.1
Programas en LABView
En LABView más que desarrollar un programa, se ha analizado un programa previamente desarrollado, y se ha adaptado para la simulación de la
red. Se trata de un Front Panel desarrollado en [1] y [7], donde se llevaba a
cabo un control local del sistema LeviNeu. Este .vi llama a su vez a varios
.vi, donde cada uno se encarga de una tarea determinada, haciéndolo, de
esta forma, mucho más modular.
camara.vi se encarga de la comunicación con el sistema de visión, y
de la conversión de las medidas de píxeles a mm, se le llama cada vez
que se quiera hacer una medida. En este .vi, lo único que se ha modificado es, que además de la medida de la altura, se obtenga también
la medida del desplazamiento horizontal de la bola, ya que se pensó
en un principio que eso podría servir para desarrollar un algoritmo de
control nuevo (Neuroborroso), al final este algoritmo no se desarrolló,
pero se dejó la obtención del desplazamiento por si en un futuro se le
da uso.
calibration.vi no se le llama desde el diagrama de bloques pricipal,
pero se usa para calibrar el sistema de visión, cada vez que este es
movido físicamente, para obtener medidas fiables.
CalcFCS.vi se encarga para calcular el Checksum de la trama para
su adaptación al formato Host Link, antes de enviarla al autómata.
Trama HL.vi , Param hl.vi y ten hl.vi se encargan de tareas de
adaptación de las tramas al formato Host Link.
Hinfinito.vi se encarga de calcular los parámetros de algoritmo de
control H∞ .
GPC.vi se encarga de calcular los parámetros del algoritmo de control
GPC
35
36
PROGRAMAS DESARROLLADOS
fichero.vi se encarga de guardar los datos del experimento, al final
de este, en un fichero .m, para su posterior análisis por el usuario.
En el diagrama principal, lo único que se ha añadido, es lo relativo a la
adaptación para el control a través de red:
La cuantización de la medida: para ello se ha añadido una llamada a una DLL, mediante el bloque de Call Library Funtion Node de
LABView, que ejecuta el programa cuantización.cpp que se explicará
más adelante. Esta llamada se hace justo después de llamar a camara.vi, así se cuantiza la medida, y se trabaja con la medida cuantizada.
A esta DLL, se le pasan, como se puede apreciar en la Figura 5.1, como parámetros de entrada tanto la medida en cm (Por ello la división
entre 10), como la precisión, y devuelve la medida una vez cuantizada.
Figura 5.1: Captura de pantalla del diagrama de bloques de LABView.
El retardo variable y la probabilidad de pérdida: para simular
estos dos efectos de la inserción de una red en el bucle de control, se
hace otra llamada a una DLL, aunque esta vez una vez adaptada la
trama a enviar, que ejecuta el programa retardo variable.cpp, cuyos
detalles vienen más adelante. Esta DLL, recibe como parámetros de
entrada, la trama a enviar, que para adaptarla al formato de cadenas
de caracteres de C, se le añade un carácter nulo al final, también recibe
como parámetro de entrada un double con el tiempo del sistema, y
PROGRAMAS EN CX-PROGRAMMER
37
otro con la probabilidad de pérdida. Como salida de dicha DLL, se
devuelve una cadena de caracteres de longitud variable, dependiendo
del tipo de control, donde van la trama a enviar hacia el autómata,
seguida de una cadena de caracteres portando el tiempo de entrada
en la red de dicha trama1 . De vuelta en LABView se separan las dos
cadenas, enviándose la trama hacia el autómata, y usando el tiempo de
entrada para calcular el retardo que ha sufrido, esa trama en concreto.
En la Figura 5.2 se puede apreciar la llamada a la DLL en cuestión,
así como el envío de la trama hacia el autómata.
Figura 5.2: Captura de pantalla del diagrama de bloques de LABView 2.
5.2
Programas en CX-Programmer
En CX-Programmer, al igual que en LABView, se ha aprovechado la implementación de un programa para la comunicación con el autómata (Levineulocal.cxp), desarrollado previamente en [7], para simplemente adaptarlo
1
esto se hace así, ya que la función en C sólo puede devolver un parámetro de salida, y
que además LABView pueda interpretarlo, por tanto sólo nos queda la opción de cadena
de caracteres
38
PROGRAMAS DESARROLLADOS
a la nueva situación del control a través de red, añadiendo al bloque de función Actuación, donde se sacaba la señal de control por una salida analógica
en tensión, un bucle dedicado a la cuantización de dicha señal antes de que
se extraiga.
Para llevar a cabo esta cuantización ha habido que incluir el parámetro
precisión, en el grupo de parámetros que se mandan desde el PC al autómata en cada iteración, esta inclusión es muy sencilla, basta con añadir una
entrada en la tarea Inicialización (véase sección 3.3), para el parámetros
nuevo que se quiera añadir, luego dentro del bloque de función Actuación,
añadirlo como una variable externa y usar dicha variable en el código. Hay
que tener en cuenta que el lenguaje de programación del autómata, no es el
C, sino el Pascal, que son bastante parecidos, pero hay que tener en cuenta
las diferencias a la hora de escribir el código. En la Figura 5.3 se puede apreciar una captura del archivo Levineu cuat.cxp, donde aparecen las distintas
tareas y bloque de función que lo componen.
Figura 5.3: Captura de pantalla de CX-Programmer.
5.3
Programas en C++
Como se ha explicado en el capítulo anterior (capítulo 4), la simulación
de la red, se ha implementado mediante un DLL en LABView, para que
mediante un simple llamada en el diagrama de bloques principal, se simulase el paso de la trama portadora de la señal de control, por una red con
parámetros de calidad de servicio manipulables desde el mismo panel frontal.
En definitiva, se ha programado en C++ dos funciones cuantizacion.cpp
y retardo variable.cpp, procedamos a detallarlas:
PROGRAMAS EN C++
5.3.1
39
cuantizacion.cpp
Esta función es la encargada de cuantizar la medida de la altura, que
el sistema de visión entrega al diagrama de bloques principal, esta medida se entrega en principio con una precisión de una milésima. La función
cuantizacion.cpp acepta como parámetros de entrada una variable double
portando la altura original, y otra con la precisión deseada después de la
cuantización. Dentro de la función se crea otra variable double que es la que
almacenará el resultado, y se devolverá al final de la función. El resultado
es, simplemente, la parte entera de la división de la medida por la precisión,
multiplicado luego por la precisión:
valor_cuant=int(valor/precision);
valor_cuant=valor_cuant*precision;
la división entera es una operación que ofrece C++, cuyo resultado no
es más que la parte entera de una división normal.
La llamada a esta función se hace justo después de recibir la medida de
la altura, en cada iteración
5.3.2
retardo variable.cpp
Esta función es la encargada de simular los otros dos efectos del control a través de red; el retardo variable y la probabilidad de pérdida, y se le
llama justo después de preparar la trama para su envío hacia el autómata,
acepta como parámetros de entrada, una cadena de caracteres con la trama
en cuestión, y dado que las cadenas de caracteres en C acaban con un 0,
se tiene que añadir un carácter nulo al final de la trama antes de pasársela
a la función, también se entrega un double con la probabilidad de pérdida
deseada, y otro double procedente del reloj del sistema, que es un bloque
de LABView cuya función, como su nombre indica, es la cuenta del tiempo
del sistema, este reloj va a ser la referencia tanto para meter como para
sacar tramas en la red ficticia. Esta función, como cabe esperar, devuelve
también otro puntero a carácter (*char), con la trama portadora de la señal de control cuyo de tiempo de salida corresponde al tiempo del sistema
(véase el esquema del funcionamiento en Figura 4.1).
En esta función lo primero que se hace es definir la estructura de cada
nodo de la lista, llamada nodo, con su información relativa; tiempo de entrada, tiempo de salida, la trama que porta, y dos punteros apuntando al
nodo anterior y al posterior, ya que se trata de una lista doblemente enlazada. A continuación se definen una serie de variables estáticas2 (static), y
se decide que sean estáticas para que puedan mantener su valor de una llamada a otra, ya que están destinadas tareas que afectan a toda la simulación.
2
Una variable estática es aquella que mantiene su valor de una ejecución a otra.
40
PROGRAMAS DESARROLLADOS
Acto seguido se llama a la función rand que devuelve un número aleatorio en función de lo que se le especifique, en este caso un número aleatorio
de 0 a 100, que mediante su comparación más adelante con la probabilidad de pérdida deseada, se decide si la trama se va a perder o no, esto a
la larga consigue que la probabilidad de pérdida se cumpla. Mediante otra
llamada a la función rand, esta vez para que genere un numero aleatorio
de 0 a retardo_max, que será el retardo que se le añadirá a la trama de la
iteración en cuestión, de este modo se consigue un retardo variable aleatorio.
Una vez decidido si la trama se pierde o no, en caso de que no se pierda,
se procede a la reserva dinámica de memoria para asignarle un trozo de
memoria, mediante el comando malloc, acto seguido, se localiza el puesto
que le corresponde a la trama, en función de su tiempo de salida, nótese
que en la lista estarán ordenados de menor a mayor tiempo de salida, esta
localización se realiza usando unas variables auxiliares que habíamos creado
antes. Una vez localizado el puesto que debe ocupar, se procede a modificar
los punteros, tanto del nodo en cuestión como del anterior y posterior, para
que la lista quede bien ordenada. En caso, de que se decida que la trama se
ha de perder, no se hace.
Por último, y antes de salir de la función, se procede a sacar la trama, si corresponde, cuyo tiempo de salida va a expirar, esta trama siempre
coincidirá con la primera de la lista, por lo que, simplemente se mira si el
tiempo de salida del primer nodo de la lista es igual o inferior al tiempo del
sistema, si es así, pues se devuelve la trama de dicho nodo, eliminándose tal
nodo y quedando el segundo como primero, si no, no se hace nada. Antes
de devolver la trama (cadena de caracteres) de vuelta al LABView, se le
añade al final el tiempo en el que ha entrado, para así en LABView poder
tener una monitorización del retardo que sufre cada trama.
Cabe destacar que hubo que implementar varias funciones de prueba
para conseguir que la definitiva funcione tal como se deseaba, ya que hubo
muchos problemas con errores en el orden de la lista de tramas, errores con
la reserva dinámica de memoria, que si no se reservaba y, lo que es más
importante, se liberaba adecuadamente, LABView se bloqueaba, ya que se
produce una especie de violación de memoria.
Bibliografía
[1] J.J. Caparrós Jiménez: Construcción, identificación y modelado de un
sistema de levitación neumática. Escuela Superior de Ingenieros, Universidad de Sevilla, 2005. Citado en las páginas 4, 17, 18, 21, 35, 58
y 61.
[2] Fernando Borja Breña Lajas: Diseño de estrategias de control para un
sistema de levitación neumática. Escuela Superior de Ingenieros, Universidad de Sevilla, 2005. Citado en las páginas 4 y 16.
[3] Omron: Manual del sensor de visión 1. Manual 1: Setup Manual, 2002.
Citado en las páginas 16 y 17.
[4] Omron: Manual del sensor de visión 2. An expert Manual of the F150.
Manual 2: Expert Menu Opration Manual, 2002.
Citado en las
páginas 16 y 17.
[5] Omron: Manual del Autómata CJ1M. CJ1M User’s Manual.
en la página 17.
Citado
[6] Omron: Manual del Variador de velocidad. Varispeed F7User’s Manual.
Citado en la página 17.
[7] José Antonio Pérez García de Castro: Plataforma de control remoto
aplicada a un sistema de levitación neumática. 2005. Citado en las
páginas 19, 20, 35 y 37.
[8] The C++ Resources Network.
página 62.
www.cpluplus.com.
Citado en la
[9] National Instruments: LABView User Manual, 2003.
página 62.
Citado en la
[10] Frank Mittelbach, Michel Gossens, et al.: The LATEX Companion: Tools
and Techniques for Computer Typesetting. Addison-Wesley, 2nd edition, 2004. Citado en la página 62.
[11] Helmut Kopka and Patrick W. Daly: A GUIDE TO LATEX: Document Preparation for Beginners and Advanced Users. Addison-Wesley,
3rd edition, 1999. Citado en la página 62.
71
72
BIBLIOGRAFÍA
[12] Donald E. Knuth: The TEXbook. Addison-Wesley, 1984.
la página 62.
Citado en
Descargar