Creación y llamada a un DLL de LabVIEW con varios tipos de datos desde LabWindows/CVI

Actualizado el Jun 4, 2021

Ambiente

Software

  • LabVIEW
  • LabWindows/CVI

Este documento explica cómo usar varios tipos de datos diferentes en la creación de un DLL en LabVIEW 6i y cómo llamarlos desde LabWindows/CVI. El proceso de crear un DLL con LabVIEW 6i o llamar al DLL desde LabWindows/CVI no se muestra en detalle en este documento. Para obtener más detalles, consulte los enlaces al final de la página.

Accediendo a Números de LabVIEW 6i desde LabWindows/CVI

Hay varias combinaciones diferentes para pasar números en una función de LabVIEW. LabWindows/CVI puede acceder a estos métodos de manera similar. El siguiente prototipo de función tiene tres entradas numéricas y tres salidas numéricas. In / Out 1 son números enteros de 32 bits, In / Out 2 son números de punto flotante de doble precisión e In / Out 3 son números enteros de 8 bits sin signo. In1 e In3 se configuran para pasar por valor, mientras que In2 se configura para pasar como puntero a valor. Las tres salidas deben pasarse como punteros a valores.

Nota: Puede usar las convenciones de llamadas estándar o C si está llamando a los DLL que usan números de LabWindows/CVI.


