第3.5节 LabVIEW开发环境
前面我们一再强调:LabVIEW是一个基于图形化编程方法的虚拟仪器软件开发环境。它包括了基于图形化程序设计的方法(G语言)、调试、运行、发布等等一系列环节。也就是说:LabVIEW提供了“三件套”的设计、调试、运行、发布等环境,从而完整的提供了虚拟仪器的图形化设计平台。
有关LabVIEW开发环境的详细操作使用方法,我们在这里不准备再做介绍,感兴趣的读者可以参考其它的书籍中相关的内容。我们在这里着重讨论下面几个问题。
3.5.1 LabVIEW图形化语言的核心要素——项目管理
自LabVIEW 8.0发布后,LabVIEW又推出一个新的功能“项目管理器”,用来管理项目中的VI文件和非VI文件。基于项目的管理使得应用程序的设计和开发显得更方便、更有序。因为它将应用项目所涉及到的全部文件统一在“项目管理器”下进行管理,所以,即便是通常较小的应用项目开发(非大型项目开发)也是非常实用的。
通过项目管理器窗口,可以直观的看到和管理所有的相关文件,包括实现给应用程序打包、发布共享库等等。
我们开发大型应用程序的机会不多,对于小的应用开发项目,我建议:还是独立的建立一个项目文件夹为好。在这个文件夹中,保存包含独立的应用项目及为它所设计、使用的子VI及相关文档文件。比如:温度测量项目文件夹、应力测量项目文件夹等等。这样作的好处是:可以确保文档资料的完整性,以防止丢失和更改。特别是可以将整个项目的资料(包括子VI库、文档、.exe文件、安装文件等等)保存在一张光盘中,供以后查阅和修改。
注意:LabVIEW项目中库中的VI,只是链接关系,上面我们所说的子VI,应该是具体使用的子VI。换句话说:如果有某个子VI,在项目A和项目B中都作为子VI使用,还是把它分别保存(实体保存而不是连接关系)在不同的项目A和项目B文件夹为好。这样做可能是违背了子VI的含义,但从文件的完整性和可修改性来看无疑是可取的,况且当代的计算机的硬盘很大,足够保存这些文件。
如何确定项目中的一个VI是连接关系,还是实体存在呢?我的经验是通过查找项目中的依赖关系来确定,见例图。
图中依赖关系下,所见的5-2000Hz谐波分析.VI就是连接关系。 此时最好的办法是:找到这个VI,然后实际保存到这个项目下。将来即便改动这个VI时,也就不会破坏其它的应用程序。 而vi.lib是LabVIEW自身的底层公共VI库,打包时系统会自动将其导入。
3.5.2 LabVIEW图形化语言的核心要素——编译器
特别值得一提的就是LabVIEW的图形代码编译器,它可以堪称是一个世界上最好的编译器。它是一个快速、内置、隐性的编译器。该编译器不仅性能非常出色,而且是被集成在开发环境中。通常我们根本就感觉不到它的存在,只有当你的程序设计出现错误时,它会提供错误提示,此时我们才会感到它的确是存在的。所以,LabVIEW编译器也是发现程序错误的第一道关卡。
与其它编程语言不一样,LabVIEW编译器是嵌入在LabVIEW开发环境中的即时编译器,我们根本无法察觉到它的运行时间或速度。因为它是在编程的每一步都进行编译的,当程序编制过程中出现错误或必要的参数还没有设定时,LabVIEW开发环境中的“运行”按钮呈现出折断形式。此时双击该按钮会弹出一个“Error List”的对话框,指出错误的数量、位置及可能产生的原因。用鼠标双击任何的一条灰化错误提示,它将自动导引你在程序框图上找到错误的发生地,并用虚线将产生错误的部件提示出。比如:我们在一个空白的程序框图上放置一个“DAQmx Write.vi”就会看到我们上述的现象发生。当我们将相关参数配置完成时,“运行”按钮恢复正常。
由于LabVIEW编译器可以即时发现错误,所以大大的减少了纠正错误的时间提高了编程效率(不必错误成堆才去处理)。
3.5.3 LabVIEW图形化语言的核心要素——数据流编程
传统的文本式编程语言是根据指令的先后顺序来决定应用程序的执行顺序,所以也被称为:“控制流”;而G语言则按照“数据流”的模式运行VI。所谓数据流也就是说:它所关心的是每个节点,当所有的输入端都具备了必要的输入数据时,程序框图节点将运行。节点在运行时产生输出数据并将该数据传送给数据流路径中的下一个节点。数据流经节点的动作决定了程序框图上VI和函数的执行顺序。数据流的特点也可以称为:数据依赖性(数据从属)。
数据流的工作原理和工作方式是类似于并行处理,而这种并行机制可能正是源于电子表格的处理方式。因为计算机的指令操作方式本身是顺序执行的。
数据流编程的方式给LabVIEW图形化语言带来了诸多好处,比如:并行机制、多线程编程和多核技术的利用等等。
使用LabVIEW图形化语言进行编程则必须按数据流的方式进行程序设计。所以,养成良好的数据流编程习惯是非常必要的。那么根据数据流的特点,这种方式编程时要注意哪些问题呢?
1、根据自然的数据的依赖关系,从左向右进行程序设计
从例图中可以清晰的表明数据流是依据数据依赖关系从左向右流动的。“差”只有在“和”完成后才能得到;以此类推,“积”必须在“差”完成后获得;而“商”也必须在得到“积”后获得。
所以,这里是利用数据依赖关系实现数据流的。图中比较好的呈现出数据流的关系,我们称之为“好的习惯”,建议大家习惯用这种方式来进行程序设计。
从控件摆放位置的角度看,通常都将输入控件放在程序框图的左边,而输出控件通常都是放在程序框图的右边。
这个例图是一个数据采集任务的部分程序框图,函数的位置安放,完全符合数据流的概念。
我们上面谈到利用数据依赖关系很容易满足数据流的要求(自然的数据依赖关系)。那么,当数据依赖关系不存在或不明显时,怎么办?
2、 利用强制数据依赖关系之一:顺序结构
如果我们想要知道一个vi的运行时间可以通过下面的实例程序进行测试,程序如下图所示。这里我们利用强制数据依赖关系“顺序结构”来满足数据流的要求。这里待测的vi我们用一个“等待”函数来代替。
顺序结构确保:第一帧:开始计时,第二帧:运行“等待”函数或待测vi,第三帧:停止计时并显示结果。
这里要注意两点:
第一:Windows操作系统的定时精度为:1mS。所以,测量结果会出现100±1mS。
第二:如果vi的运行时间很短小于1mS,可在第二帧内的vi外面加个N次的for循环增加运行时间。然后,在结果中再除个N。
现在,我们用“等待下一个整数倍毫秒”(定时选板)函数来替代“等待”函数,运行后会发生什么情况?这应该对理解这两个函数的不同会有所帮助。
3、 利用人工数据依赖关系之二:公共线程(错误簇)
利用各个函数之间的错误簇连接就实现了利用人工数据依赖关系,与上面连接的任务I/O起的作用是一致的(它们应该成对出现)。错误簇的另一个作用就是引导数据流,它是一个很好的公共线程。我们知道G语言的编程及程序运行都基于数据流的,使用错误簇会提供更加清晰的程序运行流程。
假如:我们的程序中共使用了5个vi,同时它们的错误簇依次串联,如果第一个vi出现错误,那么其它4个vi将都不会运行,错误将从第一个vi(Error Out)开始沿着错误簇按数据流的关系依次传递到最终的Error Out。这就是错误簇的运行机理。显然,错误的传递也遵循数据流的原则。
4、 利用人工数据依赖关系之三:引用句柄
对于引用句柄LabVIEW的帮助文档是这样介绍的:引用句柄可作为对象(例如,文件、设备或网络连接)的唯一标识。可使用不同类型的引用句柄控件将引用句柄输入或输出VI。
由于引用句柄是一个打开对象的临时指针,因此它仅在对象被打开期间有效。如关闭对象,LabVIEW图形化语言会将引用句柄与对象分开,引用句柄随即失效。如再次打开对象,LabVIEW图形化语言将创建一个与第一个引用句柄不同的新引用句柄。LabVIEW图形化语言将为打开的引用句柄指向的对象分配内存空间。关闭引用句柄,该对象就会从内存中释放。
由于LabVIEW图形化语言可以记住每个引用句柄所指的信息,如读取或写入的对象的当前地址和用户访问情况,因此可以对单一对象执行并行但相互独立的操作。如一个VI多次打开同一个对象,那么每次的打开操作都将返回一个不同的引用句柄。VI结束运行时LabVIEW图形化语言会自动关闭引用句柄,如果用户在结束使用引用句柄时就立即将其关闭,可最有效地利用内存空间和其它资源,这是一个良好的编程习惯。关闭引用句柄的顺序与打开时相反。例如,如果获得了对象A的一个引用句柄,然后对对象A调用方法使获得对象B的引用句柄,请先关闭对象B的引用句柄然后再关闭对象A的引用句柄。
关于引用句柄我们需要注意的是:“引用句柄”是有“生命周期“的。从我们打开引用句柄开始,它就进入新的“生命周期”,直道关闭“引用句柄”后它的“生命周期”结束。如果一个引用句柄的生命周期无限长,那么就意味着发生了“内存泄露”。所以在实际使用时必须注意“打开”与“关闭”必须是成双成对出现的。
3.5.4 NI 开发者套件及专业工具包
NI开发者套件是最有价值的虚拟仪器开发软件包。
The NI Developer Suite Core Package contains:
LabVIEW Professional Development System
LabWindows/CVI Full Development System
Measurement Studio Enterprise
LabVIEW SignalExpress
Database Connectivity Toolkit
Internet Toolkit
VI Analyzer Toolkit
Express VI Development Toolkit
PID Toolkit
Report Generation Toolkit
Advanced Signal Processing Toolkit
Digital Filter Design Toolkit
Device Drivers
除此之外,不同专业还有其它工具包可选配,如:
声音、振动工具包
阶次分析工具包
视频开发模块
运动控制模块
FPGA开发模块
嵌入式开发模块
触摸屏开发模块