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.

Share
PDF24    Enviar artículo en formato PDF   

20 Comments to “LabView 3.1: crear DLL en C con Dev-C++ y llamada en LabView”

  1. yelinna says:

    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!

  2. cristina says:

    muchisimas gracias! Me ha sido realmente util.

  3. César Jiménez says:

    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.

  4. weeberp says:

    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).

  5. Joe kenjin Uyuni says:

    Esta bueno pero, como usar esa libreria con el mismo dev con un lengauje c o c++

  6. weeberp says:

    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.

  7. Ray says:

    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 !

  8. weeberp says:

    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

  9. martin says:

    me podrias explicar un poco mejor como puedo pasar de lenguaje c++ a labview?

  10. weeberp says:

    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.

  11. federico says:

    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

  12. weeberp says:

    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.

  13. Fabian says:

    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.

  14. weeberp says:

    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.
    *

  15. Fernando_H says:

    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.

  16. weeberp says:

    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.