LabView 3.1: crear DLL en C con Dev-C++ y llamada en LabView
Hola, hoy voy a escribir un ejemplo fácil fácil de un camino descubierto para crear DLL (Bibliotecas de Enlace Dinámico) en C y luego poder llamarla en LabView, el ejemplo es una ventana emergente de “Hola Mundo”. Más problema es para mi crear una DLL (porque lo único que dado es compilar directamente para código maquina las librerÃas fijas), que llamar una función de C en LabView, ya que esto se hace de manera sencilla con el VI Call Library Function Node.
En la página de National Instruments existen tres páginas de como hacer una llamada, crear un archivo C y crear el archivo DLL, he hecho los dos primeros pasos, pero para el tercero hace falta el programa Microsft Visual C++ 6.0 que no tengo, asà que aún no sacaré los pasos para hacerlo, os dejo la página aquà de mientras.
TodavÃa no os puedo dejar las normas para crear vuestras propias librerÃas y ejecutarlas, pero espero que os sirva este ejemplo para comprender mejor todo este tema de DLL. Supongo que habrá tutoriales de como hacer DLL con Dev, asà que no pretendo que esto sea uno, porque además no me leÃdo todavÃa ninguno y por eso supongo que tengo problemas para compilar mis propios códigos en .c y cabeceras .h y .def. PodeÃs recomendar en un comentario cualquier otro link para ayudar a crear DLL en C/C++ facilmente de cualquier programa y si explica luego algo de LabView muchÃsimo mejor.
- Paso 1: Tener instalado Dev-C++ y crear DLL
El ejemplo que pongo es de la versión 4.9.9.2, podéis ver cual está disponible aquÃ.
Para crear una dll, archivo->nombre->proyecto
Elegir DLL, seleccionar lenguaje en C y poner de nombre de proyecto por ejemplo HelloDll. Debe salir automaticamente al proyecto dos archivos dllmain.c y dll.h . Si se selecciona en C++ salen estos dos arichivos pero sin el ejemplo de Hola Mundo.
Archivo .C (no he remplazado ni la primera lÃnea):
/* Replace “dll.h” with the name of your header */
#include “dll.h”
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>DLLIMPORT void HelloWorld ()
{
MessageBox (0, “Hello World from DLL!\n”, “Hi”, MB_ICONINFORMATION);
}BOOL APIENTRY DllMain (HINSTANCE hInst    /* Library instance handle. */ ,
DWORD reason       /* Reason this function is being called. */ ,
LPVOID reserved    /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;case DLL_PROCESS_DETACH:
break;case DLL_THREAD_ATTACH:
break;case DLL_THREAD_DETACH:
break;
}/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
El archivo .h :
#ifndef _DLL_H_
#define _DLL_H_#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
Pues ya está, ahora no hace falta escribir nada, simplemente vamos a ejecutar->compilar ó Ctrol+F9 ó el icono de cudraditos de colores más arriba a la izquierda y nos generá el DLL. A lo mejor te pide que guardes el proyecto .dev y los archivos generados .c y .h, el DLL será guardado en la misma carpeta o si quieres indicarlo y su nombre en proyecto->opciones de proyecto->construcción podras cambiarlos.
- Paso 2: Creación del VI
Se coge un nuevo VI, vamos al bloque de diagrama, y se coloca primero el vi Call Library Function Node, se puede encontrar en conectivity->libraries & executables. Y ya esta, asà de facil, pero bueno para que el RUN funcione mejor lo colocaremos dentro de una estructura de caso en la cara True, controlado con un boton boleano, y todo dentro de un bucle Loop que puede ser controlado la parada tambien con el mismo botón.
- Paso 3: Rellenar Call Library Function Node
Se le da dos veces al VI o segundo botón configure:
- En Library Name or Path se pone la ruta de la DLL
- En función saldrá HelloWorld y sino la escribimos (pero ya vamos mal creo)
- Calling Conventions ponemos en C
- Parameter void eso lo escribimos nosotros (es decir que no devuelve nada)
- Type void.
Y ya está, abajo aparece la forma de la función void HelloWorld(void); Si no fuera una función de tipo no devolver nada el VI cambiarÃa de forma para poder conectar entradas o salidas.
Se acabó, a ejecutar el programa y suerte.


English















































