摘要:虚拟仪器软件设计中以图形化语言LABVIEW为主,但在遇到LABVIEW不易实现的功能时,可通过在LABVIEW中调用C来实现。本文介绍了在LABVIEW中调用C的方法和配置CIN节点的原则,并用一个例子详细说明了实现LABVIEW和C混合编程的过程。
关键词:虚拟仪器,LABVIEW, CIN
引言
随着测试技术和总线技术的发展,以虚拟仪器为标志的自动测试系统开始出现。所谓虚拟仪器就是在以计算机和总线系统设备为硬件平台的基础上,由软件来实现原来需要用硬件来完成的功能,使用者只需用鼠标点击计算机的虚拟面板来操作,即可实现对被测对象测试的自动测试系统,因此,在测试领域有“软件即是仪器”的说法。
1图形化语言LABVIEW
LABVIEW(Laboratory Virtual Instrument Engineering Workbench)是美国NI(National Instrument Company)公司推出的一种基于G语言(Graphics Language)的虚拟仪器软件开发工具。是目前应用最广、发展最快、功能最强的图形化软件开发集成环境。
一个LabVIEW程序分为3部分:前面板、框图程序、图标/接线端口。前面板用于模拟真实仪器的前面板;框图程序则是利用图形语言对前面板上的控件对象(分为控制量和指示量两种)进行控制;图标/接线端口用于把LabVIEW程序定义成一个子程序,从而实现模块化编程。利用LABVIEW设计者可以向搭积木一样,轻松组建一个虚拟仪器软面板。但图形化语言在软件设计中有一定的限制,因此,在虚拟仪器软件设计中可采用以LABVIEW为主,LABVIEW和C语言混合编程的方法。
2 LABVIEW中调用C的方法和CIN节点的配置
2.1 CIN概述
CIN是一个位于LabVIEW框图程序窗口的带有输入输出端口的图标。用户可将需调用的外部代码编译成LabVIEW所能识别的格式后与此结点相连,当此结点执行时,LabVIEW将自动调用与此结点相连的外部代码,并向CIN传递特定数据结构。使用CIN技术,用户可向CIN传递任意复合的数据结构,并且通常情况下,使用CIN可
获得较高的程序效率,因为LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,二者完全相同。 CIN源代码对编译器有严格的限制,且因LabVIEW用于不同的操作系统平台而异。LabVIEW支持Windows95,WindowsNT, HP-UX等多种操作系统平台。
LABVIEW中通过与C语言的接口图标来调用C,LABVIEW与C语言的接口图标是CIN节点。其调用路径为:Function>>Advanced>>CIN(Code Interface Node).如图1所示。
2.2 CIN的设计方法
确定CIN节点的输入、输出个数和参数类型。CIN输入(输出)口参数的数据类型由连接在输入(输出)口上的控件的数据类型决定。
(1) 生成C源代码编辑格式文件。
(2) 在C源代码编辑格式文件的规定位置添加C源代码。
(3) 编辑*.C文件源代码,生成可执行文件。
(4) 装载编译好的可执行文件,这样就基本上形成了一个具备一定功能的CIN图标。
图1
3应用例子
通信系统中,CRC编码是非常常用的一种编码方式。在LABVIEW中实现比较复杂和困难。因此,采用C语言编写CRC校验码,在LABVIEW中利用CIN节点进行调用。
3.1生成C源代码编辑格式文件(*.c文件)的代码框架
生成C源代码编辑格式文件(*.c文件)的代码框架的步骤如下所述。
首先,从CIN图标的快捷菜单中选择Create.c File项,弹出一个文件存储对话框,键入文件名(本例中文件名设为“crc.c”),则生成C语言代码框,然后打开。该C语言代码框为:
/* Call Library source file */
#include "extcode.h"
void funcName(void);
void funcName(void)
{
/* Insert code here */
}
3.2添加C源代码
在/* Insert code here */处填入C源代码。本例中的部分C源代码为:
#include <stdio.h>
#include <string.h>
void main(void)
{
int index,lg,lg1,i;//定义字符串string的长度为lg,定义字符串string1的长度为lg1
char string1[256]="1100000001111";
char string[256];
char *char_ptr;
char string2[256]="000000000";
printf("Type a string of characters and press Enter:\n");
以上这部分定义了字符数组,并对字符数组和指针变量行进行了初始化。
gets(string);//得到输入字符串
strcat(string,"000000000000");//把字符串"000000000000"加到string上
char_ptr=strchr(string,'1');
strcpy(string,char_ptr);//去掉1前面的0
lg=strlen(string);
lg1=strlen(string1);
这部分对输入字符串进行预处理,得到string1的长度。
while((lg-lg1)>0)
{
for(i=0;i<lg1;i++)
{
string[i]=string[i]^string1[i];
string[i]=0x30+string[i];
}
printf("%s\n",string);
strncat(string,string2,(lg-lg1));//string加n个0
char_ptr=strchr(string,'1');
strcpy(string,char_ptr);//去掉1前面的0
printf("%d\n",strlen(string));
lg=strlen(string);
printf("%s\n",string);
printf("%d\n",strlen(string));
}
这部分按模2除法进行运算,并对运算结果进行循环处理。
}
3.3*.C文件源代码的编辑
必须将CIN源代码编译成LabVIEW所能识别的格式。由于,在VC++中对*.C文件源代码进行编辑的方法因用户所用操作系统平台和编译器而异。在此不做详细介绍,如不熟悉如何在VC++中进行编辑,可参考有关VC++的书籍(参考文献3)
3.4装载编译好的可执行文件
从CIN图标的快捷菜单中选择Load Code Resource项,弹出一个Choose a code resource file对话框,按照crc工程文件存入的路径寻找Debuge目录下的crc.lsb文件,然后单击“打开”,crc.lsb文件装入CIN图标中。
3.5运行程序。
输入String=0111000000010000011110,理论计算输出应为110011011运行程序得到输出为110011011,与理论计算输出相同。
4用 LABVIEW实现CRC校验和通过LABVIEW中CIN节点实现CRC校验的比较
4.1通过LABVIEW中CIN节点实现对C代码调用的CRC校验LABVIEW程序如图2:
图2
4.2用 LABVIEW实现的CRC校验程序
CRC校验程序的1/3部分如图3所示
图3
4.3通过LABVIEW中CIN节点实现对C代码调用的CRC校验LABVIEW程序效率和用LABVIEW直接实现CRC校验程序效率比较如图4所示。
从上例中我们可以看出,在LABVIEW中通过调用C语言来实现图形化语言LABVIEW本身较难实现的功能,大大简化了程序的复杂度,在程序复杂度增加到一定程度时,LABVIEW中调用CIN接点的效率远大于LABVIEW直接编程的效率。采用LABVIEW和C语言的混合编程,充分利用
图4
两种语言的优点是虚拟仪器软件设计的一种较好的选择.
5结束语
本文阐述了LabVIEW和C语言接口的方法,并给出了应用实例。由于在LabVIEW中引入了C语言的强大功能,从而提高了LabVIEW的数据处理能力,并极大地增强了LabVIEW与其他Windows应用程序之间的数据共享能力。
在我单位开发的基于VXI总线的自动测试系统虚拟仪器软件设计中,成功的运用了LABVIEW和C语言混合编程的方法,较好的解决了图形化语言在软件设计中的局限,取得了很好的效果。
参考文献:
[1]刘军华。《基于LABVIEW》的虚拟仪器设计。电子工业出版社。2003年1月。
[2] 刘军华。《虚拟仪器图形化编程语言LABVIEW教程》。西安电子科技大学出版社。2001年8月。
[3] David J.Kruglinski , Scot Wingo , George Shepherd.《Visual C++6.0技术内幕》北京希望电子出版社。2001年1月。