第3.3节 VI(虚拟仪器)的基本设计原则
前面我们已经讲过,在LabVIEW开发环境下,明确定义VI的组成为三个部分,我称它们为VI的“三件套”。而虚拟仪器的设计实质,就是VI的“三件套”的设计。下面就对主要的设计方法进行简要的介绍。
3.3.1 “三件套”之一——“前面版”及设计原则
就VI(虚拟仪器)本身而言,前面板的设计是至关重要的,因为它是用户唯一可见的部分,并担当着“人机对话”的重要任务,设计的好的话,甚至无须说明就可以引导整个程序按顺序或按设计要求执行。
通常,前面版又被称为:GUI(Graphical User Interface 图形化使用者界面的缩写),它的设计基本原则就是要求:简洁、合理、有效,最终必须将用户所关心的信息清晰的显示出来。
关于LabVIEW GUI的设计方法,有一本2001年出版的英文书:”LabVIEW GUI: Essential Techniques”,应该是唯一一本关于LabVIEW GUI设计的专著,很不错,我只是在某网站看到过一些简要介绍,一直也没有见到过“电子版”的该书。
使用LabVIEW设计的GUI与其它高级语言设计的GUI相比,坦率的讲并不是很漂亮。但此书中展现的一些设计实例还是相当不错的。换句话说,即便使用图形化语言也可以设计出美观、大方、实用的GUI。但与其它语言相比,可能要略花费一些的功夫。下面就给出一些前面版设计的一些基本原则:
1、前边板的尺寸
前边板的尺寸大小最好符合“黄金分割”的原则,即:高、宽比为:0.618。目前一般的电脑都的分辨率都优于1024x768的,所以适当留有一定的边缘,确保使用者还可以进行其它的操作。同时,也保证在应用程序发布时,在目标机上也不会造成界面过大的现象。
至于整个前面版的风格样式(古典、系统、新式),可以认真参考用户的意见或者随设计者的喜好符合企业文化的内涵(形成自己的独特风格)。如果作为系统集成的开发商,形成自己的独特风格的前面版是非常重要的。
2、程序运行时前面版的控制
前面版的右上角一般有三个控制按钮,分别是:最小化、最大化和关闭。对于测量和控制应用程序,我认为无须实现最大化和在这里控制关闭,所以在VI属性设置中将这两个功能取消。这样可以确保应用程序不会被随意中止,避免随意的中止程序运行而导致某些部件的损坏,这点对测量和控制应用程序的设计是非常重要的,要格外小心处理。
3、前面版的色彩
如果考虑到在室外使用或者光线比较好的地点使用,前面版的设计色彩的对比度要强烈些。但整个面板上的色彩不要太多,三到四种最好。请注意观察,NI产品的颜色基本为四种:深蓝色、明黄色及黑、白两色。其中,深蓝色是NI logo的主色调,也是NI公司的主色调。多年来,这种格调一直沿用下来。这大概也就是所谓的“企业文化”吧!
前边板上的图形显示控件,如果采用图片打印的方式保存时,建议将其背景的色彩设定为浅颜色(直接设定或打印时通过属性节点设定),避免打印机过多的打印深色背景而浪费墨粉。
LabVIEW网络讲坛:界面风云之 LabVIEW界面配色秘诀
请看一个中文讲座
4、前面版的控件
在LabVIEW环境下,前面版上的控件在“控件选版”上都可以找到,有“新式”、“系统”和“经典”三种。设计中控件的排放依据用户的需求,无关紧要的可以使用“Tab“标签页分成主、从页排放。有些控件可以由使用者来自定义其类型,从LabVIEW 8.0开始,NI又推出可自行设计的X控件,丰富了控件的种类和功能。关于自定义控件和X控件这两部分的内容我们将放在后面专门讨论。
用于声光报警信号的控件,最好安放在比较醒目的位置上,而声音报警也应能够关断或消声。
LabVIEW网络讲坛:界面风云之 LabVIEW 控件的妙用
5、前面版的“隐性”控件
前面版上有些控件是无须显示给用户看的,我称这样的控件为“隐性”控件。比如:像错误入、错误出及调试时相关信息的显示控件等等,可以把这些控件放到前面版的可视范围之外或通过快捷菜单将其设定为“隐藏”。
上面简单的介绍了虚拟仪器前面版的作用和最基本的设计原则。有些可以通过VI本身的属性来设定完成。其实,最主要、最核心的还是应用程序的设计是否正确、合理,其它的考虑应该是仅会起到“锦上添花”的作用。就象一本书的封面,设计的再好、再漂亮,但书中的内容枯燥、乏味,也无法称之为:“好书”!还有一点,艺术本身就是一个抽象的概念,是无法进行比较和量化的。前面版的设计只要符合大众的口味就可以了,你说呢?
LabVIEW网络讲坛:界面风云之 合理布局你的界面
3.3.2 “三件套”之二——“程序框图”及设计原则
LabVIEW图形化语言的程序框图的设计应该是虚拟仪器设计的核心部分。所以,有关这方面的内容还要相对仔细、认真的探讨一番。
程序框图的作用就是放置VI源代码的地方(程序框图本身有点象计算机程序的流程图),它与基于文本编程的程序语言中的文本行相对应。
在LabVIEW环境下,构成程序框图中的图形化代码三个核心要素是: 端子、连线、节点。下面我们分别进行介绍。
1、端子(Terminals)
端子是前面版的控件与程序框图之间及程序框图中的节点之间传输数据的端口。它类似于文本编程语言中的参数和常量。端子影射的是控件的类型(控制器、指示器)及它们的数据类型。
程序框图中端子之间的连线是用来传输数据。右图给出了前面板与程序框图间的关系,由此可见除“修饰控件”外,前面版上的每个控件都在程序框图中有个所对应的端子,起着前面版和程序框图间的数据传输作用。这也反映出虚拟仪器的特点。
端子在程序框图中,有两种表示方法:图标(见图中“数值“和”温度计”控件)和数据类型(见图中的“数值2”控件),它们之间可以通过弹击右键显现的快捷菜单来设定来进行转换。
每当我们在前面版上放置一个控件时,那么就会自动在程序框图上出现一个与它相对应的端子图标。并且输入控件与显示控件的图标也是不同的。无论在前面版上,还是在程序框图上,删除其中的任何一个都将删除该控件。
另外,在前面版上的每个控件都有自己的属性和方法,设计者可以通过“属性对话框”来设定这些属性。另外通过“属性”和“方法”节点还可以在程序中动态的修改它的属性。
在程序设计中灵活、恰到好处的使用“属性”节点和“方法”节点,会得到很多意想不到的结果,这点读者可以在编程中慢慢地体会。
有关属性的特点和使用方法,以后会有专门的叙述。
2、连线(Wire)
在图形化语言中,连线是两个端子间的数据通道或称为数据路径,它有些类似于文本语言中的变量或赋值。
事实上,由于数据类型不同的关系,在图形化语言中充分利用线段的形状、线型、颜色等不同的连线,来表示不同的数据类型。这也是图形化语言所特有的特点。
通常情况下,只有数据类型相同的端子间,才可以直接进行连线。不同数据类型的连线方法可以参考其它的教课书,这里就不讲了。
程序框图中的连线一定要简洁、清晰,应尽量避免在图标下穿过连线,适当的做些文字标记会提高程序的可读性。LabVIEW 8.6就新加入了连线整理的功能,使程序框图的设计更方便、更美观。
3、节点(Nodes)
事实上,我个人感觉是:“节点”这个词无论是从中文还是英文都是一个不好理解的词语,似乎与其想要表达的内容毫不相关。但是在LabVIEW图形化语言中,节点所要表达的概念和内容又相当重要。我猜想:“节点”这个概念大概是由数据流的概念中而引申来的,所想表达的意识是数据流入、流出节点。
LabVIEW图形化语言中的“节点”包括在右图所示的“函数”选项板中。归纳起来它有四种类型节点:
a、内置函数节点(或称为基本函数 、公共元素、基本元素)
b、子VI节点
c、Express VI 节点
d、结构节点。
节点相当于文本编程语言中的语句、函数和子程序。下面对这几种节点略做简要介绍。
a、内置函数节点(图标的背景为淡黄色):
内置函数节点是构成VI或图形化程序代码中最小的、最基本的操作元素,是执行基本操作的内部节点,应该是:LabVIEW的内核元素。比如:象加、减、乘、除、常数、常量等等。它们都基本上具有如下特点:
——至少有一个连接端口
——内部不可见(它们不是VI或子VI,VI和子VI用鼠标双击后,可以打开)
——程序的设计者不可对其进行编辑和修改
——它们是构成VI或子VI的最基本操作元素
——它们是节点中的一部分,可通过颜色辨别(图标中的背景为浅黄色)
——它们没有后缀.VI(因为它们不是VI)
——它们通常没有公共线程(错误簇)
最后这个特点也有它例外的时候,请看例子:见右图,当它们的输入数据为波形数据时,它们会自动生成公共线程连接端(做时域的加、减、乘、除)。同样它也支持动态数据类型。
这是一个极为有趣和有用的功能,我在做一个功率和电能测量的项目中,利用这个特点实现了有功功率和电能的时域乘法计算。
并且,这种时域相乘的方法,反映出的的功率因数特性也非常准确和直观,是一个非常简单、线性度又非常好的时域乘法器。前提是必须使用同步采集模块。
这就是“灵光一现”的例子,只要想到了这一点,马上就可以得到实际的验证。这也是LabVIEW最“牛”的地方之一。
思考一下:是否还可以实现“鉴相器”的功能?
而“+1”、“+”、"X^2"、“II"等这些内置函数仅对于幅值进行处理。
在这里顺便谈一下“波形数据”,这是数据采集中非常重要的一个数据类型,也应该是虚拟仪器(VI)中极为关键的部分。“波形数据”的出现,大大的简化了数据处理的方式和灵活性。这是其它编程语言很难做到的,特别是对于嵌入式系统的开发应用,图形化设计方法的优点是清晰可见、一目了然的。
从“内置函数”的几个特点来看它十分有趣,它们是构成性能强大的虚拟仪器的基础“零部件”。
b、子VI(内置vi)节点(图标的背景为白色):
在函数选项板中,还提供了许多子VI节点,它们图标的背景颜色含有白色,所以可以通过颜色来区分出来。它们都有后缀.VI
这些子VI是LabVIEW图像化语言提供给使用者使用的,双击它们可以打开,有前面版和程序框图及表明功能的图标和连接器。
子VI是严格定义的VI,或者说定义了图标和连接器。可被其它使用者调用。子VI是层次化和模块化VI的关键部件。
这些子VI来自于LabVIEW开发环境的底层库,使用者轻易不要对它进行改动,避免其它使用者找不到该函数。若想改动请另创建一个新的子VI(新名字),保存到使用者库中。
这里我想是这样我们应该称这些可做为子vi使用的vi为:内置vi。也就是说LabVIEW开发环境下提供的vi都应该称为:内置vi 。而LabVIEW开发环境所提供的例程称为:vi。
c、Express VI节点(图标的背景为蓝色):
Express VI(快速VI)是LabVIEW 7中增加的新函数,Express VI 节点的背景颜色为蓝色。它们没有后缀.VI 。
Express VI使用对话、配置的方式帮助设计者完成相应的测试、分析、处理。
使用Express VI时,LabVIEW开发环境自动生成该Express VI的功能底层代码,从而减轻用户编写低层代码的工作量。
用户也可以将Express VI转换成标准VI代码,但是这种转换是不可逆的。
用户也可以创造自定义的Express VI。
d、结构节点:
在函数面板上,还包括“For循环、While循环、定时的While循环、顺序结构、Case结构、事件结构等等,用来管理和控制程序流的节点。
有趣的“格式刷”
我们以LabVIEW提供的一个例程看看“格式刷”的作用
打开该VI后的程序框图
使用了“格式刷”后的程序框图
LabVIEW8.6提供了一个对程序框图进行整理的新功能,例图展示了整理前后的程序框图。可以看出整理后的程序框图有些类似于文本语言代码编写时语句段间的“缩近”味道。
程序框图上的主要部件(函数、节点)简单介绍完了。对于它们在设计中的使用方法和注意事项,由于这部份内容较多、交复杂,这里就不多介绍了,可参照相关书籍和LabVIEW的帮助文件来学习。
基本要点:
程序框图设计要紧凑,当使用的面积很大时,尽可能的使用LabVIEW开发环境提供的“导航窗”的功能。
可利用LabVIEW开发环境提供的“整理(类适于“格式刷”)”功能(8.6版)。
依照数据流的概念程序框图设计时,图标按数据流的关系从左至右排列。
在程序框图中大量的使用标注,应该是一个很好的习惯,初学者往往忽略这一点。
在以后项目介绍中,所涉及的主要是程序框图的设计,到那时在仔细分析吧!
3.3.3 “三件套”之三——“图标和连接器”及设计原则
在LabVIEW开发环境中,图标是VI、子VI在程序框图上节点的图形化符号。用来表示该节点的基本功能,每个VI或子VI都有自己的图标。所以在程序设计中要定义和设计出表达意义清晰的图标。
连接器是是VI或子VI节点定义数据输入、数据输出的部件,数据通过该部件从节点输入与输出。连接器是否被定义取决于它是否可以作为子VI使用。
连接器的引脚不要太多,通常选用12个的就足够用了,如本图所示。如果需要连接的信号比较多可以考虑使用簇捆绑。
因为图标是每个VI的标识,所以在设计中要体现出该VI的功能或特点。美观大方、突出用户自身的特性等等。
可以说:本节的内容是实践性比较强的,只有更多的实践才能使虚拟仪器的设计能力得到提高和增强。随着内容的深入这方面会得到提高。