|
发表于 2007-4-11 08:41:33
|
显示全部楼层
菜农大叔,你说的CVI是这个东西吗?
===========================================================================
LabWindows/CVI基础教程
序 言
LabWindows/CVI是National Instruments公司推出的一套面向测控领域的软件开发平台.它以ANSI C为核心,将功能强大,使用灵活的C语言平台与数据采集,分析和表达的测控专业工具有机地接和起来.它的集成化开发平台,交互式编程方法,丰富的控件和库函数大大增强了C语言的功能,为熟悉C语言的开发人员建立检测系统,自动测量环境,数据采集系统,过程监控系统等提供了一个理想的软件开发环境.
本教程面向的是那些从未使用过LabWindows/CVI的读者,但是假设读者以有了C语言的基础并且熟悉Windows 2000/9x/NT操作系统.在每一章节的学习中,作者都是通过一个具体的实例让读者迅速的掌握本章的知识点;而不是长篇大论,述及边枝细叶,反而使读者望而却步,只见树木,不见森林.
想信通过对本教程的学习,读者可迅速掌握LabWindows/CVI编程思想及步骤,为读者日后进一步学习打下基础.
本书约定:
"File>>Page Setup>>Options"
File 这一种黑色斜体字是指多级菜单名,按扭名,窗口名或者是关键性词汇.
">>"
是指打开一个多级菜单或对话框.如:File>>Page Setup>>Options是指你首先打开File 菜单,然后选择Page Setup项,最后从弹出的对话框中选择Options项.
"说明:通过这种方式你可以修改Panel 顶端所显示的名字."
该种字体所写的文字是值得读者注意并记忆的内容.
" "
该椭圆形框所框住的内容是读者需修改的地方.
第一部分 CVI快速入门
本部分通过编制一个简单的LabWindows/CVI程序,使读者对CVI编程环境,思想及步骤有一初步的认识.
第一章 初步认识CVI程序设计
—— 从一个例子开始
我们的第一个示例将很简单,我们所要做的是创建一个如下的图形用户界面(User Interface).
当我们按下Acquire按扭,计算机会自动产生一个正弦波形并画在图形显示区中;当按下Clear按扭后则清除正弦波形;当按下Quit按扭后退出该程序.
现在我们就开使创建该程序.首先按下面步骤起动CVI:
开始>>程序>>National Instrument CVI>>CVI IDE
或者直接从桌面起动CVI 的快捷方式,双击桌面
National Instrument CVI 图标
当LabWindows/CVI打开后你就会见到如下所示的一个空的项目(Project)窗:
第一步:创建用户界面
创建控件元素:
从Project窗中选择:File>>New>>User Interface(*.uir)…创建一个用户接口文件(*.uir),CVI会自动弹出如下所示的窗口:
在该窗中Untitled Panel 的灰色区域中单击鼠标右键,变会弹出一个快捷菜单如下所示:
从该菜单中选择:Command Button>>Square Command Button
点击左键后便会创建一个方形的按扭.
由于本程序总共需要三个按扭,所以按照上面的步骤再创建两个方形按扭.从该菜单中选择:Graph>>Graph ,创建一个用于图形显示的Graph.
现在我们已经建好了用户界面所需的控件元素,请使用鼠标把它们拖到如下图所示的位置.
修改用户界面中各控件元素的属性:
修改Panel的属性:
在Untitled Panel中双击一下,便会弹出Panel的一个Edit Panel窗,如下图所示:
将Panel Title项中的Untitled Panel 改为 Demo Panel.
说明:通过这种方式你可以修改Panel 顶端所显示的名字.
将Auto-Center Vertically(when loaded)项
与Auto-Center Horizontally(when loaded)项前的矩形框选中.
说明:当选中后,程序运行时,面板会自动居中.
修改后的Edit Panel 应如下图所示:
点击OK按扭,完成对Panel属性的修改.
修改Graph的属性:
在Untitled Control的蓝色区域中双击一下,便会弹出Graph的一个Edit Graph窗,如下图所示:
将Label项中的Untitled Control改为ShowWave.
说明:通过这种方法可以修改Graph的标签名.
点击OK按扭,完成对Graph属性的修改.
3.修改Command按扭的属性:
(1)Acquire 按扭:
双击左上方的OK按扭,便会弹出Command的一个Edit Command窗,如下图所示:
将Constant Name项改为ACQUIRE
说明:Constant Name是程序中用来标识该控件元素的常量,在后面的编程中会用到.
作者: 立士心 2005-10-4 15:29 回复此发言
--------------------------------------------------------------------------------
2 [资料1]LabWindows/CVI基础教程
将Callback Function项改为AcquireCallback
说明:Callback Function(回调函数)是程序中用来响应界面中的Windows消息,
也就是说:当 该按扭被点击之后,程序会调用AcquireCallback函数来作为
对按扭被按下这一消息的响应.
将Label项改为 Acquire
说明:通过这种方法可以修改按扭名字,Acquire中A字母前有下画线,是指可
以通过 Alt + A即可达到按下该按扭的效果(即热键).
修改后的Edit Command Button窗应如下图所示:
点击OK按扭,完成对Command Button属性的修改.
(2)Clear 按扭:
与以上步骤相同,双击左下方的OK按扭,弹出Command的一个Edit Command窗.
将其Constant Name改为CLEAR
将Callback Function项改为ClearCallback
将Label项改为 Clear
修改后的Edit Command Button窗应如下图所示:
点击OK按扭,完成Command Button属性的修改.
(3)Quit 按扭:
与以上步骤相同,双击右方的OK按扭,弹出Command的一个Edit Command窗.
a. 将其Constant Name改为QUIT
b. 将Callback Function项改为QuitCallback
c. 将Label项改为 Quit
修改后的Edit Command Button窗应如下图所示:
点击OK按扭,完成Command Button属性的修改.
当完成以上工作后,Panel应该如下图所示:
选择:File>>Save 保存UIR文件,命名为FirstSample.uir.
到目前为止我们已经完成了用户界面(user interface)的设计,当程序运行时所显示的界面就是我们刚才上图看到的那样.
下面我们要做的就是真正的程序编制工作,其实CVI可以自动生成许多的代码以及缺省消息的处理函数,你只需添加一些你自己所需的一些代码.
第二步:完成程序的编制
产生程序代码:
现在请你让图形用户界面窗口为当前响应状态,如下图所示:
从用户图形界面窗口中选择:Code>>Generate>>All Code…
然后会显示出如下的界面:
请用你的鼠标点击Select QuituserInterface Callback 中的QuitCallk项,确保其前面出现一个小钩.
说明:1.当你想让你的程序的主函数为Win Main而不是Main时你可以选择
Generate WinMian( ) instead of Main( )项前的矩形框.
2.Select panels to load and display at startup 项是指你选择那一个Panel作为最初
装入并显示的Panel,当你创建多个Panel时你就需要选择一个Panel作为最初显
示的面板.由于本程序只有一个Panel所以该Panel就被缺省的作为最初显示
的面板而不再需要你去选择.
3.Select QuituserInterface Callback 项是指你选择那一个函数作为退出程序的终
止函数.本程序是让QuitCallback作为退出函数的.
点击OK按扭,便会弹出如下图所示的源代码(Code)窗:
其窗中的程序代码如下所示:
#include
#include
#include "FirstSample.h"
static int panelHandle;
int main (int argc, char *argv[ ] )
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "FirstSample.uir", PANEL)) >Advanced Analysis…
在弹出的对话框中选择:
Signal Generation>>Sine Pattern
便会弹出如下图所示的一个函数面板:
请在Number of Elements项中填上512;把Number of Cycles 项改为3;Sine Pattern 项中填上用来装正弦信号的数组Wave,由于Wave是一个数组变量,故我门需要声明该变量:
选择Code>>Declare Variable会弹出一个如下图所示的对话框:
请在Number of Elements 项中填上512,并选择了最下面的矩形框,
然后点击OK按扭完成.
返回到函数面板后,选择Code>>Insert Function Call完成函数的插入,这时Code 窗中的AcquireCallback( )函数应如下所示:
int CVICALLBACK AcquireCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double Wave[512];
switch (event)
{
case EVENT_COMMIT:
SinePattern (512, 1.0, 0.0, 3.0, Wave);
作者: 立士心 2005-10-4 15:29 回复此发言
--------------------------------------------------------------------------------
3 [资料1]LabWindows/CVI基础教程
|
break;
}
return 0;
}
我们已经的得到了正弦信号,现在需要将该信号画到Graph上去:
1).请将鼠标放在SinePattern( )函数下面的空白行上,如上面所示那样.
. 请选择:
Library>>User Interface
在弹出的对话框中选择:
Controls/Graph/Strip Chart>>Graph and Strip Chart>>Graph Plotting and Deleting>>Plot Waveform
把函数面板中的对应各项填写成如下所示:
PanelHandle: panelHandele
Control ID : PANEL_GRAPH
Y Array: Wave
Number of Points: 512
选择Code>>Insert Function Call完成函数的插入,这时Code 窗中的AcquireCallback( )函数应如下所示:
CVICALLBACK AcquireCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double Wave[512];
switch (event)
{
case EVENT_COMMIT:
SinePattern (512, 1.0, 0.0, 3.0, Wave);
PlotWaveform (panelHandle, PANEL_GRAPH, Wave, 512, VAL_DOUBLE, 1.0,
0.0, 0.0, 1.0, VAL_THIN_LINE, VAL_EMPTY_SQUARE,
VAL_SOLID, 1, VAL_RED);
break;
}
return 0;
到现在为止我们已经完成了AcquireCallback( )函数的的程序代码.
添加ClearCallback( )函数的程序代码:
ClearCallback( )函数完成以下功能:当Clear按扭按下后,计算机会清除Graph上所画的正弦图形.
现在请将鼠标放在ClearCallback( )函数Event_Commit:
下面的空白行上,如下图所示:
请选择:
Library>>User Interface
在弹出的对话框中选择:
Control/Graph/Strip Chart>>Graph and Strip Chart>>Graph Plotting and Deleting>>Delete Graph Plot
把函数面板中的对应各项填写成如下所示:
PanelHandle: panelHandele
Control ID : PANEL_GRAPH
PlotHandle: -1
选择Code>>Insert Function Call完成函数的插入,这时Code 窗中的ClearCallback( )函数应如下所示:
int CVICALLBACK ClearCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);
break;
}
return 0;
}
到目前为止我们已经完成了程序的编制任务.这一个看起来不算简单的程序,我们编起来并没有写多少源代码,这正是体现了LabWindows/CVI的强大功能所在.
第四步 运行程序完成项目文件
现在请你让源代码(Code)窗为当前响应状态,选择:
Run>>Debug FirstSample_dbg.exe
便会弹出一个对话框,询问你是否在编译前为该文件命名并添加到工程文件中去.点击yes按扭,把该文件命名为FirstSample.c.然后计算机询问你是否把 "analysis.h"包含到FirstSample.c中去(因为,我们的程序中用到了高级分析库),点击yes按扭,同意该选项.
运行后的程序正如我们预期要求的那样.退出程序后,从源代码(Code)窗中选择:
Window>>Project
现在项目 (Project)窗为当前响应状态,请选择:
Edit>>Add Files to Project…>>All Files(*.*)
便会弹出如下图所示的对话框:
请你按住键,点击FirstSample.h ,FirstSample.c ,
FirstSample.uir.然后点击Add按扭把这些文件方到Selected Files框中.
点击OK按扭,把以上文件添加到工程文件中去.
至此为止我们已经完成了第一个程序的编制工作,想必大家对
LabWindows/CVI编程已经有了一个初步的了解,头脑里已建起程序编制的基本框架.
通过本部分的学习,你是否已经掌握
LabWindows/CVI 程序编制的基本步骤.
简单的用户图形界面(*.uir)的创建.
能使用函数面板完成函数的插入,构建源代码程序.
项目工程文件的基本构成.
第二部分 CVI环境下程序设计
通过编制第一章的FirstSample程序,读者已对LabWindows/CVI编程有一定了解.本部分就是在第一部分的基础上进一步讲述LabWindows/CVI程序设计及其编程环境等细节问题.这一章所讲内容请大家都务必动手实际操作一下,只有这样才能使你真正的掌握本章的内容.看完本章后请大家结合第一章把FirstSample重新编制一遍,以巩固本章所讲的加速LabWindows/CVI编程的技巧.
作者: 立士心 2005-10-4 15:29 回复此发言
--------------------------------------------------------------------------------
4 [资料1]LabWindows/CVI基础教程
第二章 LabWindows/CVI 程序剖析
通过例程FirstSample的编制,大家已对LabWindows/CVI编程有了初步的认识.本章是作者从总体上来谈谈自己对LabWindows/CVI程序的理解与认识.
LabWindos/CVI 编程的步骤基本如下:
制定程序设计的基本方案
第一步 根据任务确定程序的基本框架如:
程序界面,程序中所需的函数等.
创建用户图形界面
第二步 根据第一步制定的方案
创建用户图形界面及回
调函数名.
程序源代码的编制
第三步 让计算机生成程序代码及回调函数
的基本框架.添加函数代码,完成
源代码的编制工作.
工程项目的完成
第四步 编译,调试程序.把头文件,用户图
形界面文件,源代码文件添加到项目
文件中去,完成整个程序的编制
程序框架及文件间的相互关系如下图所示(以FirstSample.prj为例):
项目工程文件
(FirstSample.prj)
用户图形界面文件 源代码文件 头文件
(FirstSample.uir) (FirstSample.c) (FirstSample.h)
panel include "FirstSample.h" 定义了程序中所需的常
事件消息 量以及函数原形.
Acquire按扭 AcquireCallback( )
事件消息 Wave[512]
Clear按扭 ClearCallback( )
事件消息
Quit按扭 QuitCallback( )
ShowWave
上图所画的构成一项目工程文件的各文件之间的关系是非常重要的.如果你能理解上图所示的内容,那么你就基本理解了LabWindos/CVI 程序的运作过程.
请读者仔细阅读以上内容并理解,这些都有助于读者从整体上去把握LabWindows/CVI 程序设计的核心思想,有益于读者进一步学习LabWindows/CVI.
第三章 LabWindows/CVI 编程环境
LabWindows/CVI开发环境有以下三个最主要的窗(window)与函数面板(Function Panel):
·项目工程窗(Project Window)
·用户接口编辑窗(User Interface Editor window)
·源代码窗(Source window)
下面就会对以上三个窗及函数面板作详细的介绍.
项目工程窗(Project Window)
一个项目工程窗(Project Window)如下图所示:
在项目工程窗中列出了组成该项目工程所有的文件,项目工程窗中的个菜单项功能如下:
File : 创建,保存或打开文件.可以打开以下文件:项目工程文
件(*.Prj)源代码文件(*.c),头文件(*.h)以及用户接口
文件(*.uir).
Edit: 在项目工程中添加或移去文件.
Build: 使用LabWindows/CVI 编译链接器.
Run: 运行一个项目工程.
Windows: 用来访问某个已经打开的窗,例如:用户接口编辑窗,
源代码窗… .
Tools: 运行向导(wizard)或者你添加到Tools菜单中的一些
工具.
Options: 设置LabWindows/CVI 的编程环境.
Help: LabWindows/CVI 在线帮助及Windows SDK 的函数帮
助.
工程项目文件显示了所列文件的状态,其各项的含义如下图所示:
文件名 这个标志是指源代码 最后修改该文件
文件是否是打开的 的日期时间
S是指该文件已经修 C是指运行该文件之 O是指你可以让该文件 I是指这是一个
改过了,请保存该文件 前必须先经过编译 编译而无需debugging 仪器驱动程序
如果你想进一步了解项目工程窗(Project window)细节请使用在线帮助.
请选择:Help>>CVI Library>>Related Help…Online Manuals For LabWindows/CVI
请查阅 LabWindows/CVI User Manual Chapter 3 Project window.
第二节 用户接口编辑窗(User Interface Edit window)
图形用户接口编辑窗是用来创建,编辑GUI(Graph Uer Interface)的.一个用户接口至少要有一个面板(Panel)以及在面板上的各种控件元素(Control Element).图形用户接口编辑窗为你提供了非常快捷的创建,编辑这些面板和控件元素的方法,可以让你在短时间里创建出符合你要求的图形界面.
一个图形用户接口编辑窗就如下图所示,下面我们就详细讲讲图形用户接口编辑窗各菜单项的功能:
File: 创建,保存或打开文件.
Edit: 可用来编辑面板或控件元素.
说明:其实我们直接用鼠标双击我们想要编辑对象即可(就象编制FisrtSample
作者: 立士心 2005-10-4 15:29 回复此发言
--------------------------------------------------------------------------------
5 [资料1]LabWindows/CVI基础教程
中修改面板和四个按扭那样).
Creat: 可用来创建面板和各种控件元素.
说明:其实我们只需在 Panel上点击鼠标右键,便会弹出一个快捷菜单,选择
你所想创建的对象即可(就象编制FisrtSample 时创建Graph和四个Button
那样).
View: 当创建多个面板后就可用该项来查看想要看的面板.
Arrange: 用来调节各个控件元素的位置与大小.
Code: 产生源代码,以及选择你所需的事件消息类型.
Run: 运行程序.
Library: 函数库.
说明:我们将在后面详细的介绍LabWindows/CVI的函数库.
Tools: 一些你可使用的工具项.
Windows: 用来访问某个已经打开的窗,例如:项目工程窗,用户
接口编辑窗,源代码窗… .
Options: 设置用接口编辑窗的编辑环境.
Help: LabWindows/CVI 在线帮助及Windows SDK 的函数帮
助.
说明:在用户接口编辑窗中有一快捷菜单是非常有用的,当你把鼠标指在某一控
件元素上点击右键后便弹出一快捷菜单,通过该菜单你可以生成回调函数
以及查看回调函数,而无须你再切换到源代码窗后再查看.这是一个大家
以后在编程中要常用到的技巧,请掌握.
图形用户接口编辑窗中还有四个模式选择按扭,现介绍如下:
当该按扭被按下后,你可以操作面板上的控件,同时在图形用户接口编辑窗的右上角上来观察面板上的事件消息.
在这种模式下你可以创建,编辑面板和控件元素以及修改它们的属性.
在这种模式下你可以直接修改控件元素的名字,标签等文字相关方面的东西.
在这种模式下你可以直接修改面板,控件元素的颜色.先把鼠标方在你所想修改颜色的对象上,点击右键便会弹出一个
选色对话框,选择你所想要的颜色后点击后即可.
在图形用户接口编辑窗中Panel 的灰色区域中单击鼠标右键,便会弹出一个快捷菜单如下所示:
说明:请读者用鼠标点击各项自己看一看,在这里就无须作者多言.
如果你想进一步了解用户接口编辑窗(User Interface Edit window)细节请使用在线帮助.
请选择:Help>>CVI Library>>Related Help…Online Manuals For LabWindows/CVI
请查阅 LabWindows/CVI User Manual Chapter 4 User Interface Edit window
源代码编辑窗(Sourse window)
你可以在源代码编辑窗中开发你的C 语言代码文件.例如:添加,删除,插入函数等编程所需的基本编辑操作.但是LabWindows/CVI 又有其独特的简捷快速的开发,编辑工具,可以让你在短时间内完成一个较复杂的C程序代码的开发.
一个源代码编辑窗(Source window)就如下图所示,下面我们就详细讲讲源代码编辑窗中各菜单项的功能:
File: 创建,保存或打开文件.
Edit: 可用来编辑源代码文件.
View: 设置源代码编辑窗的风格等功能.
Build: 编译文件以及编译设置.
Run: 运行程序.
Instrument: 装入仪器驱动程序.
Library: 函数库.
Tools: 一些你可使用的工具项.
Windows: 用来访问某个已经打开的窗,例如:项目工程窗,用接
口编辑窗,源代码窗… .
Options: 设置用接口编辑窗的编辑环境.
Help: LabWindows/CVI 在线帮助及Windows SDK 的函数帮
助.
说明:在编程中有一快捷菜单是非常有用的,当你把鼠标指在某一函数上点击右键后便弹出一快捷菜单,通过该菜单你可以查看回调函数以及与该函数对应控件元素.这是一个大家以后在编程中要常用到的技巧,请掌握.
第四节 函数面板(Fuction Panel)
在LabWindows/CVI 编程环境下,当你想在源程序某处插入函数时,你只需从函数所在的库中选择该函数后便会弹出一个与之对应的函数面板,你所做的就是:填入该函数所需的参数后完成插入即可.而且更为方便的是:若参数是一你以有的常量或变量,你只需点击常量或变量工具按扭后选择你所需的量即可;若参数是一变量,你直接可声明该变量而无须再切换至源代码窗.
下面我们就谈谈这些在LabWindows/CVI中可以加快你编程的技巧.
一个函数面板如下图所示:
这是FirstSample中产生一个正弦波的函数其中SinePattern项是用来装正弦波的数组,我们在程序中使用数组Wave[512] 来装正弦波的.当我们在SinePattern项填入Wave后,由于Wave是一变量,所以我们需要声明该变量:让鼠标指在Wave上然后点击工具条中的声明变量按扭 后, 便弹出一个声明变量对话框即可声明该变量为局域变量或为全局变量.
作者: 立士心 2005-10-4 15:29 回复此发言
--------------------------------------------------------------------------------
6 [资料1]LabWindows/CVI基础教程
当你所填参数是一以有的常量或变量,你只需点击选择常量或变量工具按扭后选择你所需的量即可,下面就介绍该技巧:
上图是FirstSample中把数组Wave中的正弦波画到Graph上去的PlotWaveform函数.其中,Control ID 项所填的是程序中用来标识GUI中控件元素的常量,该常量是由LabWindows/CVI自动在头文件中预定义的(你可以打开头文件看看).故当我们填入该常量时只需将鼠标放在Control ID项的文本框中然后用鼠标点击工具条中的选择属性或UIR常量按扭 后, 便弹出一个选择属性或UIR常量对话框,选择你所需的常量或属性即可.Panel Handle 是程序运行开始时UIR的句柄,是由LabWindows/CVI 自动生成的是一变量;Number of Points 项需填的是512,这正是我们在声明Wave时已用过的;Y Array 项所填的是我们已经声明过的变量 —— 数组Wave;故当我们填入以上各项时只需将鼠标放在对应项下文本框中,然后用鼠标点击工具条中的选择变量按扭 后, 便弹出一个选择变量对话框,选择你所需的变量Wave即可.
当你填完函数的参数后,点击插入按扭后即可完成函数的插入,而无须再选择菜单中的插入命令.
以上这些都是加快你编程的技巧,这些技巧你以后编程时是会非常频繁使用的.而这些也正是LabWindows/CVI 开发环境所独具的加快你编程速度的特色.
说明:当你的鼠标落在工具条按扭上时,计算机会自动的显示该工具按扭的功能.
请你使用上面所讲技巧重新编制FirstSample,我相信你将会有新的收获.
当你对函数中的某个参数有不明白的时候,你只须将鼠标置于该项的文本框中点击鼠标右键后便会出现对此参数说明的在线帮助,这一技巧在编程中是非常有帮助的.
如果你想进一步了函数面板(Function Panel )细节请使用在线帮助.
请选择:Help>>CVI Library>>Related Help…Online Manuals For LabWindows/CVI
请查阅 LabWindows/CVI User Manual Chapter 6 Using Function Panels
第四章 LabWindows/CVI 的函数库(Library)
LabWindows/CVI 其强大功能的所在就是基于其非常丰富的库函数.LabWindows/CVI 所提供的库函数从用户图形界面,数据采集,数据分析,仪器控制 … 到现在Internet时代的TCP.所以说LabWindows/CVI 在测量领域成为先锋的同时又与当前时代的新科技保持了同步.
下面我们就来谈谈LabWindows/CVI 的函数库,我们把LabWindows/CVI 的函数库分为了五个大的方面,各个方面又分成了不同的小类:
·数据采集方面(Data Acquisition),7个库:
Instrument Library: 仪器驱动库
GPIB/GPIB 488.2 Library: 仪器控制函数库
Data Acquisition Library: 数据采集函数库
Easy I/O for DAQ : 易用的数据采集函数库
RS 232 Library : RS 232 库
VISA Library : VISA 库
VXI Library : VXI库
·数据分析方面,两个库:
Formatting and I/O Library : 格式化以及输入输出库
Analysis Library: 分析库
或者Advanced Analysis Library: 高级分析库
·数据显示方面:
User Interface Library : 用户接口库
说明: 用户接口库中提供了许多用于与面板上各种控件元素打交道的函数,通
过这些函数你可以非常容易的把一个采集来的波形画到Panel 的Graph
上或删除Graph 上已画的图形;得到Panel上某个控件元素的数值以及
把某个数值写到Panel上的某个控件元素上去(亦就是改变该控件元素的
值);修该Panel上控件元素的属性.总之,你只有熟练掌握了用户接口
库函数后才能使你创建的用户图形界面正正的动起来,该库是初学者应迅
速熟悉的库.
·网络,通信与数据交换方面,四个库:
DDE Library : 动态数据交换库
TCP Library: TCP库
Active X Automation Library: Active X自动化库
DataSocket Library: DataSocket库
·其它方面:
ANSI C Library: 标准C 库
如果你想进一步了解LabWindows/CVI 函数库(Library)细节请使用在线帮助.
请选择:Help>>CVI Library>> Library Help中你感兴趣的库
作者: 立士心 2005-10-4 15:29 回复此发言
--------------------------------------------------------------------------------
7 [资料1]LabWindows/CVI基础教程
通过本部分的学习,你是否已经掌握
□LabWindows/CVI 程序设计步骤及程序的运行机制.
三个主要窗的基本操作.
在用户接口编辑窗中用快捷方式生成或查看回调函数,在源代码窗中用快捷方式返回到函数面板或对应控件元素等编程中所需的快捷操作.
在函数面板上声明变量,选择变量或常量,插入函数等快捷操作.
LabWindows/CVI 库的构成及其在编程中适用的方向.
第四部分 CVI 中数据采集的应用
通过前两部分的学习,读者应该已掌握了LabWindows/CVI程序设计的基本步骤,思路以及编程环境.本部分将在前两部分的基础上讲解LabWindows/CVI中的数据采集,并在讲解的过程中编制一个程序:EeasyIOSample .请读者确保自己已经安装了Daq驱动,否则你会找不到例子中要用到的函数.
Easy IO 库中数采函数的应用
本章我们将使用Easy IO 库中的数采函数来编制一个真正能用于实际工作中的数据采集程序 EasyIOSample.
我们程序运行时的界面如下图所示:
其中各控件元素的功能说明如下:
ChannelSrting 项是一字符串控件,我们通过该项来设置采集数据的
通道(数采路径).我们把该项缺省设置为:daq::1!(0)
其意思是指:采集设备(device)1的0通道(channel).
其中设备号正是你在Measurement &Automation 中所
看到的对应于数采板的编号.在数采停止时,该项是
可以修改的.daq::1!(0) 这段字符串是NI 数采通道的
语法表示,具体说明如下: daq::1!(0,2,5) 是指采集设
备1的通道0,2,5.daq::1!(2:6)是指采集设备1的通
道2,3,4,5,6.
ScanRate项是一数字控件,我们通过该项来设置扫描速率,其缺省
设置为1000
Acquire/Stop项是一开关控件,我们通过该开关来控制数据采集的开
始与停止.
Clear项是一按扭,当我们按下该按扭后即可清除Acquire Wave上所
画的波形.
Quit项是一按扭,当我们按下该按扭后,退出程序.
Acquire Wave项是一波形显示控件,我们所采集的数据正是通过该
控件来显示的.
现在我们就开使创建该程序.首先按下面步骤起动CVI:
开始>>程序>>National Instrument CVI>>CVI IDE
或者直接从桌面起动CVI 的快捷方式,双击桌面
National Instrument CVI 图标
当LabWindows/CVI打开后你就会见到如下所示的项目(Project)窗,里面装的正是我们上次创建的FirstSample.prj:
选择:File>>New>>Project(*.prj)…
便会弹出一个对话框,如下所示:
询问你是否移走当前的项目工程,点击OK按扭,确定移走后又会弹出一个对话框如下所示:
询问你转移该项目的选项,全选之后点击OK按扭后,便会弹出一个新的项目工程窗.
第一节 创建图形用户界面
从Project窗中选择:File>>New>>User Interface(*.uir)…创建一个用户图形接口文件(*.uir).
下图就是本程序应该创建的UIR界面:
请按下面步骤创建下列控件元素以及修改其属性:
创建一个string ,修改其属性如下图所示:
创建一个Numeric, 修改其属性如下图所示:
创建一个BinarySwitch, 修改其属性如下图所示:
创建一个Timer控件, 修改其属性如下图所示:
请你确保Control Settings中Enable项前的矩形框是空的,因为我们将AI Timer的初始状态设置为非运行状态.
说明:Timer控件是一我们在编程时常用到的控件,当程序运行时图形用户界面上是看
不到Timer控件的.当你设置Timer有回调函数时,计算机会每隔固定的时间调
用一次Timer的回调函数.该时间间隔你是可以在Edit Timer 窗中Contro Settings
的Inteval(seconds)项中设定的.本程序设定时间间隔为0.1秒,也就是说:当程
序运行时,每隔0.1 秒AITimerCallback( )函数就会被调用一次.
创建一个Graph控件, 修改其属性如下图所示:
创建两个Command控件, 修改它们属性分别如下两图所示:
最后修改Panel的属性如下图所示:
创建好各控件元素后,将它们按下图所示排放好各自的位置:
说明:由于程序运行时,AI Timer 控件并不在界面中显示,故AI Timer的位置你可以随
作者: 立士心 2005-10-4 15:29 回复此发言
--------------------------------------------------------------------------------
8 [资料1]LabWindows/CVI基础教程
意放置.
选择:File>>Save 保存UIR文件,命名为EasyIOSample.uir.
第二节 产生程序代码与添加函数代码
从用户图形界面窗口中选择:Code>>Generate>>All Code…
产生源程序框架.
其源程序代码中需要你注意的如下:当某一行字符是蓝色时是指该行代码是需要我们添加上去的.为了作者讲解函数功用的方便,作者按照顺序把插入的函数编了号,标注在该函数的顶头.
#include
#include
#include
#include "EasyIOSample.h"
static int panelHandle;
static long AiTask;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "EasyIOSample.uir", PANEL)) >User Interface>>Controls/Graph/Strip Chart>>General Functions>>Get Control Value.
GetCtrlVal (panelHandle, PANEL_CHANNEL_STRING, ChanString) 使用该函数我们可以得到字符串ChannelString的值(请在该函数面板中声明局部字符串变量ChanString).插入该函数时请选择:Library>>User Interface>> Controls/Graph/Strip Chart>>General Functions>>Get Control Value.
GetCtrlVal (panelHandle, PANEL_SCANRATE, &ScanRate) 使用该函数我 们可以得到数字量ScanRate的值(请在该函数面板中声明局部双精度变量ScanRate).插入该函数时请选择:Library>>User Interface>> Controls/Graph/Strip Chart>>General Functions>>Get Control Value.
nidaqAICreateTask (ChanString, kNidaqWaveformCapture, &NumChan, &AiTask) 使用该函数我们可以创建一个模入采样任务AITask(请在该函数面板中声明全局整型变量AITask), 同时该函数根据ChanString可以返回一个表示该采样任务共有多少个通道的值NumChan(请在该函数面板中声明局部整型变量NumChan).插入该函数时请选择:Library>>EasyIO For DAQ>>Analog Input >>Intermediate Analog Input>>AI Creat Task(Required).
nidaqAIConfigScanClockRate (AiTask, ScanRate, &ActScanRate) 使用该函数我们可以设置采样的扫描速度ScanRate并且通过 ActScanRate返回采样的实际扫描速度(请在该函数面板中声明局部双精度变量ActScanRate).插入该函数时请选择:Library>>EasyIO For DAQ>>Analog Input >>Intermediate Analog Input>>AI Config Timing…>>AI Config Scan Clock Rate…
nidaqAIConfigBuffer (AiTask, 2000000, kNidaqContinuous) 使用该函数我们可以设置采样缓冲为2M(即2000000).插入该函数时请选择:Library>>EasyIO For DAQ>>Analog Input >>Intermediate Analog Input>>AI Config Buffer…
nidaqAIStart(AiTask)使用该函数我们可以启动数据采集任务.插入该函数时请选择:Library>>EasyIO For DAQ>>Analog Input >>Intermediate Analog Input>>AI Start (Required)…
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 1) 我们在UIR 中将AI Timer的属性设置为非运行状态,现在通过该函数将AI Timer 属性设置为 Enable 即从现在开始AI Timer 开始运行,每隔固定的时间间隔调用一次AITimerCallBack( )函数.插入该函数时请选择:Library>>User Interface>> Controls/Graph/Strip Chart>>General Functions>>Set Control Attribute...
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 0) 使用该函数我们可以让控件AI Timer停止工作.插入该函数时请选择:Library>>User Interface>> Controls/Graph/Strip Chart>>General Functions>>Set Control Attribute...
nidaqAIStop (AiTask) 使用该函数我们可以停止采样任务.插入该函数时请选择:Library>>EasyIO For DAQ>>Analog Input >>Intermediate Analog Input>>AI Stop (Required)…
nidaqAIDestroyTask (AiTask) 使用该函数我们可以取消采样任务.插入该函数时请选择:Library>>EasyIO For DAQ>>Analog Input >>Intermediate Analog Input>>AI Destroy Task(Required)…
作者: 立士心 2005-10-4 15:29 回复此发言
--------------------------------------------------------------------------------
9 [资料1]LabWindows/CVI基础教程
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1, VAL_IMMEDIATE_DRAW)使用该函数我们可以清除Graph控件上所画的图形.插入该函数时请选择:Library>>User Interface>>Control/Graph/Strip Chart>>Graph and Strip Chart>>Graph Plotting and Deleting>>Delete Graph Plot…
nidaqAICheck (AiTask, &AcqState, &AcqBacklog)使用该函数我们通过返回AcqState参数的值可得知采样过程的状态;通过返回AcqBacklog参数的值可得知所采样以放在缓冲中的有多少个点我们未读取(请在该函数面板中声明局部长整型变量AcqState与AcqBacklog).插入该函数时请选择:Library>>EasyIO For DAQ>>Analog Input >>Intermediate Analog Input>>AI Destroy Task(Required)…
nidaqAIRead (AiTask, ChanString, AcqBacklog, -1.0, AcqData) 使用该函数我们可以将缓冲中未读的数据读到数组AcqData中(请在该函数面板中声明局部双精度数组变量AcqData[10000]).插入该函数时请选择:Library>>EasyIO For DAQ>>Analog Input >>Intermediate Analog Input>>AI Read (Required)…
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1, VAL_IMMEDIATE_DRAW)使用该函数我们可以清除Graph控件上所画的图形.插入该函数时请选择:Library>>User Interface>>Control/Graph/Strip Chart>>Graph and Strip Chart>>Graph Plotting and Deleting>>Delete Graph Plot…
PlotWaveform(panelHandle,PANEL_GRAPH,AcqData,AcqBacklog,VAL_DOUBLE, 1.0, 0.0, 0.0, 1.0, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED) 使用该函数我们可以将读到数组AcqData中的数据(AcqBacklog个数据)画到控件Graph上.插入该函数时请选择:Library>>User Interface>>Control/Graph/Strip Chart>>Graph and Strip Chart>>Graph Plotting and Deleting>>Plot Waveform ..
下面我们将仔细讲解当Acquire/Stop开关被扳上(下)去后程序的运行过程.程序流程图如下:
GetCtrlVal (panelHandle, PANEL_ACQUIRE, &Value)
// 得到Acquire/Stop二进制开关的值Value
= 0 SetCtrlAttribute ( )
Value // 让AITimer 停止工作
=1
GetCtrlVal (panelHandle, PANEL_CHANNEL_STRING, ChanString)
// 从UIR上字符串控件ChannelString得到采样通道设置
GetCtrlVal (panelHandle, PANEL_SCANRATE, &ScanRate)
// 从UIR上数字量控件ScanRate得到采样扫描速率设置
nidaqAICreateTask ( ) // 创建采样任务
nidaqAIConfigScanClockRate ( ) // 设置扫描速率
nidaqAIConfigBuffer ( ) // 设置缓冲区大小
nidaqAIStart( ) // 采样任务开始
SetCtrlAttribute ( ) // 让AITimer 开始工作
注意:让AITimer开始工作其实也就是每隔一定的时间间
隔调用一次AITimerCallback( )函数
每隔0.1秒
AITimerCallback( )
{
nidaqAICheck ( ) // 检查采样过程中缓冲的状态
nidaqAIRead ( ) // 从缓冲中读取数据
DeleteGraphPlot( ) // 先清除Graph上已有的图形
PlotWaveform( ) // 把从缓冲中读到的数据画到Graph上
}
AITimer 是 No
否停止工作
Yes
nidaqAIStop ( ) // 停止采样任务
nidaqAIDestroyTask ( ) // 取消采样任务
到此为止我们已经完成本章的学习,有些内容需要读者反复研读以理解LabWindows/CVI在数据采集中的应用,该程序亦可作为读者进一步学习LabWindows/CVI的敲门砖.
通过本部分的学习,你是否已经掌握
□ LabWindows/CVI 中数采程序设计步骤及程序的运行机制.
巩固在用户接口编辑窗中用快捷方式生成或查看回调函数,在源代码窗中用快捷方式返回到函数面板或对应控件元素等编程中所需的快捷操作.
巩固在函数面板上声明变量,选择变量或常量,插入函数等快捷操作.
后 记
通过对本书的学习,相信读者已经基本掌握了LabWindows/CVI编程基本操作.希望读者在初学时一定要注意程序设计的思想,而不必要过多的去抠一些细节问题.下面谈谈如何进一步学习与使用LabWindows/CVI的一些捷径.
在LabWindows/CVI安装目录下的Samples文件夹下有非常多的例程,请读者选择自己感兴趣类别的例子打开后看看,并且读者在开发项目时直接将这些例子中的一些程序拷贝到自己的程序中去.这样做,不但能减少开发时间并且减少程序的出错机率,这是一项实在值得读者注意的技巧.
怎么看懂例程 当读者打开一个例子后,通过查看控件对应回调函数,返回函数对应的函数面板以及查看函数参数在线帮助,你就可以通过这些方法看懂例程.从而即可以学习函数的使用也能够明白编制某类别程序的基本思想.
下面所列的是在使用LabWindows/CVI开发程序时值得一看的书目:
1.LabWindows/CVI在线帮助中CVI Library>>Online Manuals
For LabWindows/CVI 中的一些程序设计参考书.
2 .读者若装有NI公司的数采卡,则在装DAQ驱动后读者会在
在开始>>程序 >>National Instruments DAQ>>Documents中
找到下面这本书:NI-DAQ User Manual for PC Compatibles 该
书详细得介绍了怎样使用DAQ函数,实在是值得一读的一
本书. |
|