Hola
Yo las Dlls las hago con el TurboExploer http://www.turboexplorer.com/ que es gratuito, pero pesa 200 megas. También se pueden hacer con el compilador gratuito que ofrece la Borland (el 5.5).
Saludos!
muchisimas gracias! Me ha sido realmente util.
Hola que tal!!
Quiero conectar una cmaara canon power shot g9 y obtener las imagen a través de una ventana de LAbview, al parecer necesito algunas archivos dll para realizar este tipo de intefaces….me podrias ayudar o dar unos tips.
César Jiménez Calvillo.
Hola César.
Lo primero que veo de forma más fácil es ¿tu cámara tenÃa un software para verla como webcam o al conectarla se puede ver en “Mi PC” como webcam?, si es asà seguro que puedes utilizar el código del post Labview Vision 0.5: código sencillo de cámara USB
y en el index aparecerá el nombre de la cámara para poder ser seleccionada.
Si no es asÃ, no tiene software o no funciona tu cable usb (que seguro que se conecta asÃ) búsca un driver genérico que te sirva como webcam, o algún programa de fotos que importe directamente de cámara de fotos… no sé, el caso es que si ves vÃdeo a través del PC con ella, seguro que aparece enumerada en la lista.
No creo que te sea más fácil encontrar (mucho menos hacer) una dll que contenga una función que llame a la secuencia de imágenes que actúe como vÃdeo. Si la encuentras pues ya sabes llamarla a través del función node (averiguando que tipo de dato hay que llamar a la función o te devuelve, que si array, que si puntero array, etc… para definirla al llamarla).
Esta bueno pero, como usar esa libreria con el mismo dev con un lengauje c o c++
Pues como cualquier libreria, pones #include libreria (entre triangulo o comillas según la ubicación del archivo si carpeta por defecto o no) y ya esta, llama a tu función en el programa.
Es más he descubierto que poniendo solamente en el archivo .c delante de la funcion que queremos exportar, cuando definimos las funciones al principio, la palabra clave __declspec (dllexport) ya es funcion publica; luego se le da al botón de crear dll del programa que estemos utlizando para la compilación. Esta palabra clave puede variar ligeramente me parece de un programa a otro, pero en google se ve rapidamente.
Hola oye puedo hacer un programa en builder y usarlo como describes en el labview 6.1? tengo que hacer un programa en labview pero se me hace mas complicado estoy acostumbrado a usar siempre el lenguaje C
Agradeceria mucho me sacaras de la duda !
De antemano gracias !
Puedes usar cualquier programa para hacer DLL, si sabes y te lo permite hacer. Para comprobrar que puse las funciones de forma públicas yo utilizo el programita Dependecy Walker.
Y si en Labview 6.1 puede hacer lo mismo para llamar una dll, creo que cambia la forma de hacer y el lugar desde la versión 7, pero tienes el Call Libray Function Node igualmente. Tambien exite el Code Interfaz Node (CIN) que tambien sirve para ejecutar código, pero la verdad que por mucho que he leido no he conseguido enterder como funciona.
Tambien recuerda que puedes utilizar código C o lenguaje de la misma forma estructurado con la estructura formula node, pero no se podrian poner includes aquà dentro, ni llamadas a funciones… Y en lenguaje matlab con MathScrpt Node, pero para este creo que hace falta el LabView que lo incluya un full…
bueno aquà hay un manual en ingles de llamar código externo con labview creo 6.0 y 6.1, vamos como utilizar los node que decia antes pero de forma más larga, tambien creando la dll desde el principio…
http://www.ni.com/pdf/manuals/370109a.pdf
me podrias explicar un poco mejor como puedo pasar de lenguaje c++ a labview?
Pasar pasar no se pasa, se añade puedes añadir código.
- Si no son funciones, ni saltos, ni nada raro solo estructuras if.. else..for… entonces Formula Node.
- Si son funciones y un programa más elaborado crea una DLL y llamalá con Call Libray Function Node (el ayudante Tools»Import»Shared Library (.dll) viene muy bien).
Code Interfaz Node no sé como se utiliza, aquà un ejemplo: Ejemplo de CIN con LabVIEW y MS Visual C++ 5.0 .
External Code for LabVIEW – CIN / DLL – Starting Point
- MathScript Node para codigo de matlab .m y sus funciones, hace falta tener matlab.
- Quieres mas C? supongo que pasate a LabWindows CVI.
hola queria saber si exite la posibilidad de hacer alreves, a lo que voy es que si puedo obtener lo que hago en Labview a C. mi pregunta va es que lo que yo hago en Labview lo puedo utilisar en un micro
Ya, esa pregunta me la he hecho yo varias veces, pero lo que he averiguado hasta hora, siguiendo la lÃnea de FPGA es que creo que NO.
Para programar una FPGA si se programa todo con LabView y se le da a compilar para convertir en un archivo VHDL o uno que acepte la FPGA (igual de fácil que para el NXT), pero solo es válido para 4 ó 5 modelos de FPGA y el módulo cuesta bastante dinero. Supongo que para la versión de micros ¿ARM? no me acuerdo pasará lo mismo.
Como mucho puedes conseguir como se define un boleano, cluster… en C. es decir si conectas un cluster (por ejemplo que tiene más cosas y complicado) a un Call Library Function Node (primero tienes que entrar dentro y poner en los parámetros como tipo Adpat Type) le das con el segundo botón para ver las opciones que tienen los VIs y le das a Create .C File. Pero bueno ya te digo que solo consigues el comienzo con las cabeceras de un archivo .C para que tu rellenes todo el código.
Como siempre está la opción de LabView CVI, pero esto es como programar en C (nada visual) y se va llamando las librerÃas de labview desde botones de interface a subVI.
Hola,
Soy novato en cuanto temas de DLL, pero quisiera saber si en cuanto a los archivos MEX de Matlab, que tengo entendido son parecidos a las DLL, tambien puedo usarlos en LabVIEW. Es decir, tengo un codigo de C q es complejo y ha sido utilizado en Matlab como archivos MEX, y quiero usarlo en LabVIEW. No se si sea posible o si deba mejor convertir dicho codigo de C a una DLL con los metodos que has propuesto.
Pues hasta ahora no habÃa leÃdo nunca nada sobre archivos como dll en Matlab llamados MEX. pero buscando en NI.com con las palabras claves “mex matlab” me ha salido lo siguiente:
*de VI a mex utilizando NI LabVIEW Math Interface Toolkit Calling LabVIEW VIs from The MathWorks Inc. MATLAB® software environment
* Aquà creo que pone conexión entre simulink y labview NI LabVIEW Simulation Interface Toolkit
Para utilizar los mex en LabView no ha salido nada asà rápidamente y nunca me salió en la lectura de conectar librerÃas con LabView, pero claro nunca me habÃa salido lo contrario, ni de normal los archivos de autoCAD… Asà que si puedes compilas el C con cualquier programa y hacerlo Dll es una solución.
*
[...] http://elblogroboticodepedro.weebercorp.com/2009/02/03/labview-31-crear-dll-en-c-con-dev-c-y-llamada… [...]
Bueno despuées que se logra crear la dll para ser invocadas en labview no importa en cual compilador usemos, se abre un mundo de posibilidades pero tambien aparece un universo de problemas, sobre todo cuando lo que queremos hacer es más que el “hola mundo”. Yo he trabajado duro para usar dll’s compiladas a partir de librerias de redes neurunales artificiales para ser usadas en labview.
Primer problema, los tipos de datos; cuando se necesita que las librerias dll pasen como parametros tipos de datos complejos como grandes estructuras c++, la tarea es un poco angustiosa, para lidiar un poco con estos obstáculos, cree funciones de enlace en c++ las cuales pueden manejar las estructuras de datos c++ y hacerlas mas comestibles para labview.
Segundo problema, manejo de memoria; algunas veces, sobre todo cuando se empieza en la programación, se tiende a pensar “si ha compilado es porque esta bien”, pero si creas un bucle en labview donde se invoca una función miles de veces por segundo, alojada en un dll y si dicha funcion no hace un adecuado uso de la memoria simplemente puedes volver inestable el sistema. Es asi que despues de estar feliz de ver como la RNA funcionaba perfecto, cai en decepcioncuando en unos segundos vi el como se detenÃa todo y el ordenador se volvia lento. Revisé todo el codigo c++, los destructores, los constructores, los llamados new y delete, pero no encontre problema alguno.
Estoy de acuerdo contigo, la verdad que como no se meta bien los datos a una dll en LabView, si te pasas con el tamaño, apuntas otra cosa… de repente hace crack el labview y se cierra de repente. Y lentitud claro, por lo menos en 8.6.1.
[...] http://elblogroboticodepedro.weebercorp.com/2009/02/03/labview-31-crear-dll-en-c-con-dev-c-y-llamada… [...]
[...] http://elblogroboticodepedro.weebercorp.com/2009/02/03/labview-31-crear-dll-en-c-con-dev-c-y-llamada… [...]