Você está na página 1de 10

Cmo generar un archivo DLL desde una funcin MATLAB Guin que desea ejecutar en LabVIEW 1.

Requisitos bsicos 1.1 Asegrese de que dispone: MATLAB Compiler C / C + + compilador. La mayora de la gente puede permitirse el lujo de comprar MS Visual C / C + + as que por qu no probar (por ejemplo: Open Watcom http://www.openwatcom.org/) 1.2 Asegrese de que el compilador de MATLAB y C / C + + compilador son marcha: Pruebe MathWorks nota tcnica 1621 (Http://www.mathworks.com/support/technotes/1600/1621.shtml). Esta nota debe darle suficiente informacin acerca de cmo configurar el compilador de MATLAB y C / C + + compilador. 2. Un ejemplo simple: El problema de generar una dll de MATLAB para trabajar en LabVIEW es que el compilador MATLAB requiere datos especiales tipos (por ejemplo, mxArray). Por lo tanto, est obligado a escribir una especial 'Funcin de contenedor' que interconecta el MATLAB genera cdigo fuente con cdigo ANSI C ms "estndar". El siguiente ejemplo ilustra el procedimiento. El cdigo ha sido implementado utilizando MATLAB 5.3 MATLAB Compiler 2.0, Open Watcom 1.0 y LabVIEW 6.1. 2.1 Escriba la siguiente funcin de cdigo de m y guardar como foo.m: funcin y = foo (x) y=2*x 2.2 Compilar a cdigo 'C': Escriba el siguiente comando en el MATLAB sistema: >> Mcc-t-LC-W lib: foolib-h foo.m Esto generar los siguientes archivos: foo.c: contiene la implementacin de foo (Mfoo) y el funciones de interfaz (mlfFoo, mlxFoo)

foo.h: contiene los prototipos de mlfFoo y mlxFoo


Pgina 2

foolib.c: contiene las implementaciones de foolibInitialize y foolibTermintate, necesaria para inicializar y terminar mlfFoo foolib.h: contiene los prototipos de mlxFoo, foolibInitialize y foolibTerminate. Foolib.exports: contiene los smbolos para la exportacin en la dll. 2.3 Crear foo_wrapper.c. Esta es la funcin de contenedor que se permitir el uso de la aplicacin de C foo.m. El cdigo est en la lista y comentados a continuacin. / * Este archivo foo_wrapper.c * / # Include "matlab.h" # Include "foodll.h" # Include "matrix.h" / Definicin de la funcin de envoltura principal / wrapper_main doble (double * in1) { / / Declarar variables para entregar resultados doble salida; / / Cree dos punteros de tipo mxArray para guardar las entradas y salidas mxArray in1_ptr *, * out1_ptr; / / Asignar puntero de entrada a un 1 por 1 matriz de doble, bienes in1_ptr mxCreateDoubleMatrix = (1,1, mxREAL); / / Mover los datos a partir de la entrada en el puntero relleno (mxGetPr (in1_ptr), in1, 1); / / Inicializar aplicacin foo foolibInitialize (); / / Pasar valores a mlfFoo y recibir en la variable de tipo mxArray out1_ptr = mlfFoo (in1_ptr); / / Terminar aplicacin foo foolibTerminate (); / / Pasar de tipo mxArray duplicar tipo relleno (in1, mxGetPr (out1_ptr), 1); / / Mover datos de salida variable a = * in1; / / Valor de retorno regresar (a); } relleno de huecos (double * a, * en doble, int size) { / / Esta funcin mueve datos de un tipo a otro

int i; for (i = 0; i <tamao, i + +) a [i] = a [i]; }


Pgina 3

2.4 Crear foodll.h que contiene prototipos de funciones en foo_wrapper.c. El cdigo est en la lista de abajo. / / Este archivo foodll.h wrapper_main doble (double * in1); relleno de huecos (double * a, * en doble, int size); 2.5 Aadir punto de entrada a foolib.exports: aada la siguiente lnea al archivo foolib.exports: wrapper_main 2.6 Construir mediante el siguiente comando en MATLAB: >> Mbuild-link compartido foo_wrapper.c foo.c foolib.c foolib.exports 2.7 Usted ha generado ahora un archivo llamado foo_wrapper.dll, que contiene el wrapper_main.c funcin entre otros. Use este funcin de lo que la entrada (argumentos) y la salida segura (regreso valor) son de tipo double de 8 bits. Adems, nota que debe pasar un puntero al valor y no el valor en s a la funcin. 3. Ejemplos avanzados Los siguientes son ejemplos ms avanzados que ilustran cmo pasar matrices de LabVIEW a una funcin MATLAB, as como cuando se tienen varios archivos-m que necesitan ser compilados y insertada en un archivo DLL. 3.1 La multiplicacin de dos matrices Vamos a seguir un enfoque ms sistemtico para el desarrollo de la DLL en MATLAB para interactuar con LabVIEW. En este ejemplo se ha sido desarrollado utilizando MATLAB ver. 6.5 R13 con MATLAB Compiler 3.0, LabVIEW 7.0 Express y MSVC 6.0. 3.1.1 Escriba la siguiente funcin de cdigo de m y guardarlo como ab.m funcin [c] = ab (a, b); c = a * b;

