5.5 来自第三方的LabVIEW设计模式——面向组件的设计
- 格式:doc
- 大小:1.05 MB
- 文档页数:20
使用LabVIEW进行虚拟仪器设计和模拟虚拟仪器设计和模拟是一项重要的技术,能够帮助工程师和科学家们开发和测试各种设备和系统。
LabVIEW是一种功能强大的虚拟仪器平台,广泛应用于各个领域。
本文将介绍如何使用LabVIEW进行虚拟仪器设计和模拟。
一、LabVIEW简介LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是由美国国家仪器公司(National Instruments)开发的一种图形化编程环境,专门用于虚拟仪器设计和模拟。
LabVIEW以图形化的方式呈现代码,使用户可以通过拖拽和连接图标来进行程序设计,而无需编写传统的文本代码。
二、LabVIEW的优势1. 图形化编程界面:LabVIEW使用图形化的编程语言G语言,使用户能够直观地设计系统。
2. 可视化开发环境:LabVIEW提供丰富的工具箱和控件,使用户可以快速建立所需的虚拟仪器界面。
3. 支持多种硬件接口:LabVIEW可以与各种仪器、传感器和设备进行连接,实现数据的采集和控制。
4. 高度可扩展:LabVIEW通过模块化的方式,用户可以轻松添加新的功能和模块,满足不同应用的需求。
三、LabVIEW在虚拟仪器设计中的应用1. 信号采集和处理:LabVIEW可以通过各种数据采集卡和传感器,实时采集和处理信号数据。
用户可以通过图形化的界面配置采集参数,并进行实时的数据分析和处理。
2. 控制系统设计:LabVIEW提供丰富的控制算法和控制器模块,可以帮助用户设计和实现各种控制系统。
用户可以通过图形化界面配置控制参数,并实时监测系统的运行状态。
3. 通信系统仿真:LabVIEW可以模拟各种通信信号的产生、传输和接收过程,帮助用户分析和设计通信系统。
用户可以通过图形化界面配置信道参数、调制解调器和误码率等参数,实现通信系统的仿真和验证。
4. 仪器仪表控制和测试:LabVIEW可以与各种仪器和设备进行连接,并实现对其的控制和测试。
精讲LabVIEW设计模式培训概述LabVIEW是一种图形化编程语言,用于数据采集、控制、仪器仪表通信、图像处理等领域。
设计模式是一种经过验证的最佳实践方法,用于解决特定问题。
本文将精讲LabVIEW设计模式培训,帮助读者了解LabVIEW设计模式的基本概念和应用。
设计模式的概念设计模式是在软件工程中,根据问题的特点和需求的约束,提供一套解决方案的模式。
它可以提高代码的可读性、可维护性和可扩展性。
设计模式分为三大类:创建型模式、结构型模式和行为型模式。
在LabVIEW中,常用的设计模式包括状态机模式、发布-订阅模式、命令模式等。
状态机模式状态机模式是一种通过定义对象的状态来解决特定问题的设计模式。
在LabVIEW中,状态机模式常被用于处理事件驱动的程序。
它通过不同的状态和状态之间的转换来实现特定功能。
例如,一个简单的状态机模式可以用于控制流程的顺序执行,通过定义不同的状态和状态之间的转换条件,实现不同的程序逻辑。
发布-订阅模式发布-订阅模式是一种实现对象间松耦合的设计模式。
在LabVIEW中,发布-订阅模式被广泛应用于多任务编程和消息传递。
它通过将消息的发布和订阅分离,实现不同模块之间的通信。
例如,一个发布-订阅模式可以用于实现观察者模式,让观察者模块监听某个对象的状态变化。
命令模式命令模式是一种将请求封装为对象,以此来参数化客户端的设计模式。
在LabVIEW中,命令模式常被用于实现撤销和重做功能。
它通过将动作封装成命令对象,实现对动作的参数化和执行。
例如,一个命令模式可以用于实现对仪器的控制,每个命令对象代表一个具体的操作,可以被撤销和重做。
实例讲解下面,我们将通过一个简单的实例来讲解LabVIEW设计模式的应用。
假设我们需要编写一个程序来控制一个自动化实验装置,包括采集数据、处理数据和输出结果。
我们可以使用状态机模式来实现流程的顺序控制,使用发布-订阅模式来实现模块间的通信,使用命令模式来实现对仪器的操作。
labview架构设计思路实例LabVIEW是一种图形化编程语言,用于控制和测量系统。
在进行LabVIEW架构设计时,需要考虑以下几个方面:1. 模块化设计,模块化设计是LabVIEW架构设计的关键。
将系统分解为不同的模块,每个模块负责特定的功能。
例如,可以将数据采集、数据处理、用户界面等功能模块化设计,以便于维护和扩展。
2. 合理的数据流,在LabVIEW中,数据流是非常重要的。
设计时需要考虑数据的流向和处理方式,确保数据能够在不同模块之间流通,并且能够正确地被处理和显示。
3. 使用适当的设计模式,LabVIEW中可以使用一些常见的设计模式,例如状态机、观察者模式等。
这些设计模式可以帮助提高系统的可扩展性和灵活性。
4. 考虑性能和实时性,如果系统需要实时性能,需要特别关注数据处理的速度和系统的响应时间。
可以使用并行计算、硬件加速等技术来提高系统的性能。
5. 考虑可扩展性和可维护性,在设计LabVIEW架构时,需要考虑系统的可扩展性和可维护性。
合理的模块化设计和良好的代码结构可以帮助提高系统的可扩展性和可维护性。
举例来说,假设我们要设计一个数据采集和显示系统。
我们可以将系统分解为数据采集模块、数据处理模块和用户界面模块。
数据采集模块负责从传感器或设备中采集数据,数据处理模块负责对采集到的数据进行处理,用户界面模块负责将处理后的数据显示给用户。
我们可以使用状态机设计模式来管理数据采集的状态,使用观察者模式来更新用户界面。
同时,我们需要考虑数据的流向和处理方式,确保数据能够正确地在不同模块之间流通和处理。
总之,LabVIEW架构设计需要考虑模块化设计、合理的数据流、适当的设计模式、性能和实时性、可扩展性和可维护性等方面,以确保系统具有良好的可扩展性、可维护性和性能。
LabVIEW中的面向对象编程技术在LabVIEW中的面向对象编程技术LabVIEW是一种基于图形化编程的工程软件。
它以图形化的方法创建程序,主要用于测试、测量和控制应用。
除了其强大的数据采集和处理能力外,LabVIEW还提供了面向对象编程(Object-Oriented Programming,简称OOP)技术,使得开发人员能够更加高效和灵活地设计和实现复杂的应用。
本文将介绍LabVIEW中的面向对象编程技术及其应用。
一、面向对象编程技术简介面向对象编程是一种软件开发方法,它以对象为基本单位,通过封装、继承和多态等特性,将程序的数据和对数据的操作进行有机的结合,使得程序的设计更加模块化、可复用和易于维护。
在LabVIEW中,面向对象编程技术被应用于虚拟仪器对象(Virtual Instrument Object,简称VI)的设计和开发。
VI是LabVIEW 程序的基本单位,通过面向对象的思想,可以将VI的功能、数据和界面封装成一个独立的对象,从而实现对其进行灵活的组合和重用。
二、LabVIEW中的面向对象编程1. 类和对象在LabVIEW中,类是面向对象编程的基本概念。
类定义了对象的属性和方法。
对象是类的实例,每个对象都有自己的属性值和方法。
2. 封装封装是面向对象编程的核心思想之一,它可以隐藏对象的实现细节,使得对象的使用者只需关注对象的接口。
在LabVIEW中,封装可以通过访问控制功能来实现。
例如,可以将某些属性设置为只读或只写,以限制对属性的访问权限。
此外,还可以使用属性节点来对属性进行封装,只允许通过特定方法对属性进行访问。
3. 继承继承是面向对象编程的另一个核心概念,它可以通过扩展已有的类来创建新的类,从而实现代码的重用和扩展。
在LabVIEW中,可以通过创建派生类来实现继承。
派生类继承了基类的属性和方法,并可以在此基础上进行扩展和修改。
通过继承,可以实现对现有功能的改进和功能的复用。
LabVIEW 程序设计步骤下面通过一个设计实例来详细介绍虚拟仪器软件LabVIEW 的程序设计步骤。
设计目标:假设有一台仪器,需要调整其输入电压,当调整电压超过某一设定电压值时,需通过指示灯颜色变化发出警告。
1 建立新VI启动LabVIEW 程序,单击VI 按钮,建立一个新VI 程序.这时将同时打开LabVIEW 的前面板和后面板(框图程序面板)。
在前面板中显示控件选板,在后面板中显示函数选板。
在两个面板中都显示工具选板。
如果选板没有被显示出来,可以通过菜单查看(View )/工具选板(Tools Palette)来显示工具选板,通过查看(View)/控件选板(Controls Palette )显示控件选板,通过查看(View )/函数选板(Functions Palette)显示函数选板。
也可以在前面板的空白处,单击鼠标右键,以弹出控件选板.2 前面板设计输入控制和输出显示可以从控件选板的各个子选板中选取。
本例中,程序前面板中应有1个调压旋钮,1个仪表,1个指示灯,1个关闭按钮共4个控件。
1)往前面板添加1个旋钮控件:控件(Controls )→ 新式(Modern ) → 数值(Numeric ) → 旋钮(Knob),如图2—14所示,标签改为“调压旋钮";2)往前面板添加1个仪表控件:控件(Controls)→ 新式(Modern) → 数值(Numeric ) → 仪表(Meter ),如图2-14所示,标签改为“电压表”.3)往前面板添加1个指示灯控件:控件(Controls)→ 新式(Modern )→ 布尔(Boolean ) → 圆形指示灯(Round LED ),如图2-15所示,将标签改为“上限灯".4)往前面板添加1个停止按钮控件:控件(Controls )→ 新式(Modern)→ 布尔(Boolean) 图2-15 添加指示灯、按钮控件图2-14 添加旋钮、仪表控件→停止按钮(Stop Button),如图2-15所示,将标签改为“关闭”。
Labview程序设计模式LabVIEW程序设计模式,这个相对学术化的词语是对一系列用于LabVIEW程序设计结构的归纳和总结。
在建造房子时,需要针对房子的用途设计整个房屋的架构,确保房子在这个架构上的坚固性和可建造性。
写程序时同样如此,不同的应用需要使用不同的程序设计结构。
例如我们在LabVIEW中构建一个用户界面型程序时,往往首先在背面板中加入一个大的while循环以使程序持续运行。
如果需要响应用户界面事件则还需要加入一个Event事件结构。
那么我们是否曾经考虑过以下的这些问题:(1) 应用中是否存在并行响应的情况?如在持续的数据采集过程中,是否需要同时响应单击菜单的事件?(2) 底层获取的数据如何与上层的数据显示部分进行数据交互?(3) 上层的界面如何受底层程序的控制?(4) 同一个循环中采用哪种方式进行数据交换?是局域变量、全局变量、共享变量还是移位寄存器?(5) 程序是否具有可扩展性?(6) 如果程序运行过程中,发生系统错误或者硬件通讯错误,是否会停止运行?待错误排除后是否会继续运行?(7) 如何组织程序中的核心数据结构?是否需要采用面向对象程序设计?(8) 如何记录测试数据并生成报表?如何保存用户配置参数?(9) 如何处理程序运行中的断电情况?重新启动时的继续运行?数据的最低丢失?(10) 如何实现运行过程的采样触发和多点采样的同步?当然,也许只是使用LabVIEW临时地调试或开发某个小的应用,无需考虑上述的问题。
但是,如果使用LabVIEW开发一个典型应用的程序却无法回避这些问题。
因此,有必要对各种程序开发的应用进行归纳和总结,提取它们对应的LabVIEW程序结构中的共性。
此外,针对这些共性研究哪种结构更加适合于应用。
这些结论综合起来就形成了程序设计的模式。
对于初学者而言,理解和掌握程序设计模式往往能起到事半功倍的效果;而对高级用户而言,归纳各种程序设计模式又能够不断完善程序中遇到的问题,并衍生一套符合特定应用的特有的程序设计模式。
5.5 来自第三方地LabVIEW设计模式——面向组件地设计(LCOD)[上](LabVIEW design patterns from a third party - a component oriented design (LCOD))版本 5创建于: 2011-2-8 下午8:34 作者jwdz - 最后修改: 2011-2-18 上午7:01 作者jwdz面向组件地设计模式——LCOD(LabVIEW Component Oriented Design)来自于Jon Conway,Steve Watts所著地《A Software Engineering Approach to LabVIEW》一书(原版2003).该书地译者:罗宵、周毅等,中文版书名为:《软件工程方法在LabVIEW中地应用》(中译本2006年) .笔者相信许多LabVIEW开好者和开发者都不止一次地、认真地读过此书.但是,从直接地信息反馈来看(主要来自网评),大家对此书地内容褒贬不一.甚至有读者认为此书苦涩难懂、不易理解.这本书地确不易读懂,笔者也曾不止一次地读过此书,尽管某些地方到现在还无法认识和真正地理解,但是每次认真读后都会有些体会.笔者认为:本书从软件工程地角度,提出了LabVIEW面向组件地设计模式.尽管面向组件地设计模式在LabVIEW地设计中尚未成为主流(或者根本就不会成为主流地设计方法),但是它地设计思想和原则会给我们提供很好地设计借鉴.5.5.1 软件工程中好地软件——松耦合、强内聚、信息隐藏和封装与基于文本地编程语言相比LabVIEW图形化语言似乎天生就具备了好软件地要求,因为图形化代码本身就具备——松耦合、强内聚、信息隐藏、抽象地特点,应该讲这些特点绝对是毋庸置疑地.尽管如此,在图形化设计中,我们还是会遇到这样或那样地问题.比如:程序代码地重用问题;代码维护地问题、程序运行是否安全可靠等等问题.这些问题不是图形化语言特有地,而是所有语言都面临地问题,也就是软件工程所要求地.如果在设计之初我们就按照软件工程地要求安排和思考设计方案,我们就会将问题降到最少、将问题地影响降到最低.5.5.1.1 图形化代码地松耦合、强内聚松耦合软件设计中地耦合指——程序模块间无关程度地度量.如果两个模块间很少交互,那么我们称之为松散耦合.如果两个模块间交互程度很高,则称之为紧密耦合.众所周知,图形化代码是基于数据流运行机制地,所以VI间地耦合(数据流动)是不可可少、必然存在地.但是,从耦合地角度来看,人们自然非常希望每个VI地输入、输出连线应最少,并且应该将数据处理过程尽可能地包含在VI中,输出仅仅包含最终地有效数据.书中提供了一个松耦合测量系统地示例.参见下图.图5.5.1.1-1 松耦合示例(中译本-图3.7)上图所示地测量系统可以完成某测试系统中地所有测量功能.你所要做地就是告诉它要测量什么,在输出端就会得到相应地数据结果(这是一个组件).在LabVIEW中,最能体现松耦合地实例就是多功能信号发生器.如果已经确定其它参数不会发生改变,通过枚举常量就可以任意选择输出信号类型:Sine Wave、Triangle Wave、Square Wave、Sawtooth Wave.参见下图.图5.5.1.1-2 松耦合地多功能信号发生器松耦合能够确保整个图形化程序清晰、可读,并且易于理解设计者地目地和用途.应该是每个图形化程序设计者所追求地终极目标.但是,在实际应用开发中我们仍然会遇到这样或那样地问题.比如:虚拟仪器本身要求有良好地、交互式地人机对话用户界面.这样就不可避免地使得数据在人机对话界面和程序框图中传递,从而导致了VI间复杂地数据耦合关系存在.如何减少VI间复杂地数据耦合关系,簇应该是一个很好地选择.因为簇中可以包含众多地同指向地、不同数据类型地控件.面向组件地设计可以满足上面地一些要求,也是作者所一再强调采用面向组件设计地原因之一.下面我们在来看看软件中地内聚.强内聚软件设计中地内聚指——软件模块中各组成部分地相关程度强弱地度量.相关程度越强越好.对于强内聚地理解,作者给出了一个针对内聚而言比较有说服力地测试系统示例.整个测试系统是由一台示波器和一台信号发生组成,并通过GPIB控制和管理示波器和信号发生器以及整个测试系统.测试工作为30次独立地测试任务,为此创建了30个测试VI(Test1.vi-Test30.vi). 其中每个测试任务中都包含了对示波器和信号发生器地调用.显然,这种方式地内聚性不好.比如:要变更某个测试频率,那就要对每个测试VI都进行修改,这对系统维护和升级相当不利.最有效地解决地方案是改进内聚,也就是说:创建示波器VI、信号发生器VI和测试系统VI.示波器VI——负责GPIB对示波器地读、写信号发生器VI——负责GPIB对信号发生器地读、写测试系统VI——负责整个30个测试任务中对示波器VI和信号发生器VI地控制和管理在这样地结构下,变更测试频率只需变更示波器VI、信号发生器VI中地某些参数即可(不必对每个测试VI进行更改).这个例子告诉我们:选择合理地设计方案和结构可以使得系统维护和升级相当简便,这种设计思维方式是值得我们学习和掌握地.本书在强内聚方面提供地另一个例子是使用ActiveX创建一个VI来控制Word 97所需地全部功能.下面看看该组件.图5.5.1.1-3 Word Control.vi(组件)实现用ActiveX控件实现对Word 97地控制它实现地控制功能多达6种,其中包括:打开Word、关闭Word、插入文本、保存文档、转到书签、粘贴等.参见下图.图5.5.1.1-4 丰富地控制功能(Word97)这是一个展示强内聚很好地组件.该组件也具有实际意义,在没有《报告生成工具包》地情况下,它是一个很好地Word文档处理组件.可惜地是处理地Word版本太低.该程序代码可以下载(LabVIEW——北方客栈-下载中心).实际上在LabVIEW中,许多多态VI都具备了强内聚地基本特性,读者可以自己细心去慢慢品味,这里就不再一一列举了.5.5.1.2 图形化代码地信息隐藏和封装图形化代码地模块化组织结构已经确保了信息隐藏和封装已经作地很好了,这里所指地信息隐藏和封装是相对于软件工程中地要求和实际应用时需要注意地问题.信息隐藏软件设计中地信息隐藏——常用于将复杂地东西隐藏在简单地界面下.下面我们给出一个实际应用中地例子.例:5.5.1.2-1 用USB-6211地I/O数据线控制继电器组在某应用项目中,我们需要使用USB-6211地I/O数据线控制一个继电器组(仅在初始化时发送一组数字编码),提供给4个不同地测试程序分别使用.数字I/O地数据输出使用4条数据输出线控制外部硬件译码器地4个输入端,译码器地输出端驱动继电器.我们使用了DAQ助手来实现这个DIO.vi地设计,其中确定使用地物理通道和控制地逻辑关系如下:数字输出顺序使用地物理通道数字输出_0 USB-6211/port1/line0数字输出_1 USB-6211/port1/line1数字输出_2 USB-6211/port1/line2数字输出_3 USB-6211/port1/line3所代表地逻辑关系及物理意义如下:0000——电压1V0001——电压5V0100——电流1A0101——电流5A图5.5.1.2-1 DIO.vi程序框图图5.5.1.2-2 DIO.vi前面版图这个DIO.vi地设计就是依据信息隐藏地设计思想方法实现地.我们可以在整个项目中地4个测试程序地初始化中使用它(不会同时运行).仅依靠修改命令参数就可以实现不同地继电器驱动.参见下图.图5.5.1.2-3 初始化数字I/O同时如果发生设计上地变更,仅仅修改命令和Case结构中地程序代码就可以了.这里需要说明地是由于仅在测试程序初始化时运行该VI,所以我们为了简便设计使用了DAQ 助手来设计实现.封装软件设计中地封装——对构成抽象概念地结构和行为地基本元素进行划分地过程;封装用于分离抽象概念及其实现之间地接口.LabVIEW中地封装更多地用于子VI地设计和实现.OpenG和MGI地VI就是利用封装实现不同地函数(方法)处理.封装是使图形化代码模块化地重要手法之一.根据任务地要求能够抽象出最基本结构和处理方法进行重新封装近而达到实现模块化设计和设计重用地目地.同时也标志着你地设计能力和水平在不断地提高.下面我们看一个实际应用实例.例:5.5.1.2-2 用谐波分析.vi实现信号基波提取(“理想”滤波器)在振动测试中,加速度测量一般是通过加速度传感器来提取加速度信号.这里就面临着一个问题:加速度地测量结构通常是用峰_峰值来表示地,可是我们所获得地加速度信号中往往包含很多高次分量(谐波分量),用这样地信号来表征加速度值往往是不正确地.因为包含谐波分量地信号峰_峰值与纯正弦信号地峰_峰值是不一样地.这样就需要对含有谐波分量地加速度信号进行滤波,以期获得纯正地正弦信号来计算峰_峰值.设计一个滤波器当然也可以,但是能否有更简单、实用地方法呢?回答是可以地,我们利用对谐波分析.vi地重新封装实现加速度信号地基波提取,同样达到了滤波地效果(我们称之为:理想滤波器).将这个VI命名为:数字滤波器.vi.设计思路是对LabVIEW内置VI——Harmonic Distortion Analyer.vi进行设置后重新封装而实现.参见下图.图5.5.1.2-4 数字滤波器前面版图图5.5.1.2-5 数字滤波器程序框图上图中地Case结构“假”为:Input signal(不进行滤波).使用这个VI即完成频率和谐波失真地测量又能够提取基波信号(通过“滤波器加入”开关控制)相当有实用价值(输入信号必须是周期信号).当然,实现这个功能前提是必须对Harmonic Distortion Analyer.vi 有足够地深入了解.对于多通道输入信号稍加改动同样可以实现.它地演示说明和下载地址:/content/docs/DOC-12964实际上,工程项目应用中我们需要许多自己定义封装后地VI.下面在来看一个实际应用中地例子. 例:5.5.1.2-3 用谐波分析.vi实现谐波分量地显示我们都使用过Harmonic Distortion Analyer.vi,一般用它来测量THD.可是有时候我们不仅需要知道THD地大小(数值),我们更想知道它地分布情况或者说THD中各次谐波所占有地比例关系.比如说:已知某信号地谐波失真THD为:10%,但是无法确定其中地2次谐波是多少?三次谐波又是多少?…….这就需要我们创建一个新地VI来做谐波分量地分析.我们地基本目地是分析信号中各次谐波(20次以内)各占多少?并希望以图形和数值地方式显示出来.其实笔者也不具备这种精细地设计能力,也是从其它例程分析、摘得获得地.对于大多数开好者而言,这是一种很好地学习方式.现在我们命名这个VI为:Display_THD.vi.并给出它地前面版图和程序框图.参见下面地图示.图5.5.1.2-6 Display_THD.vi前面版图图5.5.1.2-7 Display_THD.vi程序框图该VI地设计方法以及各部分地功能就不谈了,读者可下载看看.相关地介绍参见下面地连接:/content/docs/DOC-14221.为了演示这个VI地运行分析结果,我们特编制了一个演示VI(THD_3.vi),参见下面地图示.图5.5.1.2-8 THD_3.vi前面版图5.5.1.2-9 THD_3.vi程序框图在上面地演示程序中,我们使用了一个三角波发生器代表含有谐波地信号,因为三角波地THD值是已知地(12.11%).通过分析我们知道:三角波仅含有奇次谐波,其中三次谐波分量最大,同时它地谐波分布比较广泛(我们仅分析到20次谐波).利用软件工程地一些概念和原则指导我们进行图形化代码设计,可以使得应用程序变得更加健壮、容易移植、重用性更强.所以说本书中地内容具有很好地指导作用.5.5.2 LabVIEW面向组件地设计(LCOD)作者在书中谈到:在LabVIEW图形化设计方法中,面向组件地设计应该是最佳地设计方法.我们认为设计组件地基本目地是图形化代码地模块化,当然组件还有其它地好处, 下面会慢慢谈到.所以笔者也认同:组件是模块化设计地最好方法之一.为了能够更清楚地理解面向组件地设计思想和设计方法,我们下面要探讨什么是组件?组件地基本功能?组件应该如何设计、实现?5.5.2.1 组件地一些基本要求软件中地组件应该能够满足下面地最基本要求:组件地基本要求组件必须对所有要提供地服务提供明确地说明组件和其它组件交互地唯一途径就是预先定义好地接口.组件地所有数据和进程都必须封装在接口背后. 组件应当足够独立,以便能够单独测试.组件或者使用组件地软件都必须只依赖与预先定义地接口和指定地操作.具体到LabVIEW图形化编程语言,对组件地定义是:组件由VI构成.构成组件地VI通过简单地接口提供多种服务.组件应具备强内聚(VI地层次结构)、信息隐藏(子VI功能隐藏)和松耦合(简单地接口).我们设计图形化组件地最主要目地就是:模块化可在其它项目中可重复使用维护简单升级和更改方便可靠性高自行完成初始化自行完成错误处理能够在本地永久地保存其状态组件地最终模式参见下图.图5.5.2.1-1 组件组件满足了软件设计中地松耦合、强内聚地基本原则.本着这样地基本原则,我们就可以设计自己应用项目中地组件.品尝组件为我们带来地好处.5.5.2.2 如何设计组件?事实上,如果仅仅需要使用LabVIEW做些简单地试验和设计,完全不需要考虑设计什么组件.但是,如果为了更好地适应项目地需求,保证项目地内容更加容易修改,当然未来也许还会被重用.所以还是建议考虑使用设计组件地方法,至少应该采用模块化地设计方法.那么如何设计组件呢?程序中地那些部分应该使用组件来设计呢?这地确是一个很头疼地问题,因为大多数地LabVIEW爱好者并不熟悉如何解决这类地问题.他们更看重地是项目应用地结果或者说能否实现项目地设计.其实,我们在软件设计中有一个解决复杂问题地法宝——就是抽象处理.抽象在解决复杂问题时地一种思维方式.对于复杂问题最好地处理方法是将其抽象处理,也就是将复杂问题简单化,然后寻求最佳地处理方案或处理方法.比如说:在一个测试项目中,我们根本不知道那些程序应该放置到图5.5.2.1-1 所示地组件黑盒子中.也就说,黑盒子中应该包含那些程序代码是不清晰地.解决这个问题地方法就是将项目抽象地分成几个部分或阶段,针对每一个不同阶段采用不同地处理方法.我们来看看作者是如何处理这样地问题.在软件苦旅中,它将Widgetometer Test System划分为几个主要部分来处理:UI Controller-Message Queue(UI控制器——消息队列处理)Section Keyed Data Handling(分组关键字数据处理)Control>Drive>Read(控制》驱动》读取)Error Control(错误处理)作者为上述部分单元都给出了使用组件设计地实例.关于组件设计方法,书中给出了组件地基本设计原则,这些基本原则包括:自定义地枚举常量、状态机架构、移位寄存器、错误处理等等.利用这些基本原则完全可以帮助我们实现组件地设计,这里就不做更多地讨论了.因为在例:5.5.1.2-1 用USB-6211地I/O数据线控制继电器组中我们已经看到组件地设计实例(尽管它很简单).尽管包括我在内地许多读者都看不懂这些实例地真正内涵,是因为我们没有真正理解项目地要求,所以也就自然无法理解、认识如何处理这些问题地方法.比如,我们完全可以使用事件结构来处理GUI消息,而并非一定要采用队列地方式.初学者(包括我)往往陷入这样地状况之中,就是期待直接获得最实用地图形化程序代码来拓展、指导我们地设计.我们说,在一些实用技巧和应用实例中,直接获得实例代码是最快、最有效地程序设计方法.但是,在应对大型项目地设计,我们真地很难获得这样地帮助.应该说,这本书做到了这一点.我们似乎自相矛盾,一会说:此书难懂;一会又强调此书很有帮助.那么到底这本书为我们带来了什么?它为我们带来了LCOD地设计思想.这种设计思想将指导我们实现组件设计或模块化设计.5.5.3 LabVIEW面向组件(LCOD)地设计思想可以说,读此书给我带来地最大收获不是那些实例代码.而是那些实现这些实例代码地设计思想.这应该是最有价值地收获之一.纵观此书,依据软件工程要求提出了以下LCOD地设计思想.5.5.3.1 LCOD设计地黄金法则“代码内抽象,代码外细节”[]“看看自己地VI,每次你看到数字或字符串,它们都会被放在一个文件或数据库中,是地,它们中地每个都如此.”[]解读:在程序代码中消灭一切数字(常量)和字符串(常量),统统将它们隐藏到配置文件或数据库中.取而代之地是枚举命令常量.这样设计地组件才具有灵活性、强壮性和良好地维护性.如何做到这些呢?书中给出了一个例子(原书中地图6.25和图6.26).图5.5.3.1-1 代码细节外露,不好!这是一个测量组件,通过Command 来配置设定某项目中地测量通道(使用地驱动是传统DAQ ),显然图中代码地细节外漏无疑.如果项目中使用地通道发生变化或者测量范围发生变化或者是硬件发生变化时,则必须修改这个VI中地许多参数.如果通道数较多,那就只好慢慢来吧!依据黄金法则,作者设计出了一个更加实用有效地例子.图5.5.3.1-2 代码中地细节隐藏,好!看清楚了吧,原图5.5.3.1-1 代码中地数字常量和字符串常量都不见了,取而代之地是3个Config.vi和一些枚举常量.通过Config.vi 地读将配置文件或数据库中地信息直接读入,这样再修改和变更某些参数,就可以通过修改相应地文件或数据库内容既可以了,无须在直接修改程序代码.现在,依据这样地设计思想就可以实现你地应用项目设计了.很麻烦吗?在项目中这可是一个极为理想地解决方案.本书地最后部分给出了当用户提出新地要求时,变更是如此地简单和方便.当然,如何保存和读取这些信息就引出了分组关键字文件.5.5.3.2 LCOD设计中地分组关键字文件所谓分组关键字文件,也就是通常所说地配置文件( .ini 文件).此书地作者对此进行了一些特殊地设计.比如设置了文件读取、保存时地密码等.最终设计出系统配置管理器组件(Sysrem Config Data Manager).这样那些不准备外露地程序代码终于有地方和有办法读取了.现在好了,用户需要变更硬件或硬件地测量通道,那么修改相关地配置文件中地某些参数就可以了,根本无须改动更多地程序代码.只有新地硬件出现或者说新地命令出现,我们才需要设计更新部分代码(新命令中所涉及到地那部分).应对自如,决不是幻想,而是现实.图5.5.3.1-3 Widgetometer Config ini文件举一个例子,我们设计完成了一套振动测试系统.当时设计地硬件选择地是:NI USB 9233.此后NI又陆续推出了:NI USB 9234、NI USB 4431、NI USB 4432.这些硬件都可以使用在我们所设计地振动测试系统中,如果有用户需要选择这些硬件,我们必须认真、仔细地一个一个地修改原来振动测试系统软件中地一些VI.当真正地理解了组件地设计思想我们还会那样做吗?这部分地其它关键内容还是希望大家自己去看看,这对于理解组件和设计使用组件会有很大地帮助. 5.5.4 LabVIEW面向组件地设计带给我们什么?有朋友会问到:LabVIEW面向组件地设计带给我们什么?笔者认为:它带给我们地是一种设计思想.这种设计思想不仅可以指导我们实现面向组件地设计.同时,还可以用来指导我们进行模块化设计.我们认为:模块化设计比组件设计低一个层次.这样说教可能很难令人真正理解和信服,下面我们还是通过一个最简单地模块化设计例子来看看二者之间地细微差别.例:5.5.4-1 Top Level VI我们知道,每个项目中都有一个Top Level VI.所以当我们做一个新项目时,就会设计一个新地Top Level VI.开始做项目时,我们还故弄玄虚把界面作地很花哨,时间长了,做多了就会感到这样地做法很烦.于是慢慢就想到使用模块化地方法来设计这样地VI.首先,我们将必要地信息保留下来,将花哨不实地东西删掉.经过模块化设计地Top Level VI可以很方便地应用于其它项目,而自身地改动不是很大.下面我们先来看看这个Top Level VI地前面版运行图.图5.5.4-1 Top Level VI 地前面版运行图在这个图示中,图片仅用来修饰界面,其它所有信息(文字)都可以通过设定字符串常数或属性来修改,包括字体、颜色、字号等等.下面是该VI地程序框图.图5.5.4-2 Top Level VI 地程序框图在其它项目中应用时,只要更换图片以及所有地字符串显示信息等即可,这样地模块化地设计方法使我们分分钟就可以搞定一个新项目地Top VI.从实用地角度我们还是将它按项目地组织结构做了一个类似应用程序架构地演示程序供感兴趣地朋友下载.它地设计方法前面地内容中都已经介绍过,因篇幅地关系这里就不再多说了.下载文件:App Project.zip有地朋友可能还会问到:既然面向组件地设计方法这么好,似乎仅有这本书可以作为学习参考.笔者认为:LCOD地确是非常好地设计方法.至于是否能够得到广泛地认可,主要看使用者所面对地需求.如果你一直侧重于某个领域地应用,最好渐渐地采用面向组件地设计方法.坦率地讲,开始我对组件地认识是这样地:我认为组件很复杂,它相当于一个多功能地VI集合.在使用组件时,往往使用其多功能中地某一个功能,所以它是很浪费内存地.比如下图中(原书图5.12),如果该Basic 组件包含10个Command.假设,我们地程序中需要使用到这10个命令,将需要重复放置10个VI.每个VI 我们只使用它地十分之一,那么有效代码使用率为百分之一.显然是很浪费内存地.图5.5.4-3 组件地应用方式如果你注意到LabVIEW2010地新特性,优化编译器(4.3.1节曾简要说明过)地特性,就可以看到这已经不是问题了.对于模块化设计我们还想再说两句,如果仔细分析DAQ助手或Express VI它们类似于模块化设计地方法,因为使用这些模块已经帮助我们大大减少了程序代码地设计量.。
Labview简易程序设计Labview简易程序设计概述Labview(Laboratory Virtual Instrument Engineering Workbench)是一种用于虚拟仪器设计和控制系统的开发环境和语言。
它的特点是图形化的编程方式,使得用户无需编写繁琐的代码,就能够完成复杂的测量和控制任务。
本文将介绍Labview的简易程序设计方法。
Labview程序结构Labview程序由多个虚拟仪器(VI)组成,每个VI由输入、处理和输出三个核心部分组成。
输入部分负责从外部设备或传感器中获取数据,处理部分对输入数据进行计算和逻辑处理,输出部分将处理结果发送给外部设备或在界面中显示。
Labview程序的整体架构通常是基于数据流图(Block Diagram)的,其中各个VI之间通过数据流连接进行数据传递。
数据流连接将结果从一个VI的输出端传递到另一个VI的输入端,从而实现整个程序的协同工作。
Labview程序设计步骤1. 创建新的Labview程序打开Labview软件,“新建”按钮创建一个新的项目。
选择适当的模板或空项目来开始新的程序设计。
2. 添加VI在新建的项目中,右键“当前程序”文件夹,选择“新建”->“虚拟仪器”。
给新建的VI命名,并双击打开它。
3. 添加输入在VI的数据流图上,选择需要的输入控件或函数。
例如,可以添加一个“数字输入框”来接受用户输入的数值,或者添加一个“传感器读取”函数来获取外部设备的数据。
4. 添加处理在VI的数据流图上,选择需要的处理函数或操作。
例如,可以添加一个“加法”函数来对输入的两个数值进行求和,或者添加一个“循环结构”来进行重复计算。
5. 添加输出在VI的数据流图上,选择需要的输出控件或函数。
例如,可以添加一个“数字显示”控件来显示处理结果的数值,或者添加一个“数据保存”函数来将结果保存到文件中。
6. 连接数据流将输入、处理和输出部分通过数据流连接连起来,确保数据能够流动并得到正确的处理。
LabVIEW 面向对象程序设计的简介LabVIEW 的数据流驱动模式,与面向过程的编程思想有些类似。
它们都是把程序看成是一组过程或功能的集合,LabVIEW 利用数据流控制这些功能执行的顺序。
由于开发者可以随意的修改、调用这些功能模块,在程序开发的后段,模块之间的划分会变得模糊,依赖关系也变得无序。
这种方式就不再适合大型程序的开发。
面向对象的编程思想是专为解决这个问题提出来的。
面向对象的编程思想大大提高了编程时的灵活性和可维护性。
现在的大型程序中几乎没有不基于面向对象编程思想的。
LabVIEW 为了适应这一趋势,也从8.2 版本开始引入了面向对象程序设计的思想。
面向对象有三大特征:封装、继承和多态。
封装是把高度相关的一组数据和方法组织在一起,形成一个相对独立的类。
外部程序只能通过严格定义好的接口访问类所允许公开的数据和方法;而对于不需与外部发生联系的数据和方法,类会把他们隐藏和保护起来。
这样就避免了编程过程中,函数模块常常被到处滥用以至于难以维护的弊病。
(假如,我们的程序是模拟多只小狗的日常生活的。
在设计程序时,就可以把他们抽象归为“狗”类。
这个类包括了一些属性,如年龄、皮毛颜色、名字等等;还可以包含一些方法,即狗的行为,比如进食、移动、叫等。
)初一看LabVIEW 中的Class 就会发现它很像Cluster,或许它就是在Cluster 基础上发展来的。
C++ 中的Class 也是在Struct 的基础上发展来的,而且,在C++ 中,除了函数默认的权限不同,Class 和Struct 是等效的。
在LabVIEW 中,二者还是截然分开的,Cluster 中只有数据,Class 中除了数据,还可以有方法。
C++ 类中的成员变量可以是私有,也可以是共有;为了安全起见,LabVIEW 中所有的数据都是私有的,必须通过公有的VI才能访问这些数据。
C++ 的类拥有构造函数和析构函数;LabVIEW 的类没有这两个方法。
LabVIEW编程中的软件架构与模块化设计方法随着科技的不断发展,软件程序的复杂性也日益增加。
为了提高软件的可维护性和可扩展性,软件架构和模块化设计成为了程序开发领域中的重要话题。
在LabVIEW编程中,软件架构和模块化设计同样具有重要意义。
本文将探讨LabVIEW编程中的软件架构与模块化设计方法。
一、软件架构的重要性在软件开发过程中,软件架构是程序的基础,它定义了程序中各个模块之间的关系和交互方式。
一个好的软件架构可以提高程序的可维护性、可扩展性和可重用性,降低开发成本和风险,提高开发效率。
在LabVIEW编程中,软件架构同样起着至关重要的作用。
软件架构能够帮助开发人员实现程序的可重用性。
通过将程序按照功能划分为多个模块,可以使得这些模块能够在不同的程序中复用。
这样一来,开发人员不仅可以减少编写代码的工作量,还能够提升开发效率。
此外,软件架构还能够提高程序的可维护性和可扩展性。
通过将程序划分为多个模块,每个模块负责完成一部分功能,不同模块之间的关系清晰明了。
这样一来,当需要修改或者扩展程序时,只需对特定模块进行修改,不会对其他模块产生影响。
这种模块化的设计方式可以减少开发人员的工作量,同时降低开发风险。
二、LabVIEW中的软件架构在LabVIEW编程中,可以采用面向对象的思想来实现软件架构。
面向对象的编程思想将程序看作是一系列对象的集合,每个对象负责完成特定的功能。
在LabVIEW中,可以将每个模块看作是一个对象,对象之间通过消息传递的方式进行通信和交互。
在LabVIEW中,可以使用VI(Virtual Instrument)进行模块的封装。
VI是LabVIEW的基本运行单位,每个VI都可以看作是一个模块。
通过VI,可以实现不同模块之间的消息传递和数据共享。
为了实现模块的封装和解耦,可以使用Local变量和Global变量进行数据的共享。
Local变量只在当前VI中有效,可以实现模块内部的数据传递;而Global变量可以在整个程序中共享数据,可以实现模块之间的数据传递。
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中,可以通过继承关系来实现代码的重用。
在创建类时,可以选择继承已有的类。
通过继承,子类可以继承父类的属性和方法,并根据需要进行扩展。
Labview简易程序设计Labview简易程序设计LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种基于图形化编程语言G代码的数据采集、仪器控制和工业自动化系统软件平台。
本文介绍了LabVIEW的简易程序设计方法,以帮助读者快速入门LabVIEW开发。
1. LabVIEW简介LabVIEW是由美国国家仪器公司(National Instruments)开发的一种图形化编程语言和环境。
它通过将函数块在一起构成程序流程图,使得开发人员能够用图形化方式表达程序逻辑。
LabVIEW广泛应用于实验室测量与控制、工业自动化、生物医学工程等领域。
2. LabVIEW程序的基本结构LabVIEW程序由前端GUI界面和后台程序逻辑组成。
前端GUI界面包括用户界面控件,用于输入数据和显示结果;后台程序逻辑则是执行实际的计算、数据处理和仪器控制等任务。
2.1 GUI界面设计在LabVIEW中,GUI界面设计采用拖拽式编程,即通过将各种控件从工具栏拖拽到屏幕上并进行配置来构建用户界面。
常用的控件有按钮、文本框、图表等。
2.2 程序逻辑设计LabVIEW中的程序逻辑设计采用数据流方式,即程序的执行是根据数据的可用性自动进行的。
在程序中,各个函数块称为节点,其输入和输出通过连线连接起来。
使用节点和连线可以构成程序的流程图。
3. LabVIEW程序的基本编程元素3.1 节点节点是LabVIEW程序中的基本编程单元,代表了执行特定操作的函数或算法。
通过在程序中添加不同类型的节点,并将它们按照适当的顺序连接起来,可以构建出复杂的程序逻辑。
3.2 连线连线用于在节点之间传递数据。
在连接节点时,需要将输出端口和输入端口以连线的方式连接在一起,这样数据才能够在节点之间流动。
3.3 常量常量是指在程序运行过程中数值不变的值。
在LabVIEW中,可以使用常量节点来表示常量值,并将其输出连接到其他节点的输入端口。
使用LabVIEW进行虚拟仪器设计和开发虚拟仪器是一种通过软件模拟实际仪器的工具,它能够进行各种信号的采集、处理和控制。
而LabVIEW作为一种专业的虚拟仪器设计和开发工具,赋予用户以强大的功能和灵活性。
本文将介绍如何使用LabVIEW进行虚拟仪器设计和开发。
一、LabVIEW介绍LabVIEW是National Instruments公司开发的一款虚拟仪器软件,它提供了丰富的图形编程工具和模块化的设计界面。
用户可以通过拖拽和连接各种功能模块,灵活地搭建自己的虚拟仪器。
LabVIEW支持多种编程语言和硬件设备,使得虚拟仪器的开发更加简便和高效。
二、LabVIEW的特点1. 图形化编程:LabVIEW采用图形化的编程方式,用户只需将各个功能模块拖拽到主程序中并连接,无需编写复杂的代码。
这种直观的编程方式使得虚拟仪器的设计更加容易上手。
2. 多种数据处理工具:LabVIEW内置了多种数据处理工具,如滤波、FFT变换、曲线拟合等。
用户可以根据实际需求选择合适的工具进行信号处理,提高数据分析的准确性和效率。
3. 硬件支持广泛:LabVIEW支持多种硬件设备,包括数据采集卡、信号发生器、示波器等。
用户可以通过LabVIEW与硬件设备进行无缝连接,实现虚拟仪器的控制和数据采集。
4. 可视化界面:LabVIEW提供了强大的界面设计工具,用户可以自定义虚拟仪器的外观和交互方式。
这使得虚拟仪器更加友好和易于操作,提高用户的使用体验。
三、LabVIEW的应用1. 测试与测量:LabVIEW可以用于各种测试与测量场景,如电子设备的测试、传感器的校准等。
用户可以通过LabVIEW设计测试程序,并实时监测和记录测试数据,提高测试的效率和准确性。
2. 控制系统:LabVIEW可以用于各种控制系统的设计与开发,如机器人控制、工业自动化等。
用户可以通过LabVIEW编写控制算法,并与硬件设备进行实时通信,实现系统的自动化控制。
LabVIEW设计模式汇总本文归纳了LabVIEW中常用的几种设计模式,介绍了各种设计模式的特点及适用范围,并提供了每种设计模式对应的典型应用实例。
1 标准状态机1.1简介状态机(State Machine)是编程中经典的设计模式之一。
状态机对系统所有可能的状态进行罗列,在每个状态分支中执行该状态的代码,并指明系统要执行的下一个状态。
状态机能清晰和准确地完成与状态密切相关的任务。
1.2结构图1-1为典型的标准状态机结构。
系统包含“Initialize”,“Idle”,“Case1”,“Case2”,“Stop”五个状态;系统可以在“Initialize”中初始化系统参数,在“Idle”中专门做状态选择处理,“Case1”和“Case2”为用户自定义的状态分支,“Stop”状态使系统停止运行。
图1-1 标准状态机结构1.3要点(1)状态枚举常量该枚举常量包含了系统所有可能的状态,每次可以选择一个指定的状态。
(2)带移位寄存器的while循环状态机通过while循环上的移位寄存器传递下一个要执行的状态,每次循环只能执行一个条件分支。
(3)条件结构该条件结构的每个分支对应一个系统的可能的运行状态。
Tips:●可以将枚举常量设计为自定义控件类型。
当系统状态需要修改时,只需要修改一次“自定义控件”即可更新整个程序中所有的枚举常量。
●将枚举常量连接到条件结构的选择器接线端后,右击条件结构边框,选择“为每个值添加分支”,可以轻松地为条件结构实现分支配置。
1.4实例(1)情景:使用温度监控系统监测当前温度,当温度超过高温阈值时发出“高温警报”,当温度低于冷冻阈值时发出“冷冻警报”。
(2)代码:详见附件中的“标准状态机”项目文件。
图1-2 前面板设计图1-3 程序框图设计1.5小结标准状态的应用非常广泛,它的特点是:(1)系统的所有状态和转换条件都是可以提前预期设定的,而不是随机产生的;(2)系统一次只能执行一个状态,不适合做并行任务处理。
Labview简易程序设计
Labview简易程序设计
介绍
准备工作
在开始LabVIEW编程之前,你需要安装LabVIEW软件。
LabVIEW 软件可以从官方网站,并按照安装向导进行安装。
安装完成后,你可以打开LabVIEW软件开始编程。
创建新项目
启动LabVIEW软件后,你可以选择“File”菜单中的“New Project”命令来创建一个新项目。
在新项目中,你可以添加多个程序文件,便于管理和组织代码。
添加控件
LabVIEW中的控件用于构建用户界面,你可以通过拖拽的方式
将控件添加到程序界面中。
常见的控件包括按钮、文本框、滑块等。
连接控件和程序逻辑
LabVIEW中的控件和程序逻辑可以通过拖拽和连线的方式进行
连接。
例如,你可以将一个按钮控件和一个程序逻辑节点相连,使得按钮被时触发程序逻辑。
编写程序逻辑
LabVIEW中的程序逻辑通过数据流图的方式进行编写。
数据流
图是由各种节点组成的,每个节点之间通过连线进行连接。
你可以在节点中实现各种功能,例如数学运算、条件判断、循环等。
运行程序
当程序编写完成后,你可以LabVIEW界面上的运行按钮来运行程序。
程序将按照你设定的逻辑执行,并在界面上显示相应的结果。
你可以通过调试按钮来单步调试程序,逐步查看程序执行过程。
5.2 LabVIEW设计模式——主/从设计模式和生产者/消费者设计模式在上一节中曾经谈到过,NI LabVIEW 中提供了六种最基本的设计模式。
本节首先介绍其中的两种:主/从设计模式与生产者/消费者设计模式(Master/Slave design pattern and Producer/Consumer design pattern)。
这是由于这两种设计模式在结构上极为相似(使用的内置函数不同),所以我们在这里将一起来讨论(基本结构参见图5.2-1、图5.2-2)。
图5.2-1 主/从设计模式图5.2-2 生产者/消费者设计模式5.2.1 主/从设计模式(Master/Slave design pattern)与主/从设计模式的相关内置函数(Notifier_通知)参见下图所示。
图5.2.1-1 主/从设计模式内置函数(通知)关于这些内置函数的定义和使用方法请参考LabVIEW Help文件,这里就不再进行讨论了。
对于绝大多数LabVIEW的学习者来讲,仅仅依据这些主/从操作提供的内置函数(通知),即便是借助于帮助文件也很难理解和设计出正确的应用程序代码或基本架构。
因为这些内置函数的内部程序代码是不对外开放的、不公开的,所以我们也就很难理解的更准确或更全面。
那么如何正确的使用它们呢?通常有两个最简单、最直接的方法可以解决这个问题:一是,查看NI给出的设计模式或例程;二是,查看其它使用者所提供的实用例程。
其实,这里也再次间接的告诉大家,更多查看和理解其它LabVIEW开好者所提供的实用例程是学习LabVIEW的最好方法之一。
通过图5.2-1,就可以初略地领会到NI 基于数据流的图形化代码主/从设计模式的表达形式或架构。
从图5.2-1中,可以看到主/从设计模式的基本构成是:包括了两个While循环(上面为主循环、下面的为从循环)和若干个“通知”内置函数(Notifier)构成。
主循环中的Case 结构用来确定是否向从循环发出通知。
LabVIEW程序设计模式(五)—生产者/消费者模式(5)_生产者/消费者模式扩展结合状态机模式、事件结构和动态调用技术,能够归纳出针对较复杂应用程序的通用设计模式。
对常见的测试测量程序而言,主要由数据采集、数据分析、外围菜单项响应、报表生成、数据显示这五个部分组成。
其中数据采集是相对独立和长时间运行的一个模块,可以与其它的模块同时运行。
因此,在大多数持续采集的程序设计中需要将它单独作为一个模块运行。
与此同时,子程序也需要一条数据通道发送一些反馈命令给主程序。
于是可以构成如图44所示的一个通讯回路。
图44 通讯回路LabVIEW提供了多种主程序与子程序之间的通讯方式,如队列、Reference、事件等。
为了介绍这些方式的具体使用方法,将结合最常用的数据采集实例进行阐述。
【应用7】本例以“计算机组件测试”为应用介绍消费者和生产者循环的具体使用方法和数据交互过程。
例子并不是为了说明计算机组件测试的过程和方法,而是重在强调对该应用而言应该采用什么样的程序设计模式。
因此,例子中使用了多种数据交互方式,这些交互方式的选择并不是唯一的,可以根据实际情况选择合适的数据交互方法。
假设计算机的整个测试过程由CPU、RAM、CDROM、Power….等等数项子测试项组成,程序需要充分考虑可扩展性要求,使得后期增加新的待测组件时对主程序的影响不大或者没有影响。
测试过程应能够实现暂停和提前停止的功能,并且测试过程不受其它界面操作的影响。
根据以上的测试要求,可以把整个测试程序分为两个部分:控制部分和执行部分。
其中前者是用户主界面,用来响应用户界面事件以及控制测试流程的执行;后者是执行程序,用来根据控制命令运行测试流程并且产生测试结果。
系统的结构如图45所示。
图45 “计算机组件测试系统”结构从上图可以看出,该应用与消费者和生产者模式是相符的,不同的是还涉及到消费者(执行部分)向生产者(控制部分)的数据传输。
本例使用的是队列型的生产者和消费者模式,而反向的数据传输使用了“用户自定义事件”和“Reference”方法。
5.5 来自第三方的LabVIEW设计模式——面向组件的设计(LCOD)[上](LabVIEW design patterns from a third party - a component oriented design (LCOD))版本 5创建于: 2011-2-8 下午8:34 作者jwdz - 最后修改: 2011-2-18 上午7:01 作者jwdz面向组件的设计模式——LCOD(LabVIEW Component Oriented Design)来自于Jon Conway,Steve Watts所著的《A Software Engineering Approach to LabVIEW》一书(原版2003)。
该书的译者:罗宵、周毅等,中文版书名为:《软件工程方法在LabVIEW中的应用》(中译本2006年)。
笔者相信许多LabVIEW开好者和开发者都不止一次的、认真的读过此书。
但是,从直接的信息反馈来看(主要来自网评),大家对此书的内容褒贬不一。
甚至有读者认为此书苦涩难懂、不易理解。
这本书的确不易读懂,笔者也曾不止一次的读过此书,尽管某些地方到现在还无法认识和真正的理解,但是每次认真读后都会有些体会。
笔者认为:本书从软件工程的角度,提出了LabVIEW面向组件的设计模式。
尽管面向组件的设计模式在LabVIEW的设计中尚未成为主流(或者根本就不会成为主流的设计方法),但是它的设计思想和原则会给我们提供很好的设计借鉴。
5.5.1 软件工程中好的软件——松耦合、强内聚、信息隐藏和封装与基于文本的编程语言相比LabVIEW图形化语言似乎天生就具备了好软件的要求,因为图形化代码本身就具备——松耦合、强内聚、信息隐藏、抽象的特点,应该讲这些特点绝对是毋庸置疑的。
尽管如此,在图形化设计中,我们还是会遇到这样或那样的问题。
比如:程序代码的重用问题;代码维护的问题、程序运行是否安全可靠等等问题。
这些问题不是图形化语言特有的,而是所有语言都面临的问题,也就是软件工程所要求的。
如果在设计之初我们就按照软件工程的要求安排和思考设计方案,我们就会将问题降到最少、将问题的影响降到最低。
5.5.1.1 图形化代码的松耦合、强内聚松耦合软件设计中的耦合指——程序模块间无关程度的度量。
如果两个模块间很少交互,那么我们称之为松散耦合。
如果两个模块间交互程度很高,则称之为紧密耦合。
众所周知,图形化代码是基于数据流运行机制的,所以VI间的耦合(数据流动)是不可可少、必然存在的。
但是,从耦合的角度来看,人们自然非常希望每个VI的输入、输出连线应最少,并且应该将数据处理过程尽可能的包含在VI中,输出仅仅包含最终的有效数据。
书中提供了一个松耦合测量系统的示例。
参见下图。
图5.5.1.1-1 松耦合示例(中译本-图3.7)上图所示的测量系统可以完成某测试系统中的所有测量功能。
你所要做的就是告诉它要测量什么,在输出端就会得到相应的数据结果(这是一个组件)。
在LabVIEW中,最能体现松耦合的实例就是多功能信号发生器。
如果已经确定其它参数不会发生改变,通过枚举常量就可以任意选择输出信号类型:Sine Wave、Triangle Wave、Square Wave、Sawtooth Wave。
参见下图。
图5.5.1.1-2 松耦合的多功能信号发生器松耦合能够确保整个图形化程序清晰、可读,并且易于理解设计者的目的和用途。
应该是每个图形化程序设计者所追求的终极目标。
但是,在实际应用开发中我们仍然会遇到这样或那样的问题。
比如:虚拟仪器本身要求有良好的、交互式的人机对话用户界面。
这样就不可避免的使得数据在人机对话界面和程序框图中传递,从而导致了VI间复杂的数据耦合关系存在。
如何减少VI间复杂的数据耦合关系,簇应该是一个很好的选择。
因为簇中可以包含众多的同指向的、不同数据类型的控件。
面向组件的设计可以满足上面的一些要求,也是作者所一再强调采用面向组件设计的原因之一。
下面我们在来看看软件中的内聚。
强内聚软件设计中的内聚指——软件模块中各组成部分的相关程度强弱的度量。
相关程度越强越好。
对于强内聚的理解,作者给出了一个针对内聚而言比较有说服力的测试系统示例。
整个测试系统是由一台示波器和一台信号发生组成,并通过GPIB控制和管理示波器和信号发生器以及整个测试系统。
测试工作为30次独立的测试任务,为此创建了30个测试VI(Test1.vi-Test30.vi)。
其中每个测试任务中都包含了对示波器和信号发生器的调用。
显然,这种方式的内聚性不好。
比如:要变更某个测试频率,那就要对每个测试VI都进行修改,这对系统维护和升级相当不利。
最有效的解决的方案是改进内聚,也就是说:创建示波器VI、信号发生器VI和测试系统VI。
示波器VI——负责GPIB对示波器的读、写信号发生器VI——负责GPIB对信号发生器的读、写测试系统VI——负责整个30个测试任务中对示波器VI和信号发生器VI的控制和管理在这样的结构下,变更测试频率只需变更示波器VI、信号发生器VI中的某些参数即可(不必对每个测试VI进行更改)。
这个例子告诉我们:选择合理的设计方案和结构可以使得系统维护和升级相当简便,这种设计思维方式是值得我们学习和掌握的。
本书在强内聚方面提供的另一个例子是使用ActiveX创建一个VI来控制Word 97所需的全部功能。
下面看看该组件。
图5.5.1.1-3 Word Control.vi(组件)实现用ActiveX控件实现对Word 97的控制它实现的控制功能多达6种,其中包括:打开Word、关闭Word、插入文本、保存文档、转到书签、粘贴等。
参见下图。
图5.5.1.1-4 丰富的控制功能(Word97)这是一个展示强内聚很好的组件。
该组件也具有实际意义,在没有《报告生成工具包》的情况下,它是一个很好的Word文档处理组件。
可惜的是处理的Word版本太低。
该程序代码可以下载(LabVIEW——北方客栈-下载中心)。
实际上在LabVIEW中,许多多态VI都具备了强内聚的基本特性,读者可以自己细心去慢慢品味,这里就不再一一列举了。
5.5.1.2 图形化代码的信息隐藏和封装图形化代码的模块化组织结构已经确保了信息隐藏和封装已经作的很好了,这里所指的信息隐藏和封装是相对于软件工程中的要求和实际应用时需要注意的问题。
信息隐藏软件设计中的信息隐藏——常用于将复杂的东西隐藏在简单的界面下。
下面我们给出一个实际应用中的例子。
例:5.5.1.2-1 用USB-6211的I/O数据线控制继电器组在某应用项目中,我们需要使用USB-6211的I/O数据线控制一个继电器组(仅在初始化时发送一组数字编码),提供给4个不同的测试程序分别使用。
数字I/O的数据输出使用4条数据输出线控制外部硬件译码器的4个输入端,译码器的输出端驱动继电器。
我们使用了DAQ助手来实现这个DIO.vi的设计,其中确定使用的物理通道和控制的逻辑关系如下:数字输出顺序使用的物理通道数字输出_0 USB-6211/port1/line0数字输出_1 USB-6211/port1/line1数字输出_2 USB-6211/port1/line2数字输出_3 USB-6211/port1/line3所代表的逻辑关系及物理意义如下:0000——电压1V0001——电压5V0100——电流1A0101——电流5A图5.5.1.2-1 DIO.vi程序框图图5.5.1.2-2 DIO.vi前面版图这个DIO.vi的设计就是依据信息隐藏的设计思想方法实现的。
我们可以在整个项目中的4个测试程序的初始化中使用它(不会同时运行)。
仅依靠修改命令参数就可以实现不同的继电器驱动。
参见下图。
图5.5.1.2-3 初始化数字I/O同时如果发生设计上的变更,仅仅修改命令和Case结构中的程序代码就可以了。
这里需要说明的是由于仅在测试程序初始化时运行该VI,所以我们为了简便设计使用了DAQ 助手来设计实现。
封装软件设计中的封装——对构成抽象概念的结构和行为的基本元素进行划分的过程;封装用于分离抽象概念及其实现之间的接口。
LabVIEW中的封装更多的用于子VI的设计和实现。
OpenG和MGI的VI就是利用封装实现不同的函数(方法)处理。
封装是使图形化代码模块化的重要手法之一。
根据任务的要求能够抽象出最基本结构和处理方法进行重新封装近而达到实现模块化设计和设计重用的目的。
同时也标志着你的设计能力和水平在不断地提高。
下面我们看一个实际应用实例。
例:5.5.1.2-2 用谐波分析.vi实现信号基波提取(“理想”滤波器)在振动测试中,加速度测量一般是通过加速度传感器来提取加速度信号。
这里就面临着一个问题:加速度的测量结构通常是用峰_峰值来表示的,可是我们所获得的加速度信号中往往包含很多高次分量(谐波分量),用这样的信号来表征加速度值往往是不正确的。
因为包含谐波分量的信号峰_峰值与纯正弦信号的峰_峰值是不一样的。
这样就需要对含有谐波分量的加速度信号进行滤波,以期获得纯正的正弦信号来计算峰_峰值。
设计一个滤波器当然也可以,但是能否有更简单、实用的方法呢?回答是可以的,我们利用对谐波分析.vi的重新封装实现加速度信号的基波提取,同样达到了滤波的效果(我们称之为:理想滤波器)。
将这个VI命名为:数字滤波器.vi。
设计思路是对LabVIEW内置VI——Harmonic Distortion Analyer.vi进行设置后重新封装而实现。
参见下图。
图5.5.1.2-4 数字滤波器前面版图图5.5.1.2-5 数字滤波器程序框图上图中的Case结构“假”为:Input signal(不进行滤波)。
使用这个VI即完成频率和谐波失真的测量又能够提取基波信号(通过“滤波器加入”开关控制)相当有实用价值(输入信号必须是周期信号)。
当然,实现这个功能前提是必须对Harmonic Distortion Analyer.vi 有足够的深入了解。
对于多通道输入信号稍加改动同样可以实现。
它的演示说明和下载地址:/content/docs/DOC-12964实际上,工程项目应用中我们需要许多自己定义封装后的VI。
下面在来看一个实际应用中的例子。
例:5.5.1.2-3 用谐波分析.vi实现谐波分量的显示我们都使用过Harmonic Distortion Analyer.vi,一般用它来测量THD。
可是有时候我们不仅需要知道THD的大小(数值),我们更想知道它的分布情况或者说THD中各次谐波所占有的比例关系。
比如说:已知某信号的谐波失真THD为:10%,但是无法确定其中的2次谐波是多少?三次谐波又是多少?…….这就需要我们创建一个新的VI来做谐波分量的分析。