LabVIEW 与C 语言接口的方法
LabVIEW 与 C 语言接口的方法
The lnterfacing Method between Lab3l45 and 6 Lang7age
陈金平 王生泽 吴文英
(东华大学机械工程学院,上海 200051)
摘 要 介绍了一种 LabVIEW 与 C 语言接口的方法,由实例证明,该方法高效、易行,是增强 LabVIEW 整体功能的一条有效的途径。
关键词 虚拟仪器 LabVIEW 动态链接库
Abstract The interfacing method between LabVIEW and C programming language is presented. It is effective,ease to implement and proven by experi-
ments. It is an effective path to enhance the entire function of LabVIEW.
Keywords Virtual instrument LabVIEW Dynamic linkage library
0 引言
LabVIEW 是一种方便灵活的虚拟仪器开发环境。
当前,虚拟仪器技术已广泛应用到各种自动化测试和测
量领域,虚拟化已经成为仪器领域的发展方向。但是,
在进行一些数据处理和开发数据采集卡驱动子程序时,
LabVIEW 的图形化编程语言就难以实现。通过 CIN 技
术,可以在 LabVIEW 调用 C 语言源代码。C 语言是目前
公认的功能非常强大的程序语言,LabVIEW 通过与 C 语
言接口,可增强其整体功能。本文通过求解两个矩阵相
乘的例子,介绍了两种编程语言的接口方法。
1 CIN 概述
CIN 是一个位于 LabVIEW 框图程序窗口中的带有
输入输出端口的图标。用户可将需调用的外部代码编
译成 LabVIEW 所能识别的格式后与此结点相连。当
此结点执行时,LabVIEW 将自动调用与此结点相连的
外部代码,并向 CIN 传递特定数据结构。
图 1 Code interface Node 子模块
1.1 CIN 图标的调用途径
CIN 位于 LabVIEW 功能模块中的“Advanced”子模
块里,其调用方法为: → →Function Advanced Code
interface Node。如图 1 所示。
1.2 CIN 图标端口参数设置
初始时,CIN 只有一个参数的输入端口和输出端
口。欲增添新的输入端口和输出端口,可以利用工具
模块上的选择工具拖放 CIN 图标来实现,也可以从
CIN 图标的快捷菜单中选择 Add Parameter 选项来添
加。有的参数只为输出值,没有对应的输入值,这时应
将其对应的输入端口设置为无效,方法是从 CIN 图标
的快捷菜单中选择 Only Output 选项,则该输入端口变
暗,表明其无效。如图 2 所示。
图 2 CIN 图标
2 在 LabVIEW 中调用 C 语言的方法
Windows 98 下,通过 CIN 技术在 LabVIEW6.1 程序
中利用 Visual C ++ 6.0 开发环境,调用 C 语言源代码
求取两矩阵相乘的积。
2.1 框图程序设计
启 动 LabVIEW6.1,在 其 框 图 程 序 中 设 置“Code
Interface Node”节点,将端口增加至 3 对,分别将输入
量 A 和 B 与此 CIN 结点的前两个输入端口相连;将
输出量 C 与此 CIN 结点的最后一个输出端口相连,
并将最后一对端口设置为“Output Only”,如图 4 所示。
前面板设计如图 3 所示,取名为“矩阵相乘 . vi”并保
存该文件。
2.2 建立模块文件
从该 CIN 结点的快捷菜单中选择“Creat. c File. . .”
命令,在弹出的对话框中,文件保存目录为“C: 矩阵
12
LabVIEW 与 C 语言接口的方法 陈金平,等
图 3 前面板示意图 图 4 框图程序示意图
相乘”,文件名取“矩阵相乘 . C”,然后按“保存”按钮。
则 LabVIEW6.1 将创建一个 C 语言文件的模块“矩阵相
乘 .C”,在其中补入两矩阵相乘的源代码后内容如下:
# include“extcode. h”
typedef struct{
int32dimSizes[2];
float64 arg[1];
}TD1;
typedefTD1**TD1Hdl;
CIN MgErr CINRun(TD1Hd1 A,TD1Hd1 B,TD1Hd1
C);
# define ParamNumber 2
# define NumDimensions 2
CIN MgErr CINRun(TD1Hd1 Ah,TD1Hd1 Bh,TD1Hd1
Ch){
{
int32 i,j,k,l;
int32 rows,cols;
float64 *aElmtp,*bElmtp,*resultElmtp;
MgErr mgError = noErr;
int32 newNumElmts;
if((k =(*Ah)- > dimSizes[1]! =(* Bh)- >
dimSizes[0]){
goto out;
}
rows =(*Ah)- > dimSizes[0];
cols =(a*Bh)- > dimSizes[1];
newNumElmts = rows*cols;
if( mgError = SetCINArravSize(( Uhandle )Ch,
ParamNumber,newNumElmts))
goto out;
(*Ch)- > dimSizes[0]= rows;
(*Ch)- > dimSizes[1]= cols;
aElmtp =(*Ah)- > argl;
bElmtp =(*Bh)- > argl;
resultElmtp =(*Ch)- > argl;
for(i = 0;i < rows;i ++ )
for(j = 0;j < cols;j ++ ){
*resultElmtp = 0;
for(l = 0;l < k;l ++ )
* resultElmtp + = aElmtp[i* k + 1]*
bElmtp[l*cols + j];
resultElmtp ++ ;
}
out:
ruturn noErr;
}
}
2.3 编译 CIN 源代码
在实 际 使 用 中,必 须 将 CIN 源 代 码 编 译 成
LabVIEW6.1所能识别的格式,即后缀名为 . lsb 的目标
代码文件。编译的过程较复杂,在此介绍两种方法。
2.3.1 Visual C ++ Command Line 方法
① 启动 VC ++ 6.0 开发平台,新建一个 Make 文件
方式运行的工程,工程文件存放路径为“C: 矩阵相
乘”,工程名为“矩阵相乘”。
② 向工程文件中添加“矩阵相乘 . C”文件,执行
→ →Project Add to project Files. . .操作,向工程文件
添加该文件。
③ 新建一个 Make 文件,该文件名应与工程名相
同,此处应为“矩阵相乘 . mak”,该 Make 文件内容如下:
IDE = VC
name = 矩阵相乘
TYPE = CIN
cinLibraries = libc. lib
CINTOOLSDIR = C: labview cintools
!include S|(CINTOOLSDIR) ntlvsb. mak
文件中“cintolls”为 LabVIEW6.1 下 cintools 文件夹
的路径,路径为 MS - DOS 格式且不能有空格。
④ 向工程文件中添加“矩阵相乘 . mak”文件,执行
→ →Project Add to project Files. . .操作,向工程文件
添加该文件。
⑤ 编译成 . lsb 文件,执行 →Build Build 矩阵相
乘 .exe 命令,则在该工程目录下生成“矩阵相乘 . lsb”
文件。
2.3.2 Visual C ++ IDE 方法
① 启动 VC ++ 6.0 开发平台,新建一个空的 DLL
工程,工程文件存放路径为“C: 矩阵相乘”,工程名
为“矩阵相乘”。
② 向工程文件中添加 cin. obj、labview. lib、lvsb.
lib、lvsbmain. def 等 4 个文件。执行 →Project Add to
22
《自动化仪表》第 26 卷第 7 期 2005 年 7 月
PROCESS AUTOMATION INSTRUMENTATION Vol.26 No.7 July 2005
→project Files. . .操作,向工程文件中分别添加上述
4 个文件。这 4 个文件在 cintools 文件夹中,其路径:
C: labview cintools 。
③ 向工程文件中添加“矩阵相乘 . C”文件,执行
→ →Project Add to project Files. . .操作,向工程文件
添加该文件。
④“矩阵相乘 . C”源代码文件编译前的设置。
由菜单项 →Progject Setting. . .打开设置对话框,
逐项设置。
# Setting for 选项设置:All configuration。
$ C/ C ++ 标签页设置:用鼠标左击 C/ C + + 标签
页按钮,逐项设置。
⊕Category:在下拉菜单中选择为 Preprocessor。
Additional include directories:添加 cintools 文件夹
的路径,即为:C: labview cintools 。(MS -
DOS Format)
⊕Category:在下拉菜单中另选为 Code Generation。
Strict member alignment:设置为 1byte。
Use run-time library:设置为 Multithreaded DLL。
% Custom build 标签页设置。用鼠标左击 Custom
Build 标签页,逐项设置。
⊕Commands:输入命令行(MS-DOS Format)
C: labview cintools lvsbutil S|(TargetName)-d
“S|(WkspDir) S|(OurDir)”
⊕Outputs:输入命令行 S|(OutDir)S|(TargetName).
lsb
& 编译成 . lsb 文件,执行 →Build Build 矩阵相
乘 .dll 命令,则在该工程目录下的 Debug 目录中生成
“矩阵相乘 .lsb”文件。
上述编译 CIN 源代码的方法各有利弊,第一种方
法建立 Make 文件较繁,第二种方法编译环境设置较复
杂,且第一种方法生成的“矩阵相乘 . lsb”文件比第二
种方法生成的“矩阵相乘 . lsb”文件要小得多。本文采
用的是第一种方法生成的“矩阵相乘 . lsb”文件。
2.4 在 LabVIEW6.1 中调入 . lsb 文件
关闭 VC + + 6.0,打开 LabVIEW 程序“矩阵相乘 .
vi”,从 CIN 结 点 的 快 捷 菜 单 中 选 择“Load Code Re-
source. . .”命令,并选择刚创建的 . lsb 文件“矩阵相乘 .
lsb”。
“Load Code Resource. . .”命令将目标代码“矩阵相
乘 .lsb”调入内存并与 LabVIEW 程序“矩阵相乘 . vi”中
的 CIN 相连。至此,该 LabVIEW 程序已可运行,结果如
图 3 所示。将该程序“矩阵相乘 . vi”存盘,则目标代码
“矩阵相乘 . lsb”将完美地与 LabVIEW 程序结合在一
起,至此“矩阵相乘 . lsb”将不再有用,将“矩阵相乘 .
lsb”删除,LabVIEW 程序“矩阵相乘 . vi”照样运行自如。
3 结束语
本文通过“矩阵相乘”这一实例,阐述了 LabVIEW
和 C 语言接口的方法。由于在 LabVIEW 中引入了 C
语言的强大功能,从而提高了 LabVIEW 的数据处理能
力,并极大地增强了 LabVIEW 与其他 Windows 应用程
序之 间 的 数 据 共 享 能 力。以 上 例 子 的 VI 程 序 在
LabVIEW6.1和 Visual C + + 6.0 环境下以及中文 Win-
dows 98 环境中运行通过。
参考文献
1 Using External Code in LabVIEW. National Instruments Corporation,2000
2 杨乐平,李海涛,肖相生 . LabVIEW 程序设计与应用 . 电子工业出
版社,2001
修改稿收到日期:2005 - 02 - 25。
第一作者陈金平,男,1963 年生,2001 年获东华大学机械电子工程专
业工学硕士,讲师;研究领域为测控技术、软件工程、纺织工程等。
(上接第 20 页)
实际高度值,三次估计值都与实际值非常接近,估计结
果的相对误差和绝对误差都非常小,得到的结果能比
较准确地反映液面的实际高度。
3 结束语
由舰艇舱内液面高度测量的数据波形表明,原始
信号为连续缓变、平稳随机性信号,符合经验模态分解
理论,可以采用经验模态分解方法。液位信号的经验
模态分解图清楚地展现了各种频率成分干扰噪声的分
离。计算实验数据的结果表明,其相对误差小于 ±
1%。舰船液位高度测量的实验结果验证了基于经验
模态分解的舰船液位测量方法的可行性。
参考文献
1 N. E. Huang,et. The empirical mode decomposition and Hilbert spec-
trum for nonlinear and non-stationary time series analysis. Proc. Roy.
Soc. 1998:903 ~ 995
2 张贤达 .现代信号处理 .清华大学出版社,2002
3 韩新洁,孟宪尧. 船舶液位测量中海浪的滤波处理. 大连海事大
学学报,1999,25(1)
收稿日期:2004 - 11 - 06。
第一作者殷明华,男,1969 年生,1993 年毕业于海军工程大学,现为
中国科技大学精密机械与精密仪器系在读博士研究生,工程师;主要从
事测试技术方面的研究。
32
LabVIEW 与 C 语言接口的方法 陈金平,等
LabVIEW 与C 语言接口的方法