LABORATORIO DE CONTROL POR COMPUTADOR. 4o CURSO INGENIERÍA DE TELECOMUNICACIÓN. PRÁCTICA 5: LABVIEW-Bibliotecas de funciones de enlace dinámico(DLL). Aplicación a un PID. 1. Objetivos Esta práctica tiene como objetivo aprender a crear DLL’s (bibliotecas de funciones de enlace dinámico), y a hacer uso de ellas en LabView. 2. Creación de una DLL La DLL es una biblioteca de funciones de enlace dinámico. Crearemos una dll usando lenguaje C. Serán necesarios los siguientes archivos: cpcdll.def: En él se definen las funciones que va a exportar la dll para que puedan ser usadas por los programas que la carguen. cpcdll.h: En él se incluirán los prototipos de las funciones que componen la biblioteca. En el prototipo de las funciones incluiremos la palabra WINAPI para indicar al compilador el método de llamada a las funciones llevado a cabo. cpcdll.cpp: Se definen las funciones que han sido declaradas en cpcdll.h. 3. Ejemplo de DLL A continuación se van a mostrar los tres ficheros correspondientes a una dll que contiene las funciones suma y resta de dos parámetros. Tanto para la suma como para la resta se han creado dos funciones. En una el paso de parámetros es por valor, y en la otra el paso de parámetros es por referencia, por lo que se hará uso de punteros. © mlm 2008 A continuación se muestra el contenido del archivo cpcdll.def ;-------------------------------------; ; Nombre del Fichero:cpcdll.DEF ; ;-------------------------------------LIBRARY CPCDLL DESCRIPTION ’Ejemplo de Creacion de una DLL’ EXPORTS Sumar Restar Sumar_Ref Restar_Ref @1 @2 @3 @4 Del mismo modo, se adjunta seguidamente el contenido del archivo cpcdll.h /* Nombre del fichero:cpcdll.h*/ /* Funciones prototipo */ #ifdef __cplusplus /* si los ficheros fuente son .cpp*/ extern "C" { #endif double WINAPI Sumar(double Param1, double Param2); double WINAPI Restar(double Param1, double Param2); void WINAPI Sumar_Ref(double *Param1,double *Param2, double *Suma); void WINAPI Restar_Ref(double *Param1,double *Param2, double *Resta); #ifdef __cplusplus /*si el compilador es C++ */ } #endif Y por último el archivo cpcdll.cpp //-------------------------------------------------------------// Nombre del fichero: CPCDLL.CPP // //-------------------------------------------------------------#include <windows.h> #include "cpcdll.h" /* Funcion DllMain es llamada por Windows no por el usuario*/ BOOL WINAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; //DLL_PROCESS_ATTACH satisfactorio } © mlm 2008 /*Funcion Sumar con paso de parametros por Valor*/ double WINAPI Sumar(double Param1,double Param2) { return(Param1+Param2); } /*Funcion Restar con paso de parametros por Valor */ double WINAPI Restar(double Param1,double Param2) { return(Param1-Param2); } /*Funcion Sumar con paso de parametros por Referencia*/ void WINAPI Sumar_Ref(double *Param1,double *Param2, double *Suma) { *Suma=(*Param1)+(*Param2); } /*Funcion Restar con paso de parametros por Referencia*/ void WINAPI Restar_Ref(double *Param1,double *Param2, double*Resta) { *Resta=(*Param1)-(*Param2); } 4. Uso de la DLL en LabVIEW En el siguiente modelo de labVIEW hemos incluido 2 controles y 2 indicadores numéricos. Si se observa el diagrama de conexiones, se verá que se conectan a un bloque que es el que realiza la llamada a las dll’s. Figura 1: Interfaz y Diagrama Si pulsamos 2 veces sobre dicho bloque aparecerá un menú para configurar qué dll se va a cargar, ası́ como qué función se va exportar y cuál es su prototipo (ver figuras 2 y 3). Para ello habrá que declarar los tipos de los distintos parámetros de entrada © mlm 2008 y de salida de la función, ası́ como si el paso de los mismos se hace por valor o por referencia. Figura 2: Menú de configuración. Paso de parámetros por valor Figura 3: Paso de parámetros por referencia © mlm 2008 5. Desarrollo de la práctica Se pide: 1. Añadir a la biblioteca de funciones proporcionada una función que contenga un controlador PI, al cual se le han de pasar los valores Kp, Ki, el valor del error y ha de devolver la señal de control. 2. Sustituir el PID de la practica 2 por el bloque de llamada a la dll. Configurar dicho bloque para que llame a la función PI y se comporte como el bloque de control. 3. Implementar un método de anti-Wind Up. Anti-Wind Up Con el PID básico implementado hay que realizar el siguiente experimento. Introducir una referencia de velocidad inalcanzable (el motor satura) Usar el freno magnético para introducir una perturbación. Llevar la referencia hasta un valor normal de funcionamiento. Tras realizar este experimento se observa un fenómeno de Wind Up. Se pretende implementar un PID (PI) que tenga en cuenta la aparición del fenómeno de wind up como consecuencia de la saturación del motor y de la existencia de un término integral en el controlador. Una forma de evitar este efecto es limitar la salida, otra es solo integrar para errores pequeños. Un esquema práctico de antwindup es el siguiente, donde se mide la salida del sistema (y) y la señal enviada al actuador (u): Figura 4: Interfaz y Diagrama © mlm 2008