LabVIEW对象的层次关系-KC10151803-C01解析
- 格式:ppt
- 大小:1.11 MB
- 文档页数:9
虚拟仪器系统及其开发程序LabVIEW介绍引言虚拟仪器是将仪器装入计算机,通过计算机的开发软件来实现仪器的功能的一种仪器测试测量系统。
目前开发虚拟仪器的软件程序为LabVIEW,用户只需通过软件技术和相应数值算法,就能实时、直接地对测试数据进行各种分析与处理,透明地操作仪器硬件,方便地构建出模块化仪器。
从目前虚拟仪器的发展方向和广泛应用来看,不久的将来,虚拟仪器将广泛应用在气象观测和气象科普中,因此有必要对该系统作一番介绍。
一、电子测量仪器的发展电子测量仪器发展至今,大体可分为四代:模拟仪器、数字化仪器、智能仪器和虚拟仪器。
第一代模拟仪器,如指针式万用表、晶体管电压表等。
第二代数字化仪器,这类仪器目前相当普及,如数字电压表、数字频率计等。
这类仪器将模拟信号的测量转化为数字信号测量,并以数字方式输出最终结果,适用于快速响应和较高准确度的测量。
第三代智能仪器,这类仪器内置微处理器,既能进行自动测试又具有一定的数据处理能力,可取代部分脑力劳动,习惯上称为智能仪器。
它的功能块全部都是以硬件(或固化的软件)的形式存在,相对虚拟仪器而言,无论是开发还是应用,都缺乏灵活性。
第四代虚拟仪器,它是现代计算机技术、通信技术和测量技术相结合的产物,是传统仪器观念的一次巨大变革,是将来仪器产业发展一个重要方向。
二、虚拟仪器概述及其特点虚拟仪器(virtual instrumention)是基于计算机的仪器,是美国国家仪器公司(National Instruments Corp. 简称NI)于1986年提出的。
计算机和仪器的密切结合是目前仪器发展的一个重要方向。
粗略地说这种结合有两种方式,一种是将计算机装入仪器,其典型的例子就是所谓智能化的仪器。
随着计算机功能的日益强大以及其体积的日趋缩小,这类仪器功能也越来越强大,目前已经出现含嵌入式系统的仪器。
另一种方式是将仪器装入计算机。
以通用的计算机硬件及操作系统为依托,实现各种仪器功能。
第一讲:认识Labview1.1 Labview 简介在开始菜单里找见NI Labview7.1 点击打开,会出现如下界面:从File>>New VI 或者从右半部分中的New>>Blank VI 都可以打开如下界面:上图中前图是虚拟仪器的前面板,是用户使用的人机界面,后面的是程序框图界面(即后面板)。
在LabVIEW的用户界面上,应特别注意它提供的操作模板,包括工具(Tools)模板、控制(Controls)模板和函数(Functions)模板。
这些模板集中反映了该软件的功能与特征。
下面我们来大致浏览一下。
工具模板(Tools Palette)如果该模板没有出现,则可以在Windows菜单下选择Show ToolsPalette命令以显示该模板。
当从模板内选择了任一种工具后,鼠标箭头就会变成该工具相应的形状。
当从Windows菜单下选择了Show Help Window功能后,把工具模板内选定的任一种工具光标放在流程图程序的子程序(Sub VI)或图标上,就会显示相应的帮助信息。
下面的两个模板是多层的,其中每一个子模板下还包括多个对象。
控制模板(Control Palette)Array注意:只有打开前面板时才能调用该模板该模板用来给前面板设置各种所需的输出显示对象和输入控制对象。
每个图标代表一类子模板。
如果控制模板不显示,可以用Windows菜单的Show ControlsPalette功能打开它,也可以在前面板的空白处,点击鼠标右键,以弹出控制模板。
控制模板如右图所示,它包括如下所示的一些子模板。
子模板中包括的对象,我们在功能中用文字简要介绍。
101112131415功能模板(Functions Palette)现功能模板。
功能模板是创建流程图程序的工具。
该模板上的每一个顶层图标都表示一个子模板。
若功能模板不出现,则可以用Windows菜单下的Show Functions Palette功能打开它,也可以在流程图程序窗口的空白处点击鼠标右键以弹出功能模板。
LabVIEW是实验室虚拟仪器集成环境(Laboratory Virtual Instrument Engineering Workbench)的简称,是美国国家仪器公司(NATIONAL INSTRUMENTS,简称NI)的创新软件产品,也是目前应用最广、发展最快、功能最强的图形化软件集成开发环境。
LabVIEW是一种图形化编程语言,又称G语言。
其编写的程序称为虚拟仪器VI(Virtual Instrument),以.VI后缀。
LabVIEW模板:◆工具模板(Tools Palette)◆控件模板(Controls Palette)◆功能模板(Functions Palette)VI的组成:◆前面板(Panel)控制(Control),指示(Indicator),修饰(Decoration)。
将前面板中的控制和指示统称为前面板对象或控件。
◆框图程序(Diagram Programme)节点(Node),数据连线(Wire)节点有:功能函数(Functions),结构(Structures),代码接口节点(CIN),子VI(SubVI)。
数据端口有:控制端口和指示端口,节点端口。
LabVIEW编程又称为“数据流编程”。
◆图标/连接端口(Icon/Terminal)把VI作为一个SubVI在其它VI中调用。
常用术语:SubVI 子VI Chart 实时趋势图LLBs VI库 Graph 事后记录图Objects 对象 Functions 功能Panel 前面板 Structures 结构Block Diagram 框图程序 Cluster 簇Control 控制 Bundle 打包Indicator 指示 Unbundle 解包Control和Indicator 前面板对象或控件 RefNum 枚举,标志号Palette 模板 Local Variable 本地变量Functions Palette 功能模板 Global Variable 全局变量Controls Palette 控件模板 Constant 常量Tools Palette 工具模板 Disable Indexing 无索引Terminal 端口 Enable Indexing 有索引Wires 数据连线 Read Local 本地读Bad Wires 错误数据连线 Write Local 本地写Node 节点 Read Global 全局读Attribute Node Write Global 全局写Property Node 属性节点 Legend 图例Frame 框架 Cursor 光标Channel 框架通道 Bounds 边界范围Index 索引 Data Acqisition(DAQ) 数据采集Shift Register 移位寄存器 Label 标签运行VI1.运行VI(Run)2.连续运行VI(Run Continuously)3.停止运行VI(Abort Execution)4.暂停运行VI(Pause)调试VI1.单步执行单步(入),单步(跳),单步(出)2.设置端点3.设置探针4.显示数据流动画数据类型:基本数据类型:数字型(Numeric),布尔型(Boolean),字符串型(String)构造数据类型:数组(Array),簇(Cluster)其它数据类型:枚举(RefNum),空类型数组(Array):索引号从0开始一维数组(1D,列或向量),二维数组(2D,矩阵)组成:数据类型,数据索引(Index),数据创建:1.控制模板->Array & Cluster子模板2.根据需要将相应数据类型的前面板对象放入数组框架中使用:1. Array Size返回输入数组的长度2. Index Array返回输入数组由输入索引指定的元素3. Replace Array Element替换输入数组的一个元素4. Array Subset从输入数组取出指定的元素5. Reshape Array改变输入数组的维数6. Initialize Array初始化数组7. Build Array建立一个新数组8. Rotate 1D Array将输入数组的最后n个元素移至数组的最前面9. Sort 1D Array将数组按升序排列10.Reverse 1D Array将输入的1D数组前后颠倒,输入数组可以是任何类型的数组11.Transpose 2D Array转置输入的二维数组,也叫矩阵转置12.Search 1D Array搜索指定元素在一维数组中的位置13.Array Max & Min返回输入数组中的最大值和最小值14.Split 1D Array将输入的一维数组在指定的元素处截断,分成2个一维数组15.Interpolate 1D Array线性插值16.Threshold 1D Array一维数组阀值,是线性插值的逆过程17.Interleave 1D Arrays将从输入端口输入的一维数组插入到输出的一维数组中18.Decimate 1D Array将输入的一维数组分成数个一维数组,是Interleave 1D Arrays的逆过程簇(Cluster):类似于Pascal语言的record和C语言的struct组成:不同的数据类型创建:控制面板—>Array & Cluster子面板;向框架添加所需的元素;根据需要更改簇和簇中元素的名称使用:1.Unbundle解包。
LabVIEW编程中的面向对象设计与开发方法LabVIEW是一种流程式编程语言,广泛应用于数据采集、仪器控制以及测试和测量领域。
面向对象设计和开发方法在LabVIEW编程中起着重要的作用,可以提高代码的可维护性和重用性。
本文将探讨LabVIEW编程中的面向对象设计与开发方法。
一、面向对象编程简介面向对象编程(Object-Oriented Programming,OOP)是一种程序设计范型,主要思想是将现实世界的概念抽象成为对象,并通过对象之间的交互来实现程序的功能。
面向对象编程具有封装、继承和多态等特性,能够提高代码的可读性和可维护性。
二、LabVIEW中的面向对象设计原则在LabVIEW中,可以通过使用面向对象的设计原则来提高程序的可维护性和灵活性。
1. 封装性(Encapsulation):将数据和操作封装在对象中,通过公共接口进行访问。
在LabVIEW中,可以使用类(Class)来实现封装性,将数据和方法封装在类中。
2. 继承性(Inheritance):通过继承机制,可以实现代码的重用,并且方便对代码进行扩展。
在LabVIEW中,可以使用继承关系来实现类之间的关联。
3. 多态性(Polymorphism):通过多态机制,可以实现接口的统一,提高代码的灵活性。
在LabVIEW中,可以使用虚方法(Virtual Method)和动态派生(Dynamic Dispatch)来实现多态性。
三、LabVIEW中的面向对象开发方法1. 创建类(Class):在LabVIEW中,可以通过面向对象的方式创建类。
首先,需要创建一个新的面板,并在控件栏中选择"新增类"。
然后,可以根据需要添加属性和方法,并设置访问权限。
2. 定义类的继承关系:在LabVIEW中,可以通过继承关系来实现代码的重用。
在创建类时,可以选择继承已有的类。
通过继承,子类可以继承父类的属性和方法,并根据需要进行扩展。
第三章数据类型:数组、簇和波形3.1概述数组是同类型元素的集合。
一个数组可以是一维或者多维,如果必要,每维最多可有231-1个元素。
可以通过数组索引访问其中的每个元素。
索引的范围是0到n – 1,其中n是数组中元素的个数。
图3-1所显示的是由数值构成的一维数组。
注意第一个元素的索引号为0,第二个是1,依此类推。
数组的元素可以是数据、字符串等,但所有元素的数据类型必须一致。
图3-1数组示意图簇(Cluster)是另一种数据类型,它的元素可以是不同类型的数据。
它类似于C语言中的stuct。
使用簇可以把分布在流程图中各个位置的数据元素组合起来,这样可以减少连线的拥挤程度。
减少子VI的连接端子的数量。
波形(Waveform)可以理解为一种簇的变形,它不能算是一种有普遍意义的数据类型,但非常实用。
3.2数组的创建及自动索引3.2.1创建数组一般说来,创建一个数组有两件事要做,首先要建一个数组的“壳”(shell),然后在这个壳中置入数组元素(数或字符串等)。
如果需要用一个数组作为程序的数据源,可以选择Functions»Array»Array Constant,将它放置在流程图中。
然后再在数组框中放置数值常量、布尔数还是字符串常量。
下图显示了在数组框放入字符串常量数组的例子。
左边是一个数组壳,中间的图上已经置入了字符串元素,右边的图反映了数组的第0个元素为:”ABC”,后两个元素均为空。
图3-1数组的创建在前面板中创建数组的方法是,从Controls模板中选择Array & Cluster,把数组放置在前面板中,然后选择一个对象(例如数值常量)插入到数组框中。
这样就创建了一个数值数组。
也可以直接在前面板中创建数组和相应的控制对象,然后将它们复制或者拖曳到流程图中,创建对应的常数。
还有很多在流程图中创建和初始化数组的方法,有些功能函数也可以生成数组。
3.2.2数组控制对象、常数对象和显示对象通过把数组与数值、布尔数、字符串或者簇组合在一起,可以在前面板和流程图中创建任何一种控制对象、常数对象和显示对象。
LabVIEW子VI与VI的层次结构例2-1 是我们创建的第一个VI,也是一个极其简单的VI。
其实在图形化语言中,最经常使用的是子VI。
子VI 类似于文本语言中的子程序。
在图形化语言中,子VI 是提供给其它VI 使用的VI,子VI 可以实现与调用VI 之间的数据交换。
子VI 除了可以被其它VI 使用外,它的另一个作用就是简化程序框图。
对于一个复杂的程序框图可以通过创建多个子VI 来进行化简。
子VI 是模块化程序设计的基础和主要部件。
子VI 使得程序易于调试、理解和维护。
所以理解和创建子VI 是构建VI 的基础。
LabVIEW 函数选板上所提供的内置VI都属于子VI。
这些内置VI 是LabVIEW 开发环境所提供的,安装LabVIEW 后即可获得。
除此之外,我们还可以创建适合自己使用的子VI。
2.5.1 创建子VI 创建子VI 有两种方法,一是通过创建一个新VI 来实现;另一个是从现有的VI 中提取部分代码构成一个子VI。
我们通过一个滤波器的设计来介绍第一种方法,创建一个适合自己使用的子VI。
例2-2 理想滤波器滤波器是信号处理中比较常用的部件,在实际工程应用中也常常用到。
一般情况下,我们可以选择LabVIEW 所提供的滤波器内置VI。
在LabVIEW 的函数选板中,选择:》信号处理》滤波器可以看到多种滤波器内置VI,包括高级IIR 滤波器和高级FIR 滤波器供我们在设计中使用,参见下图。
图2-14 LabVIEW 所提供的滤波器内置VI 我们在电动式振动台的测试项目中,需要准确测试振动加速度的峰值,可是在实际的加速度信号中往往包含许多谐波分量,从而导致无法准确的测量出加速度的峰值。
为了解决这个问题,最好的办法是就是对加速度信号进行滤波处理。
使用上述滤波器内置VI 可以实现滤波处理,但是我们担心滤波后信号的幅度和相位是否会发生改变。
也就是说,滤波器的幅频特性和相频特性是否真正会令我们满意。
其实,我们只是期待能够提取加速度信号的基波分量,并不关心其它分量的信息。
中大型LABVIEW软件三层设计架构中大型LABVIEW软件三层设计架构通常一个VI若包含三、四十个以上的subVI(不包含LabVIEW本身在Functions中提供的VI)时,就可算是一个中大型的软件计(softwareproject)了.虽然比起软件工程中的一些作业环境软件(如Windows系列)或大型应用软件(如Word、Excel)等仍算是小工程,但其复杂性亦在一定程度之上,若没有事先想好在撰写程序时的一些规划与方法,想要完成这类中大型的软件绝对不是一件简单的事.尤其这类软件通常不是由一个人,而是由一个团队所共同完成的,因此整个软件的结构,就要能让团队中的每一成员都能清楚的了解,而且要够简单,才算是好的软件结构.以下将参考由RickBitter等人所着lLabVIEWAdvancedProgrammingTechniquesr中之第4章的部分内容,介绍所谓软件计划中的三层式结构(theThree-TieredStructure)的概念及其优点.需要软件结构的主要原因,是当软件人员发展软件到某一阶段时,若没有计划或无意的创造了许多subVI,但各subVI之间有许多部分其实是重复撰写的;或各VI相互间呼叫时没有一定的纪律,使得在VIHierarchy中所看到的各VI间的联机是错综复杂,像个盘丝洞一般,这将可能会使多人发展的软件计划增加所耗费的时间和可能出错的机会、减低程序的效率,以及增加debugging时的困难.为了改善上述的情形,所以要提倡三层式结构的概念.三层式结构由上而下依次为:MainLevel、TestLevel和DriverLevel,这种结构是由经验中得来的,在多人发展的软件计划中显得简单明了,当大家都能遵照这个结构来写程序时,这种结构就可以充分显现出它的优点.那这三个阶层到底如何区别呢?以通俗的比喻来说,假设我们如果要组织一个篮球队参加全国比赛,每个球员要练习基本动作及体能,如何跑、如何跳、手脚该如何放置才是正确位置等,这就相当于系统中DriverLevel所做的事情;接下来,将各球员组合练习某一套防守或进攻的战术,如二三区域联防、人盯人防守,每个人该在什么位置才能正确接应等,则像是TestLevel中一项项的test了;而最后比赛时,场上的战略运用,包括何时要用什么战术组合、如何更换球员、何时喊暂停、终场前是不是要故意犯规或采拖延战术等等,对照过来,就像是在MainLevel中,如何将TestLevel中各test做最有效能的整合与排列组合等的工作.简单来说,DriverLevel包含了程序与所有仪器、组件、马达或其它应用软件的沟通、控制等较低阶的事情,使其可完成某一项基本的动作,例如初始化、马达走到home位置、雷射以设定的能量及频率发射光束等.可注意到我们在这边所说的driver,并不像一般在别处所称驱动程序的那种driver那么低阶,真正最低阶的工作还是要有现成的VI来帮忙才行;在TestLevel中,则是如何连接各个DriverVI的基本动作,使可做完出一套连续、有意义的流程,来执行某项测试,例如让手臂由A点走到B点,下降夹取一个螺丝,再走至C点装到某面板上,然后回到A点等待,类似这样控制一个流程的进行,便是TestVI的工作内容;MainLevel则包含了使用者接口(UserInterface)或称人机接口(Man-MachineInterface),目的是整合各项测试和例外处理(ExceptionHandling)等,将它们以适当的顺序及流程组合,很容易地让使用者操作.当一个软件计划严格的遵照上述的三层结构来撰写时,最大的优点是可使程序代码的再使用(codereuse)达到最大化,在不同的TestVI中,可重复使用相同的DriverVI;而在不同程序的MainLevel中,又可重复使用相同的TestVI,这将使得程序维护或修改的时间与精力大幅减少;同时当我们已有一个程序的样板(template)后,可增加软件版本更新的速度.另一个很重要的好处是,当我们在撰写某一个level中的程序时,并不需要关心在另一个level中有什么其它的程序是如何执行的,而只要专注在自己的这个level的程序上就可以了,这使得由团队来共同完成一个大型计划的工作变得容易许多.以下将依DriverLevel、TestLevel、MainLevel的顺序,来介绍在各level 写程序时的原则与心得:(1)DriverLevel:通常在DriverLevel所写的程序是比较低阶的,其功能是把一些最基本的I/O动作按某一顺序连接起来,形成基本动作,大致分为三大类:a.组态(configuration):开启或关闭与仪器的连结、将仪器初始化及设定组态等.b.量测(measurement):由仪器读出测量值或特定的资料.c.动作/状态(action/status):一个流程的启始或结束动作、检查错误等.简单来讲,DriverLevel的内容是藉由一些接口(卡),经digitalI/O或analogI/O由仪器取得上一些sensor的电压值,或传出一些电压值来控制机器、仪器或马达等的组态与动作,使得仪器或机器能够正确设定及做出一些基本的动作.另外程序与仪器间的资料传递或在自身计算机的存取动作,规定档案的格式以及存取等等,也都属于DriverLevel中应该完成的事项.但是真正最低阶的工作还是需要NI提供的VI来进行,我们所写的DriverVI仍是属于较高阶的.在大型程序计划发展时,一个观念很重要:DriverLevel中的VI是整个软件计划中最重要的部分,它们的好坏直接决定了这个软件计划的成功与否和完成后的品质,就像要盖高楼大厦,打地基、灌水泥以及基本用料的好坏才是决定建筑物好坏最重要的地方,若基础的部分不好,无论大楼外观有多雄伟或多漂亮,IP代理软件,假使地震一来,都有可能会倒塌.DriverVI若不先规划,往往会造成程序效率减低,以及重复的程序代码过多等现象.虽然在最后主程序执行时并看不到DriverVI,但它们可是最重要的无名英雄,所以在设计DriverVI时需要多费点心思喔!(2)TestLevel:在TestLevel中的VI此处暂称为TestVI,它可以呼叫DriverLevel的VI,但只能被MainLevel中的VI呼叫.有一个不成文的规定:TestVI间不可以互相呼叫;否则会使三层结构又被破坏了.可是在写程序时,有时又觉得难以避免,或为了图方便想说就暂时先呼叫一下吧,淘宝网女装冬装新款,若有这情形发生,那就要请重新检视一下DriverLevel中的VI,是否要重写某些部分或在写一些新的DriverVI,以避免上述的情形发生.有一个重要的原则,一个TestVI内只要安排一套完整的测试即可,不要在同一个TestVI中去完成两个(以上)的测试,否则未来若整个计划要作修改时,TestVI可能就又要修改了.一个完整的TestVI当然要包含对仪器设备的初始化,组态设定等,它是一个可以单独执行的VI,也就是说,即使此TestVI不放到MainLevel之下,它也一样可以单独执行来完成一项测试.另一个重要观念是,各个TestVI间是不要有什么关联的,因为当在MainLevel中的某个TestVI执行时,它并不确定前一个TestVI结束时的机器状态是否合于要求,因此要重新设定,或是要重新检查一下,以避免不能执行或有预料外的状况发生.流程图对于我们来撰写TestLevel中的VI是特别有用,因流程图的概念也正好就是LabVIEW中所谓dataflow的概念,因此当一项测试的流程图清楚的画出来并能解释其流程时,即使我们还没有开始写程序,我们几乎可以说这个TestVI的程序设计已完成60%以上了,这一点也不夸张,因剩下的部分只是将流程图中各方块的连接,换成LabVIEW中各functionVI或DriverVI的连接而已.(3)MainLevel:MainLevel又称人机接口(Man-MachineInterface,MMI),设计MainLevel程序的中心观念是不仅要能完成测试外,而且操作上要越能user-friendly越好,因为当使用者在操作仪器设备时,他其实并不见得很关心细节的部分是如何运作的,他或许只希望能很轻松愉快的尽快完成工作,然后轻松愉快的下班回家.例如,使用者希望手臂能够走到某特定位置去夹取一个螺丝,最好是按下某个屏幕上的按钮就好了,只要看着屏幕上一切正常的讯息,说不定他还可以有时间悠闲地喝杯咖啡呢!通常MainLevelVI的设计往往利用while循环不断的polling,大部分的时候也不只一个while循环.其内容要包含几个重点:a)可让操作者设定或更改操作参数:例如可选择何项测试及执行顺序、接口的地址、档案的路径等等,但也请注意,需设定的选项并非越多越好,太多的选项容易使人分散注意力而容易出错.b)在特定的情况下使用适当的Control:有时Control需加些心思来点变化,以表示其不同的重要性,最简单的当然是以大小、颜色来区别,当然在执行时也可利用propertynode中闪烁的效果来强调,不过一般而言,常用的重要Control 通常用按钮放在FrontPanel上显眼的地方;而较不常用的Control,通常利用放在cluster或tabcontrol中,淘宝网男装冬装,利用invisible的功能或换至其它页面使其平常不出现在FrontPanel上.较不常用的按钮,也较不用按钮的形式,而可在ControlsClassicControlsBoolean中选择RadioButton或Checkbox来使用.请记得一个原则,在FrontPanel上可看见的Control越少越好,因出现越多的Control,设定的参数就越有可能因不小心而改变,进而造成错误发生,要避免这种情形,可将Control连上另一Indicator后,在将Indicator放到FrontPanel显示其值即可.c)要将众多的Control及Indicator依使用功能分类,并适当地利用页面切换来显示.d)在执行程序时可以选择cancel或abort:这对操作者而言是十分重要的,但却容易被程序设计者所忽视,因程序设计者会不经意的假设操作者是非常了解他所写的程序,又非常熟练,而且一定照正确步骤不会按错按键.但实际上操作者可能并不熟练或很粗心等等,有时若一旦按下某个按钮就不能后悔的话,很容易造成万劫不复的悲剧.请注意,程序设计者一定要在程序中加入在执行中跳出程序的方法,而尽量避免由操作者去按下toolbar上的abort(红色圆形按钮)来跳出程序.e)在FrontPanel上多使用图形,避免过多的文字或数据.f)在MainLevel中统一处理所有的exceptionmassag e:这部分在程序设计中又称exceptionhandling,在软件工程上也是需要专门课程来讨论的,同时,这部分对于产品的商品化是非常重要的,在此只先简单叙述,之后会有专门的专题来讨论.先谈建立exceptionhandling机制的好处:它可告知操作者哪里有出错,或需要注意,使不是十分熟练的新手操作者,减低发生状况的机会;也方便制造厂商与程序设计者容易做除错及故障排除的动作,使得整个系统的开发及维护能较有效且所短时间.我们希望exceptionhandling可达到下列几个功能:当测试过程有错误状况发生时,程序可以自动修复错误,并继续完成测试或重新测试一次;或当测试过程有错误状况发生,且此错误不能修复时,程序能自动跳过有问题的部分,并继续完成测试;或测试过程有错误状况发生时,程序会将整个系统暂停或终结,并告知操作者错误发生处.上面叙述起来似乎很简单,但实际上它需要程序设计者看到实际操作后的结果,再一项一项加到整个程序中,然后再故意发生错误来测试,也因为如此,它可算是整个软件计划发展过程中非常耗时耗力的一部分.若借用前述所提过的StateMachine的写法,会使得exceptionhandling的程序设计较为简单,因StateMachine中原本就有安排一个errorstate,可让程序设计者在那里统一撰写处理各种exception/errormessage,然后在errorstate中判断,是回到原来的测试中,或是走到closestate去结束此项测试.因此是强烈推荐采用StateMachine的写法.以上简单叙述了三层式软件结构的设计概念,及各个level中所应要包含的重点,这边再写一些个人的实战心得:三层式结构它是一个原则,并非一个绝对的规定,但千万要了解他的精神所自,它的精神是:各个VI是属于那一个level要区分清楚,同一个level间的VI不要互相呼叫,程序的codereuse要最大化.这样一来,当你要维护或修改这个软件时就会比较容易了;同时,就算有团队中的成员突然插入修改的工作也能很快了解整个架构而上手.实际上在采用三层式结构时,可由MainLevel的VIHierarchy图中,来看你是否有按照这种写法,通常为了好看起见,不同level中的VI其icon我们分别用不同的颜色来区别.例如下两图,左图的程序就有符合标准,很清楚的三层式结构,使整个软件计划的架构一目了然.右图则较不好,因其在Test1中又呼叫了属于同一level的Test2,而Main这个VI又直接呼叫了Driver2来使用,因此造成原分别属于不同level各VI间的分界并不明显,这样也就达不到三层式结构的目的,也显现不出其优点了.或许有人会说反正写出来的程序可以执行,也可以达到正确的结果不就好了,但上两图只是以较小型的程序为例而已,实际上熟悉三层式结构这种写法的目的是在于较容易发展及维护大型的程序计划,因此在平时写较小型的程序时就要多加练习及养成习惯,切莫以解决眼前的小程序为满足,而不去练习及体会它的精神所在.请相信一点,三层式结构并不是只为了VIHierarchy图好看而已,它确实能增进设计程序的速度及效率,越大型的程序就越能显现其优点.在实际运用三层式结构的写法时,有时会发生一个情况,只有三层可以选择,excel表格的基本操作,实在是无法将所有的VI只分成三个level的话怎么办?那就要秉持三层式结构设计的精神,仔细规划一下到底需要几层,excel表格的35招必学秘技,四层?五层?在个人的经验里,用到四层则是有的,尚未有用到五层的例子,例如可将DriverLevel再分为UpperDriverLevel及LowerDriverLevel(这是我自己的命名,仅供参考),这样就变为四层式的结构了.请记得坚持同一level中的VI不要互相呼叫的原则,这样即使分为四层或五层,我想也是可以很容易且清楚的了解整个软件计划的架构的.。
Labview面向对象编程快速入门一、类和对象的基本概念在面向对象编程中,类用来表示通用特性。
例如,假设有一个描述汽车的类。
类中定义了各种汽车的通用特性。
对象是类的特定实例。
汽车类的一个对象,可以是某一辆特定的汽车。
类的定义决定该汽车(对象)的行为。
类中定义了和对象相关的数据和方法。
仍以汽车为例。
世界上有许多类型的汽车。
汽车可分为轿车、卡车、公共汽车等不同类别。
汽车的车身上有车门,排挡上有齿轮。
车门和齿轮的数量信息都是汽车的相关数据。
汽车还可加速或刹车。
加速或刹车都是汽车的行为(或称为方法)。
汽车相关的数据和方法,构成了汽车类的定义。
通过类的创建,可定义对象的数据和方法。
下图示范了汽车类在LabVIEW中的表示。
LabVIEW将汽车类的数据存储在Vehicle.ctl中,将汽车的方法存储在Start Vehicle VI和Stop Vehicle VI两个VI中。
对象是类的特定实例。
指定的某一辆汽车是汽车类的一个特定实现,或称为汽车类的一个对象。
下列Main VI的程序框图中,有一个汽车类的对象。
对象包含哪些数据和方法,是通过类来定义的。
LabVIEW将类的数据存储在一个控件中,用户创建的成员VI即是LabVIEW类的方法。
为使LabVIEW面向对象编程的概念更为清晰,可通过如下方式区分LabVIEW 类的不同用户:∙LabVIEW类开发人员-开发LabVIEW类,以供其他开发人员及程序员使用。
LabVIEW类开发人员适合拥有面向对象编程经验的人员担当。
LabVIEW类开发人员必须理解LabVIEW类及其机制。
∙LabVIEW类用户-使用LabVIEW类开发人员所创建的类。
LabVIEW类用户可以在应用程序中利用面向对象编程的优势,但无需了解类的运行机制,LabVIEW类用户不一定有面向对象编程的经验。
LabVIEW类开发人员发布类之后,LabVIEW类用户可能不具备访问该类内部操作的权限。
LabVIEW类开发人员对LabVIEW类所作的修改,应极少影响LabVIEW类用户所开发的应用程序。
显示对象(Indicator)、控制对象(Control)和数值常数对象:显示对象和控制对象都是前面板上的控件,前者有输入端子而无输出端子,后者正好相反,它们分别相当于普通编程语言中的输出参数和输入参数。
数值常数对象可以看成是控制对象的一个特例。
在前面板中创建新的控制对象或显示对象时,LabVIEW 都会在流程图中创建对应的端子。
端子的符号反映该对象的数据类型。
例如,DBL 符号表示对象数据类型是双精度数;TF 符号表示布尔数;I16 符号表示16位整型数;ABC符号表示对象数据类型是字符串。
一个对象应当是显示对象还是控制对象必须弄清楚,否则无法正确连线。
有时他们的图标是相似或相同的,可以根据需要明确规定它是显示对象还是控制对象。
方法是将鼠标移到图标上,然后点右键,可出现快速菜单。
如果菜单中有Chang to Control,说明这是一个显示对象,可以根据需要,将其变为控制对象。
如果菜单中有Chang to Indicator ,说明这是一个控制对象,也可以根据需要,将其变为显示对象。
在默认情况下,对于每个连接到For循环的数组都会执行自动索引功能。
在默认情况下,对于每个连接到While循环的数组都不会执行自动索引功能。
可以禁止/启用这个功能的执行,方法是用鼠标右键单击通道(数组进/出循环的位置),在快捷菜单中选择Disable/Enable Indexing。
▪While循环:▪计数从0开始(i=0)。
▪先执行循环体,而后i+1,如果循环只执行一次,那么循环输出值i=0。
循环至少要运行一次。
移位寄存器在流程图上用在循环边框上相应的一对端子来表示。
右边的端子中存储了一个周期完成后的数据,这些数据在这个周期完成之后将被转移到左边的端子,赋给下一个周期。
移位寄存器可以转移各种类型的数据--数值、布尔数、数组、字符串等等。
它会自动适应与它连接的第一个对象的数据类型。
For循环用于将某段程序执行指定次数。