3.1.2 Compilar cdigo C introduccin: >> Mcc-t-LC-W lib: ablib-h ab.m libmmfile.mlib Esto genera archivos similares como los descritos en la primera ejemplo, y no sern discutidos aqu. El principal punto de
Pgina 4

preocupacin ser la aprobacin de las matrices de C estndar MATLAB mxArray y viceversa. 3.1.3 Cree la funcin de contenedor. Para hacer esto, puede comenzar a cero o utilizar LabVIEW para ayudarle a escribir el prototipo, por lo que evitar errores y tienen tipo de datos compatible. Por favor, consulte Manual de estantera LabVIEW: Utilizar cdigo externo en LabVIEW. Guarde el archivo como atimesb.c. / * Llamar archivo de origen Library * / # Include "matlab.h" # Include "matrix.h" # Include "ablib.h" void atimesb (double a [], int num_rows cortos, NUM_COLS short int, double b []); relleno de huecos (double * a, * doble en, filas int, int cols); void atimesb (double a [], int num_rows cortos, NUM_COLS short int, double b []) { int i = 0, j = 0; / / Crear punteros de las dos matrices mxArray a_ptr *, * b_ptr; / / Asignar puntero a matrices de tamao adecuado a_ptr = mxCreateDoubleMatrix (num_rows, Num_Cols, mxREAL); b_ptr = mxCreateDoubleMatrix (num_rows, Num_Cols, mxREAL); / / Llenar los datos en mxArray puntero relleno (mxGetPr (a_ptr), a, Num_Cols, num_rows); relleno (mxGetPr (b_ptr), b, Num_Cols, num_rows); / / Inicializar la aplicacin matlab ablibInitialize (); / / Pasar valores a mlfAb a_ptr = mlfAb (a_ptr, b_ptr); / / Terminar la aplicacin matlab ablibTerminate (); / / Mover datos de tipo mxArray a la salida

llenar (a, mxGetPr (a_ptr), num_rows, Num_Cols); / Memory / Clean mxDestroyArray (a_ptr); mxDestroyArray (b_ptr); }
Pgina 5

relleno de huecos (double * a, * doble en, filas int, int cols) { int i = 0, j = 0; / / Rellenar los datos for (i = 0; i <filas, i + +) { for (j = 0, j <cols; j + +) { a [(i * cols) + j] = en [(j * filas) + i]; } } } ANSI C utiliza de las filas de almacenamiento, mientras que MATLAB utiliza la columnaimportante de almacenamiento. Esto implica bsicamente que los datos tienen que ser almacenada en un orden diferente de interpretar correctamente. Por ejemplo, si en ANSI C una matriz se define como A, y los datos se pasan en el tipo mxArray en el mismo orden, el MATLAB interpretar los datos como un T , Y viceversa. Para obtener ms informacin sobre este por favor vaya a: manual de MATLAB C Math Library, en la seccin de matrices numricas. Disponible en: http://www.mathworks.com/access/helpdesk_r12p1/help/pdf_doc / Mathlib/cmath_ug2b.pdf 3.1.4 Aadir punto de entrada de la funcin de ablib.exports: Agregue la lnea siguiente a este archivo: atimesb 3.1.5 Por ltimo, crear la DLL mediante el comando siguiente: >> Mbuild-link compartido atimes.c ab.c ablib.c ablib.exports 3.2 Diseo de un controlador predictivo Me referir muy brevemente a este ejemplo sealando slo el

las diferencias con los otros ejemplos y el listado slo el importante partes del cdigo escrito. El archivo DLL se genera a partir de tres archivos: smacmpc.m, mpcdesign.m y constraintsdesign.m. El objetivo de esta DLL es disear un modelo predictivo Controller, que es el clculo de las matrices involucradas en el on-line optimizacin. Esta DLL, no realiza la optimizacin, slo ofrece las matrices, dadas las matrices del sistema (A, B, C, D), las restricciones (P, P, F, C, E, y e), la prediccin y el control horizontes (Hp y Hu), y la diagonal de los pesos de costos (q y r).
Pgina 6

