1.数值类型

值传递:仅作为输入,不能输出。对于单纯的数值类型的数据,在Labview配置dll时,只需要将其配置为传递值,常量的选择则是要根据参数声明中是否包含const,如果包含const,则可以选择勾选常量,减少内存消耗。

labview调用python节点可以设置工作目录吗 labviewdll调用_#pragma


在封装dll时需要注意,Labview仅支持标准的C编译的dll,故需要在函数前加上 extern “C”(需要在.cpp文件中才可以识别,在.c文件内会提示未定义的标识符)。

#include "add_value.h"
extern "C" _declspec(dllexport) int add(int a, int b)
{
	return a + b;
}

指针传递:参数声明中包含int*、float*等指针参数时,配置dll时,需要将其配置为指针,配置为指针时,该参数可以作为输出或者输入输出。

extern "C" int add_ponit(int *a, int *b)
{
	int c = 10;
	int d = 20;
	*a = c;
	*b = d;
	return 0;
}

2.布尔类型

dll函数与vi之间没有直接用于布尔类型的数据类型,所以布尔类型也是用数值类型来传递。在传递时需要注意dll在配置布尔时占用几个字节,然后使用对应大小的数值类型来表示。
值传递:
作为返回值:

extern "C" bool add_bool_value(int a, int b)
{
	if (a == b)
	{
		return false;
	}
	else
	{
		return true;
	}
}

labview调用python节点可以设置工作目录吗 labviewdll调用_值类型_02


作为输入参数:

extern "C" int add_bool_value_in(bool a)
{
	if (a)
	{
		return 100;
	}
	else
	{
		return 200;
	}
}

labview调用python节点可以设置工作目录吗 labviewdll调用_c语言_03


指针传递:

extern "C" int add_bool_point_out(bool* a)
{
	*a = true;
	return 0;
}

labview调用python节点可以设置工作目录吗 labviewdll调用_数组_04

3.数组类型

Labview只支持C数据类型中的数值类型的数组。数据类型是选择数组中元素的数据类型。
数组格式:“数组数据指针”对应C语言中用指针表示的数组;“数组句柄”和“数组句柄指针”,这种带句柄的都是Labview定义的特殊类型,通常只有NI的dll或者Labview封装的dll才会使用这些类型,在第三方的dll是不会使用的。
最小尺寸一维数组可以设置一个最小尺寸,当传入参数的尺寸小于最小尺寸时,Labview会将其补充至最小尺寸,再传递至dll。
当函数的输出参数为数组时:一定要为输出的数组开辟空间,如果未分配空间或者分配的空间不够大,程序在运行时可能会出现数组越界的情况,Labview可能会崩溃。
输出数组开辟空间:
1.创建一个长度满足要求的数组作为初始值传递给参数。这个输入数组的内容是无效的,仅用来表示为输出数组所分配内存的大小,确保输出的数据在这个合法的空间内。
2.直接在参数配置内的“最小尺寸”进行设置。可以选择输入数值或者在输入参数内含有整形参数,则这些整形参数的值也是可以作为数组的大小。

labview调用python节点可以设置工作目录吗 labviewdll调用_值类型_05

extern "C" int add_array(int arr1[], int length,int* arr2)
{
	int i = 0;
	for ( i = 0; i < length; i++)
	{
		arr2[i] = arr1[i] * 20;
	}
	return 0;
}

labview调用python节点可以设置工作目录吗 labviewdll调用_值类型_06


对arr2的输出数组,有在配置内的最小尺寸添加长度。

4.字符串

字符串的使用与数组使用相似,在输出时都必须分配内存。在C语言中字符串就是一个I8类型的数组。

extern "C" int add_char(char* a, char*b)
{
	int i, j=0;
	for (i = strlen(a)-1; i >= 0; i--)
	{
		b[j++] = a[i];
	}
	return 0;
}

labview调用python节点可以设置工作目录吗 labviewdll调用_数组_07

5.结构体

C语言中的参数为结构体指针,在一些简单情况下可以与簇相对应。如其输入参数为结构体时,将结构体内对应的参数依次输入即可,不需要传入簇。对于复杂的结构体,还是需要自己再另外封装dll以供Labview调用。在对应时,需要结构体内的元素要采用1字节对齐,(#pragma pack(1))否则在建立簇时就需要相应的调整簇内的元素来使其对应(Labview中的簇是1字节对齐)。 对于结构体中嵌套了数组的,不可以在Labview中把数组直接放到簇内,需要将其数组拆开后将元素放到簇中。
#pragma pack(1)

#pragma pack(1)
struct MyStruct
{
	int a;
	int b;
};//可以放到.h文件内

extern "C" int add_Struct1(MyStruct* struct1)//在.cpp文件的最前端加 #pragma pack(1)
{

	return struct1->a+ struct1->b;
}

labview调用python节点可以设置工作目录吗 labviewdll调用_#pragma_08


#pragma pack(4)

#pragma pack(4)
struct MyStruct1
{
	short int a;
	int b;
};

extern "C" int add_Struct2(MyStruct1* struct2)
{
	return struct2->a + struct2->b+sizeof(struct2->a);
}

labview调用python节点可以设置工作目录吗 labviewdll调用_数组_09


在不是1字节对齐的情况时,如果不放中间的I16,则返回值为错误值。

结构体内嵌套数组

#pragma pack(1)
struct MyStruct2
{
	int a;
	int b;
	int c[3];
};
extern "C" int add_Struct3(MyStruct2* struct3)
{
	int sum = 0;
	for (int i = 0; i < 3; i++)
	{
		sum += struct3->c[i];
	}
	return struct3->a + struct3->b + sum;

}

labview调用python节点可以设置工作目录吗 labviewdll调用_c语言_10


结构体内嵌套指针

#pragma pack(1)
struct MyStruct3
{
	int a;
	char* b;
	int c;
};
extern "C" int add_Struct5(MyStruct3* struct5)
{
	return struct5->a+ struct5->c;
}

labview调用python节点可以设置工作目录吗 labviewdll调用_#pragma_11

输入参数为结构体

#pragma pack(1)
struct MyStruct
{
	int a;
	int b;
};
extern "C" int add_Struct4(MyStruct struct4)
{
	return struct4.a + struct4.b;
}

labview调用python节点可以设置工作目录吗 labviewdll调用_#pragma_12


输入参数为结构体时,直接按顺序输入结构体内的参数,如果还是配置为“匹配至类型”,则返回错误。