Para llamar a la función Numtest, simplemente agregue el archivo de encabezado (.h) y el archivo de biblioteca (.lib) a su proyecto. También incluya el archivo de encabezado en su código fuente (#include <numtest.h>).

Las variables se pueden crear en el código de la siguiente manera:

uInt8 in3 = 5;
float64 in2 = 3,68;
int32 in1 = -100;
uInt8 out3;
float64 out2;
int32 out1;

La llamada real a la función se ve así:

Numtest (in3, & in2, in1, & out3, & out2, & out1);

Tenga en cuenta que In2 y las tres salidas deben tomar la dirección de sus valores, ya que se definieron como punteros a valores cuando se creó el DLL.

Accediendo a booleanos de LabVIEW 6i desde LabWindows/CVI

Al crear un DLL en LabVIEW 6i, solo puede pasar parámetros booleanos como punteros a valores. El siguiente prototipo de función tiene una entrada booleana y una salida booleana.

Nota: Puede usar convenciones de llamada estándar o C si está llamando a los DLL que usan booleanos desde LabWindows/CVI.


Para llamar a la función Booltest, simplemente agregue el archivo de encabezado (.h) y el archivo de biblioteca (.lib) a su proyecto. También incluya el archivo de encabezado en su código fuente (#include <booltest.h>).

Las variables booleanas deben crearse en el código de la siguiente manera:

LVBoolean in;
LVBoolean out;

La llamada real a la función se ve así:

Booltest (& in, & out);

Observe que las variables booleanas deben tomar la dirección de sus valores, ya que se definieron como punteros a valores cuando se creó el DLL.

Accediendo a arreglos de LabVIEW 6i desde LabWindows/CVI

Puntero de datos de matriz

Cuando pasa una matriz como un puntero de datos de matriz, también debe pasar una entrada de longitud que le dice a LabWindows/CVI cuántos elementos hay en la matriz. Cuando configura el parámetro como un Array Data Pointer dentro del panel Define VI Prototype en LabVIEW, un parámetro de entrada de longitud se agrega automáticamente a la función, ya sea una matriz de entrada o salida. Para una matriz de salida, también tiene la opción de utilizar un parámetro longitud de salida, que devuelve un número entero que indica el número de elementos que se devolvieron desde la función a la matriz de salida asociada. El prototipo de función para un VI que tiene una matriz de entrada y una matriz de salida con longitudes de entrada idénticas se ve así:

Nota: Puede usar las convenciones de llamadas estándar o C si está usando LabWindows/CVI.


Para llamar a la función Arraytest, simplemente agregue el archivo de encabezado (.h) y el archivo de biblioteca (.lib) a su proyecto. También incluya el archivo de encabezado en su código fuente (#include <arraytest.h>).

Las variables se pueden crear en el código de la siguiente manera:

double ArrayIn [10];
double ArrayOut [10];

La llamada real a la función se ve así:

Arraytest (ArrayIn, ArrayOut, 10);

Accediendo a LabVIEW 6i Strings desde LabWindows/CVI

Puntero de cadena C

Al usar LabWindows/CVI, se recomienda usar C String Pointers. Para las cadenas de salida, también debe pasar una entrada de longitud y una salida de longitud. La entrada de longitud le dice a LabWindows/CVI cuántos caracteres de la cadena de entrada desea pasar a la función. Cuando configura el parámetro como un puntero de cadena C dentro del panel Define VI Prototype en LabVIEW, un parámetro de entrada de longitud se agrega automáticamente a la función incluso si es una matriz de salida. Para una matriz de salida, también tiene la opción de usar un parámetro longitud de salida, que devuelve un puntero a un número entero que indica el número de caracteres que se devolvieron de la función a la matriz de salida asociada. El prototipo de función para un VI que tiene una matriz de entrada y una matriz de salida se ve así:

Nota: Puede usar convenciones de llamada estándar o C si va a llamar a los DLL que usan matrices de LabWindows/CVI.


Para llamar a la función Stringtest, simplemente agregue el archivo de encabezado (.h) y el archivo de biblioteca (.lib) a su proyecto. También incluya el archivo de encabezado en su código fuente (#include stringtest.h>).

Las variables se pueden crear en el código de la siguiente manera:

char inputstring [5] = "hola";
char outputstring [3];
long inputlength = 3;
long outputlength;

La llamada real a la función se ve así:

Stringtest (inputstring, outputstring, inputlength, & outputlength);

Si esta función simplemente genera la misma cadena que se ingresó, devuelve "hel" ya que la longitud de entrada es 3. El valor devuelto a la variable outputlength también es 3, porque ese es el número de caracteres que se enviaron a la variable outputlength. Observe que la cadena de salida se desreferencia ya que se pasa como un puntero a un valor.

Accediendo a Clústeres de LabVIEW 6i desde LabWindows/CVI

Al crear un DLL en LabVIEW 6i, puede pasar grupos de diferentes tipos de variables fácilmente siempre que los elementos no sean cadenas o arreglos. Se vuelve más complicado cuando se trata de cadenas y matrices, por lo que se recomienda no usarlas. El siguiente prototipo de función tiene una entrada de grupo y una salida de grupo. Los tipos de variables contenidas en el cluster dependen de los tipos de controles e indicadores que están contenidos en el cluster dentro del VI. Los grupos se pasan como punteros a estructuras.

Nota: Puede usar convenciones de llamada estándar o C si va a llamar a los DLL que usan clústeres de LabWindows/CVI.


LabVIEW 6i crea automáticamente un archivo de encabezado (.h) y un archivo de biblioteca (.lib) que usted incluye en su proyecto LabWindows/CVI. Para los clústeres, el archivo de encabezado contiene una definición de tipo de una estructura que contiene las variables que están asociadas con el clúster. Por ejemplo, si el grupo de entrada anterior contenía un control numérico y un control booleano, el siguiente código se genera automáticamente en el archivo de encabezado (InNum es el nombre del control numérico e InBool es el nombre del control booleano):

typedef struct {
float64 InNum;
LVBoolean InBool;
} TD1;

El clúster de salida funciona de la misma manera y se genera el siguiente código:

typedef struct {
float64 OutNum;
LVBoolean OutBool;
} TD2;

Nota: Las variables de estructura TD1 y TD2 corresponden a los tipos pasados en el Prototipo de función anterior en el panel (void ClusterTest (TD1 * InCluster, TD2 * OutCluster)).

Dentro del archivo fuente, primero debe definir dos nuevas estructuras de tipo TD1 y TD2, respectivamente.

TD1 instr;
TD2 outstr;

Dentro de la función, puede establecer los valores del grupo de entrada de la siguiente manera:

instr.InBool = 1;
instr.InNum = 7.0;

La llamada real a la función se ve así:

ClusterTest (& instr, & outstr);

Los valores del clúster de salida se pueden utilizar de la siguiente manera:

printf ("% f num% i bool", out.OutNum, out.OutBool);