realhappy 发表于 2006-9-22 09:59

基于C语言的虚拟仪器系统开发

  所谓虚拟仪器,就是在通用计算机平台上,用户根据自己的需求定义和设计仪器的
测试功能,其实质是将传统仪器硬件和最新计算机软件技术充分结合起来,以实现并扩
展传统仪器的功能。与传统仪器相比,虚拟仪器在智能化程度、处理能力、性能价格比
、可操作性等方面都具有明显的技术优势。
  虚拟仪器最重要、最核心的技术是虚拟仪器软件开发环境。与传统程序语言不同,
这类软件一般采用强大的图形化语言编程,面向测试工程师而非专业程序员,编程非常
方便;人机交互界面友好;具有强大的数据可视化分析和仪器控制能力等特点。但虚拟
仪器软件亦存在其不足,如,不适于或不擅长于完成大量数据处理的任务;不能调用系
统程序实现底层操作等。在虚拟仪器系统开发中若遇到这类问题,就可利用虚拟仪器软
件所提供的与传统编程语言(如当前广泛使用的C语言)的接口,将其自身不擅长或不易
实现的任务通过能够或更适于完成此类任务的其他编程语言来实现。
1 虚拟仪器开发环境——LabVIEW
  LabVIEW(laboratory virtual instrument engineering workbench)是目前国际上
应用最广的虚拟仪器开发环境之一,是美国NI公司的产品,主要用于仪器控制、数据采集
、数据分析和数据显示等领域。
  LabVIEW是一种基于图形编程语言(G语言)的开发环境。简言之,LabVIEW功能强大
、灵活方便。它与C,Pascal,Basic等传统编程语言有着诸多相似之处,如,相似的数据
类型、数据流控制结构、程序调试工具,以及模块化的编程特点等。但二者最大的区别
在于:传统编程语言用文本语言编程;而LabVIEW使用图形语言(即各种图标、图形符号
、连线等)编程,界面非常直观形象,而且使用的都是测试工程师们熟悉的旋钮、开关
、波形图等,因此用LabVIEW编程无需太多编程经验,这对于没有丰富编程经验的测试工
程师们来说无疑是个极好的选择。
  一个LabVIEW程序分为3部分:前面板、框图程序、图标/接线端口。前面板用于模拟
真实仪器的前面板;框图程序则是利用图形语言对前面板上的控件对象(分为控制量和
指示量两种)进行控制;图标/接线端口用于把LabVIEW程序定义成一个子程序,从而实
现模块化编程。
2 LabVIEW高级技术之一——与C语言的接口技术
  LabVIEW是一种方便灵活的虚拟仪器开发环境,它提供了4种与其他语言接口的途径
,其中CIN技术是从LabVIEW调用C源代码的通用方法。C语言是目前公认的功能非常强大
的程序语言,LabVIEW通过与C语言接口,可增强其整体功能。
2.1 CIN概述
  CIN是一个位于LabVIEW框图程序窗口的带有输入输出端口的图标。用户可将需调用
的外部代码编译成LabVIEW所能识别的格式后与此结点相连,当此结点执行时,LabVIEW
将自动调用与此结点相连的外部代码,并向CIN传递特定数据结构。
  使用CIN技术,用户可向CIN传递任意复合的数据结构,并且通常情况下,使用CIN可
获得较高的程序效率,因为LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,
二者完全相同。
  CIN源代码对编译器有严格的限制,且因LabVIEW用于不同的操作系统平台而异。Lab
VIEW支持Windows 3.1,Windows 95,Windows NT,Macintosh,Solaris,HP-UX等多种操作系
统平台。以LabVIEW 4.1 for Windows 95/NT为例,其中的CIN支持以下编译器:
  .Visual C+ + for Windows 95/NT
  .Microsoft C/C+ +
  .Win32 Microsoft SDK(Software Developer’s Kit) C/C+ +
  .Watcom C/386 for Windows 3.1