El smacmpc.m archivo es el principal punto de entrada, en el que la otra dos funciones se llaman. La caracterstica principal de este ejemplo es que las todas las funciones devolver ms de un argumento. Por favor, preste atencin a la file wrapper para ver cmo manejar esta situacin. 3.2.1 Recopilacin: Los archivos deben ser compilados juntos para generar un archivo objeto y no varios. Escriba lo siguiente en el MATLAB lnea de comandos: >> Mcc-t-LC-g-W lib: mpclib-h smacmpc.m constraintsdesign.m mpcdesign.m libmmfile.mlib 3.2.2 El uso de la opcin-g permite para la depuracin en MSVC, aunque esto y otras opciones de depuracin no se discuten aqu. Por favor, consulte: http://www.mathworks.com/support/solutions/data/27671.shtml y el compilador de MATLAB para el IDE y con MSVC que proporciona un entorno de desarrollo totalmente integrado. 3.2.3 La funcin de contenedor: mpcdll.c. La parte importante aqu es cmo los mltiples salidas de la funcin mlfSmacmpc se manejan. / * Llamar archivo de origen Library * / # Include "matlab.h" # Include "matrix.h" # Include "mpclib.h" void mpc (double a [], double b [], doble c [], double d [], short int n, short int m, l corto int, short int n1, n2 short int, short int n3, Hp doble, doble Hu, doble qu [], doble ru [], doble P [], doble p [],

