您现在正在浏览:首页 > 职教文章 > 职教论文 > LabVIEW 与C 语言接口的方法

LabVIEW 与C 语言接口的方法

日期: 2010/3/29 浏览: 149 来源: 学海网收集整理 作者: 陈金平 王生泽 吴文英

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 语言接口的方法

返回顶部