2.2 创建CIN的步骤
  此处要实现的是:在Windows 95下,利用CIN技术在LabVIEW 4.1 (for Windows 95
/NT)程序中调用Visual C+ + 5.0 (for Windows 95/NT)源代码,该程序实现了求2个数
的乘积。
  此例中,LabVIEW程序的前面板如图1所示。
图1 
  (1) 在框图程序窗口建立一个CIN
  新产生一个LabVIEW程序“cin_test.vi”,存至新建目录“c:\cin”下。
  在此程序的框图程序窗口的功能模板(Function Pallet)的“Advanced”子模板中
选择“Code Interface Node” 功能模块,并放置于框图程序中。
  (2) 建立此CIN结点的输入输出端口
  初始情况下,CIN只有一对端口:一个输入端口和一个输出端口。可通过改变此结点
的大小或从此CIN结点端口的弹出菜单中选择“Add Parameter”命令来增加端口。此处
,需将端口增加至3对,如图2所示。
图2 
  分别将控制量a和b与此CIN结点的前两个输入端口相连;将指示量a*b与此CIN结点的
最后一个输出端口相连,并将最后一对端口设置为“Output Only”(从端口的弹出菜单
中选择“Output Only”命令),如图3所示。
图3
  图3表明:控制量a和b是2个输入参数,指示量a*b是输出参数,通过CIN结点求出a、
b的乘积后,将结果送至a*b中。此处CIN将不会改变输入参数a和b的值。LabVIEW程序调
用CIN结点时,LabVIEW传递给CIN对象结点的2个参数实际上是控制量a和b的地址,当CI
N调用完毕,LabVIEW将返回值送至指示量a*b的地址所指内存单元,即指示量a*b中。
  (3) 建立模板文件
  从CIN结点的弹出菜单中选择“Creat.c File…”命令,在弹出的对话框中选择目录
“c:\cin”下面的文件“mult.c”。 LabVIEW将新创建一个C语言文件的模板“mult.c
”,其内容如下所示:
  /* CIN source file*/
  #include “extcode.h”
  /* stubs for advanced CIN functions */
  UseDefaultCINInit
  UseDefaultCINDispose
  UseDefaultCINAbort
  UseDefaultCINLoad
  UseDefaultCINUnload
  UseDefaultCINSave
  CIN MgErr CINRun(float64*a, float64*b, float64*a_b);
  CIN MgErr CINRun(float64*a, float64*b, float64*a_b) {
  /* ENTER YOUR CODE HERE */
  return noErr;
  }
  上述代码指出了7个必须说明的函数,其中6个UseDefault宏是缺省的,它们的定义
在头文件“extcode.h”中;CINRun函数最经常使用,此时仅给出了实际函数的框架,用
户可在此函数体中键入C语言代码。
  头文件“extcode.h”是自动加上的,它定义了CIN和外部子程序要用到的基本数据
类型和许多函数等,其中定义的某些常量和数据类型可能会与系统头文件相冲突,故当
在模板文件中键入的代码要进行系统调用时,需将LabVIEW的Cintools目录下的“hostt
ype.h”这个头文件也包括到模板文件中来,以解决可能引起的冲突。
  当CIN结点执行时,LabVIEW将调用CINRun函数。CINRun将CIN结点的输入输出端口都
看作形式参数。其他的函数(如CINInit、CINDispose、CINAbort、CINLoad、CINUnloa
d、CINSave)均在特定时刻被调用,故用户可利用CIN来完成某些特殊编程任务。如,当
LabVIEW程序第一次调入(load)时,CINLoad函数将被执行。如果用户想在LabVIEW程序
第一次调入时完成某些特定任务,就可在CINLoad函数体中键入代码,此时需将“UseDe
faultCINLoad”宏删去。
  (4) 编译CIN源代码
  必须将CIN源代码编译成LabVIEW所能识别的格式。编译的过程非常复杂,而且因用