doble F [], doble f [], doble E [], dobles e [psi], dobles [], doble theta [], doble tau [], doble Sr [], doble cuadrados [], doble W [], doble w1 [], doble w2 [], doble w3 []); relleno de huecos (double * a, * doble en, filas int, int cols); void mpc (double a [], double b [], doble c [], double d [], short int n, short int m, l corto int, short int n1, n2 short int, short int n3, Hp doble, doble Hu, doble qu [], doble ru [], doble P [], doble p [], doble F [], doble f [], doble E [], dobles e [psi], dobles [], doble theta [], doble tau [], doble Sr [], doble cuadrados [], doble W [], doble w1 [], doble w2 [], doble w3 []) { / * Esto explica los argumentos de esta funcin: a, b, c y d son las matrices del sistema sobre el que se construye el predictor n, m y l estn a la orden, el nmero de entradas y el nmero de salidas, respectivamente * / / / Crear punteros
Page 7

mxArray a_ptr *, * b_ptr, c_ptr *, * d_ptr; mxArray qu_ptr *, * ru_ptr, hp_ptr *, * hu_ptr; mxArray * psi_ptr, theta_ptr *, * tau_ptr; mxArray Sr_ptr *, * Sq_ptr; mxArray P_ptr *, * p_ptr, F_ptr *, * f_ptr, E_ptr *, * e_ptr; mxArray W_ptr *, * w1_ptr, w2_ptr *, * w3_ptr; / / Asignar puntero a matrices de tamao adecuado a_ptr mxCreateDoubleMatrix = (n, n, mxREAL); b_ptr mxCreateDoubleMatrix = (n, m, mxREAL); c_ptr = mxCreateDoubleMatrix (l, n, mxREAL); d_ptr mxCreateDoubleMatrix = (l, m, mxREAL); P_ptr mxCreateDoubleMatrix = (n1, l, mxREAL); p_ptr mxCreateDoubleMatrix = (n1, 1, mxREAL); F_ptr = mxCreateDoubleMatrix (n2, m, mxREAL); f_ptr = mxCreateDoubleMatrix (n2, 1, mxREAL); E_ptr = mxCreateDoubleMatrix (n3, m, mxREAL); e_ptr = mxCreateDoubleMatrix (n3, 1, mxREAL); qu_ptr mxCreateDoubleMatrix = (l, 1, mxREAL); ru_ptr = mxCreateDoubleMatrix (m, 1, mxREAL); hp_ptr = mxCreateDoubleScalar (Hp); hu_ptr = mxCreateDoubleScalar (Hu); psi_ptr = mxCreateDoubleMatrix (l * Hp, n, mxREAL); theta_ptr = mxCreateDoubleMatrix (l * Hp, m * Hu, mxREAL); tau_ptr = mxCreateDoubleMatrix (l * Hp, m, mxREAL);

Sr_ptr = mxCreateDoubleMatrix (m * Hu, Hu m *, mxREAL); Sq_ptr = mxCreateDoubleMatrix (l * Hp, l * Hp, mxREAL); W_ptr mxCreateDoubleMatrix = (n1 * Hp + n2 * n3 * + Hu Hu, Hu m *, mxREAL); w1_ptr mxCreateDoubleMatrix = (n1 * Hp + n2 * n3 * + Hu Hu, m, mxREAL); w2_ptr mxCreateDoubleMatrix = (n1 * Hp + n2 * n3 * + Hu Hu, n, mxREAL); w3_ptr mxCreateDoubleMatrix = (n1 * Hp + n2 * n3 * + Hu Hu, 1, mxREAL); / / Llenar los datos en mxArray puntero llenar (mxGetPr (a_ptr), a, n, n); relleno (mxGetPr (b_ptr), b, m, n); relleno (mxGetPr (c_ptr), c, n, l); relleno (mxGetPr (d_ptr), d, m, l); relleno (mxGetPr (P_ptr), P, L, n1); relleno (mxGetPr (p_ptr), p, 1, n1); relleno (mxGetPr (F_ptr), F, m, n2); relleno (mxGetPr (f_ptr), f, 1, n2); relleno (mxGetPr (E_ptr), E, m, n3); relleno (mxGetPr (e_ptr), e, 1, n3); relleno (mxGetPr (qu_ptr), qu, 1, l); relleno (mxGetPr (ru_ptr), ru, 1, m); / / Matlab aplicacin mpclibInitialize (); psi_ptr = mlfSmacmpc (& theta_ptr, y tau_ptr, y Sr_ptr, y Sq_ptr, y W_ptr, y w1_ptr, y w2_ptr, y w3_ptr, a_ptr, b_ptr , C_ptr, d_ptr, hp_ptr, hu_ptr, qu_ptr, ru_ptr, P_ptr, p_ptr, F_ptr, f_ptr, E_ptr, e_ptr); mpclibTerminate (); / / Mover datos de tipo mxArray a la salida llenar (psi, mxGetPr (psi_ptr), l * Hp, n); relleno (theta, mxGetPr (theta_ptr), l * Hp, m * Hu); relleno (tau, mxGetPr (tau_ptr), l * Hp, m); llenar (Sr, mxGetPr (Sr_ptr), m * Hu, Hu m *); relleno (Sq, mxGetPr (Sq_ptr), l * Hp, l * Hp); relleno (W, mxGetPr (W_ptr), n1 * n2 + Hp * Hu + n3 * Hu, Hu m *);
Pgina 8

relleno (w1, mxGetPr (w1_ptr), n1 * Hp + n2 + n3 * Hu Hu *, m); relleno (w2, mxGetPr (w2_ptr), n1 * n2 + Hp * Hu + n3 * Hu, n); relleno (w3, mxGetPr (w3_ptr), n1 * Hp + n2 + n3 * Hu Hu *, 1); mxDestroyArray (a_ptr);

mxDestroyArray (b_ptr); mxDestroyArray (c_ptr); mxDestroyArray (d_ptr); mxDestroyArray (qu_ptr); mxDestroyArray (ru_ptr); mxDestroyArray (hp_ptr); mxDestroyArray (hu_ptr); mxDestroyArray (psi_ptr); mxDestroyArray (theta_ptr); mxDestroyArray (tau_ptr); mxDestroyArray (Sr_ptr); mxDestroyArray (Sq_ptr); mxDestroyArray (P_ptr); mxDestroyArray (p_ptr); mxDestroyArray (F_ptr); mxDestroyArray (f_ptr); mxDestroyArray (E_ptr); mxDestroyArray (e_ptr); mxDestroyArray (W_ptr); mxDestroyArray (w1_ptr); mxDestroyArray (w2_ptr); mxDestroyArray (w3_ptr); } relleno de huecos (double * a, * doble en, filas int, int cols) { int i = 0, j = 0; / / Rellenar los datos for (i = 0; i <filas, i + +) { for (j = 0, j <cols; j + +) { a [(i * cols) + j] = en [(j * filas) + i]; } } } 3.2.4 Por ltimo aadir mpc al archivo mpclib.exports. 4. Informacin adicional se puede encontrar en: 4.1 http://www.mathworks.com/support/solutions/data/25176.shtml 4.2 http://www.mathworks.com/support/solutions/data/23932.shtml 4.3

http://www.mathworks.com/support/solutions/data/27671.shtml 4.4 http://zone.ni.com/devzone/conceptd.nsf/webmain/5CF9A9FFD7 74028586256869005FF2ED? Opendocument

Você também pode gostar