户所用操作系统平台和编译器而异。下面以Visual C+ + 5.0 for Windows 95/NT为例

  ① 进入VC+ +,新建一个按用户自定义makefile方式运行的工作台,设键入“cin
”(即认为目录“c:\cin”作为当前工作台)。
  ② 调入文件 “c:\cin\mult.c”,在函数CINRun的函数体内键入代码:
  *a_b =*a * * *b;
将文件“mult.c”存盘后,加入当前工作台。
  ③ 给当前工作台新建一个make文件“cin.mak”。其内容如下:
  IDE=VC
  name=mult
  TYPE=CIN
  cinLibraries=libc.lib
  CINTOOLSDIR=C:\Progra~1\Nation~1\LabVIEW\Cintools
  !include $(CINTOOLSDIR)\ntlvsb.mak
  ④ 选择执行VC+ +主界面中“Build”菜单中的“Build cin.exe”命令,编译形成
LabVIEW所能识别的目标代码文件(必须是以.lsb为后缀的目标文件)“mult.lsb”。
  (5) 调入CIN目标代码
  关闭VC+ +,打开LabVIEW程序“cin_test.vi”,选择执行CIN结点弹出菜单中的“
Load Code Resource…”命令,并选择刚创建的.lsb文件“mult.lsb”。
  “Load Code Resource…”命令将目标代码“mult.lsb”调入内存并与LabVIEW程序
“cin_test.vi”中的CIN相连。至此,LabVIEW程序已可运行,结果如图4所示。
图4 
  将程序“cin_test.vi”存盘,则目标代码“c:\cin\mult.lsb”将嵌入此LabVIE
W程序,即使目录“c:\cin”下面的文件“mult.lsb”被删除,LabVIEW程序“cin_test
.vi”依然可以运行。
3 结束语
  本文阐述了LabVIEW和C语言接口的方法,并给出了应用实例。由于在LabVIEW中引入
了C语言的强大功能,从而提高了LabVIEW的数据处理能力,并极大地增强了LabVIEW与其
他Windows应用程序之间的数据共享能力。
  本方法已在LabVIEW 4.1 for Windows 95/NT及Visual C+ + 5.0 for Windows 95
/NT环境下实现。实践证明,此方法高效、易行,是增强LabVIEW整体功能的一条很好的
途径。

[ 本帖最后由 realhappy 于 2006-10-23 13:29 编辑 ]

hmqi905 发表于 2006-9-28 14:55

不错的文章!

fenghai222 发表于 2006-10-15 09:44

文章不错!

pigmin 发表于 2006-11-7 10:47

介绍不错

syg9696 发表于 2006-11-9 19:36

写的很好,回去好好琢磨一下。

jerry9527 发表于 2006-11-16 18:08

好好好啊,还没看懂

realhappy 发表于 2006-11-16 20:07

原帖由 jerry9527 于 2006-11-16 18:08 发表
好好好啊,还没看懂
可以慢慢看,有什么问题可以提出讨论!

jerry9527 发表于 2006-11-17 12:53

我想问问,假如说我的服务器端是用C语言编的,而客户机端使用labview编的,那么客户机可以直接接受服务器发来的数据包吗?还是要对数据包进行转换,或是处理之类的?

realhappy 发表于 2006-11-17 14:13

原帖由 jerry9527 于 2006-11-17 12:53 发表
我想问问,假如说我的服务器端是用C语言编的,而客户机端使用labview编的,那么客户机可以直接接受服务器发来的数据包吗?还是要对数据包进行转换,或是处理之类的?
使用C语言接收的话,服务器端最好用tcp/ip编程,并且数据结果都变成一个数组,按照相应的格式进行转换。

pigmin 发表于 2006-11-19 10:47

谢谢

yarrort 发表于 2006-11-20 14:10

好好研究一下阿

杨连昆 发表于 2010-5-30 11:35

这个CIN 是输入模拟信号还是数字信号   出来的又是什么信号??
页: [1]
查看完整版本: 基于C语言的虚拟仪器系统开发