精讲LabVIEW设计模式
LabVIEW程序设计模式-生产者与消费者模式
再次回顾“基本状态机模式”的6个缺点,只剩下第6个缺点无法在上述的“状态机和事件结构的结合模式”中被解决。
(1)任何时刻只能有一个状态在运行这个问题也许有些多余,但是在实际的应用中往往又是最常见的。
大多数比较复杂的应用至少应该有“菜单”和“采集”两个状态,如果数据采集程序在运行时仍然希望系统能够处理菜单的事件,这是在传统的状态机或者事件结构中无法实现的。
因为无论是状态机结构还是事件结构,都是由一个循环组成的,不同的状态是无法同时被响应和处理的。
解决这个问题的方式也比较简单,LabVIEW本身就是一种多线程的程序设计语言,可以再加一个循环或者另外开一个程序独立运行。
但是这样也会带来一些新的问题,比如:(1)两个循环(程序)之间如何交换和共享数据。
(2)两个循环(程序)都有着独立的错误处理系统,它们之间是如何协调的。
(3)两个循环如何分工呢?应该以哪种方式对状态进行分类以将不同的状态放置在不同的循环(程序)中?(4)一个程序如何控制另一个程序的运行和停止。
在上面提出的4个问题中,对循环和程序这两个解决方案而言,第(1)~(3)个问题的解决方式是一样的。
只有第(4)个问题是专门针对两个程序而言的,在LabVIEW中这种不同程序之间的相互调用称为“程序的动态调用”。
在介绍VI的动态调用之前有必要对LabVIEW在执行VI过程中的规则有个大致的了解。
众所周知,LabVIEW是通过VI的文件名(VI Name)来表示独立的VI的,并不是VI的路径。
因此,LabVIEW不允许具有相同名字的VI同时载入内存中,即使这些VI存储在不同的路径中。
在前面曾经提到,LabVIEW本身就是一种多线程设计的语言。
那么当同一背面板中放置两个VI的实例时代码应该如何执行呢?在图29中,右侧是测试VI运行的时间,左侧是Wait.vi的具体实现代码,仅仅是等待一定的秒数。
那么在右侧的VI中,输出的Time是多少呢?是3秒还是2秒?图29 Reentrant Execution打开VI的Highlight调试工具,可以看出两个Wait.vi实例的调用并不是同时执行的,而是依次按顺序执行的,至于哪一个实例先执行是不确定的。
LabVIEW程序设计模式(五)—生产者消费者模式(3)_LabVIEW程序的动态调用
LabVIEW程序设计模式(五)—生产者/消费者模式(3)_LabVIEW程序的动态调用LabVIEW程序设计2009-05-19 17:11:09 阅读696 评论0 字号:大中小订阅简单而言,动态调用指的是通过程序控制另外一个程序的运行、停止、赋值和获取值等。
LabVIEW提供了多种动态调用的方式,从底层而言是通过VI Server 技术实现的。
图31所示为LabVIEW中的Application Control选板,动态调用所使用的节点都位于这个选板。
当调用一个在硬盘、内存甚至是网络路径上的vi时,首先要使用Open VI Reference以将该VI载入内存并获取VI的“句柄(Reference)”;然后再使用该句柄进行其它的控制操作;最后再关闭该VI的句柄避免内存泄漏,这就完成了一次对VI的调用。
图31 Application Control选板图32是一个动态调用的具体实现代码,首先使用Open VI Reference获取被动态调用VI的Reference(例子中是C:\average.vi);再使用Call By Reference Node 节电动态运行该VI;最后关闭VI的Reference。
在使用Call By Reference Node 时需要事先指定被调用VI的输入输出接口,也就是说这种动态调用的前提是必须知道被调用VI的输入输出接口,否则无法进行动态调用。
图32 VI的动态调用Open VI Reference的路径输入是一个多态的输入口,也可以使用String输入,如图33所示。
此时被调用的VI必须在内存中,且输入的是被调用VI的文件名。
值得一提的是这种“文件名”调用方式在可执行程序中是无法被调用的,因此建议最好采用路径的调用方式。
图33 Open VI Reference的多态性【应用5】本例将使用LabVIEW的动态调用方式实现斐波那契数列(Fibonacci数列)。
精讲LabVIEW设计模式培训
精讲LabVIEW设计模式培训概述LabVIEW是一种图形化编程语言,用于数据采集、控制、仪器仪表通信、图像处理等领域。
设计模式是一种经过验证的最佳实践方法,用于解决特定问题。
本文将精讲LabVIEW设计模式培训,帮助读者了解LabVIEW设计模式的基本概念和应用。
设计模式的概念设计模式是在软件工程中,根据问题的特点和需求的约束,提供一套解决方案的模式。
它可以提高代码的可读性、可维护性和可扩展性。
设计模式分为三大类:创建型模式、结构型模式和行为型模式。
在LabVIEW中,常用的设计模式包括状态机模式、发布-订阅模式、命令模式等。
状态机模式状态机模式是一种通过定义对象的状态来解决特定问题的设计模式。
在LabVIEW中,状态机模式常被用于处理事件驱动的程序。
它通过不同的状态和状态之间的转换来实现特定功能。
例如,一个简单的状态机模式可以用于控制流程的顺序执行,通过定义不同的状态和状态之间的转换条件,实现不同的程序逻辑。
发布-订阅模式发布-订阅模式是一种实现对象间松耦合的设计模式。
在LabVIEW中,发布-订阅模式被广泛应用于多任务编程和消息传递。
它通过将消息的发布和订阅分离,实现不同模块之间的通信。
例如,一个发布-订阅模式可以用于实现观察者模式,让观察者模块监听某个对象的状态变化。
命令模式命令模式是一种将请求封装为对象,以此来参数化客户端的设计模式。
在LabVIEW中,命令模式常被用于实现撤销和重做功能。
它通过将动作封装成命令对象,实现对动作的参数化和执行。
例如,一个命令模式可以用于实现对仪器的控制,每个命令对象代表一个具体的操作,可以被撤销和重做。
实例讲解下面,我们将通过一个简单的实例来讲解LabVIEW设计模式的应用。
假设我们需要编写一个程序来控制一个自动化实验装置,包括采集数据、处理数据和输出结果。
我们可以使用状态机模式来实现流程的顺序控制,使用发布-订阅模式来实现模块间的通信,使用命令模式来实现对仪器的操作。
labview架构设计思路实例
labview架构设计思路实例LabVIEW是一种图形化编程语言,用于控制和测量系统。
在进行LabVIEW架构设计时,需要考虑以下几个方面:1. 模块化设计,模块化设计是LabVIEW架构设计的关键。
将系统分解为不同的模块,每个模块负责特定的功能。
例如,可以将数据采集、数据处理、用户界面等功能模块化设计,以便于维护和扩展。
2. 合理的数据流,在LabVIEW中,数据流是非常重要的。
设计时需要考虑数据的流向和处理方式,确保数据能够在不同模块之间流通,并且能够正确地被处理和显示。
3. 使用适当的设计模式,LabVIEW中可以使用一些常见的设计模式,例如状态机、观察者模式等。
这些设计模式可以帮助提高系统的可扩展性和灵活性。
4. 考虑性能和实时性,如果系统需要实时性能,需要特别关注数据处理的速度和系统的响应时间。
可以使用并行计算、硬件加速等技术来提高系统的性能。
5. 考虑可扩展性和可维护性,在设计LabVIEW架构时,需要考虑系统的可扩展性和可维护性。
合理的模块化设计和良好的代码结构可以帮助提高系统的可扩展性和可维护性。
举例来说,假设我们要设计一个数据采集和显示系统。
我们可以将系统分解为数据采集模块、数据处理模块和用户界面模块。
数据采集模块负责从传感器或设备中采集数据,数据处理模块负责对采集到的数据进行处理,用户界面模块负责将处理后的数据显示给用户。
我们可以使用状态机设计模式来管理数据采集的状态,使用观察者模式来更新用户界面。
同时,我们需要考虑数据的流向和处理方式,确保数据能够正确地在不同模块之间流通和处理。
总之,LabVIEW架构设计需要考虑模块化设计、合理的数据流、适当的设计模式、性能和实时性、可扩展性和可维护性等方面,以确保系统具有良好的可扩展性、可维护性和性能。
第2章-LabVIEW程序设计模式
例3 利用测试流程型状态机计时
例3 利用测试流程型状态机计时
与例1,例2相比, 程序员可以定义枚举 值为各个状态的功能 ,在结构的子框图列 表中,这些枚举值会 显示出来,这样就可 以很清楚地知道各个 子框图的具体含义了 。
消息队列处理模式
当我们需要动态地根据用户的输入改变状 态序列时,状态机模式的劣势就显现出来,因 为其状态序列是固定规定好的,一旦程序运行 越来就无法修改。为此,需要引入消息队列模 式,通过建立队列缓冲区来解决这个问题。这 种模式也称为“队列型状态机模式”,但是由 于其应用和原理都并不局限于状态机模式,所 以为了避免混淆,一般称为“消息队列处理模 式”。
例1 利用顺序型状态机计时
例1 利用顺序型状态机计时
利用顺序型状态机计算某个 动作运行的时间,这个程序共需 要3个子框图,调用“定时”函数 子面板中的“时间计数器”函数 开始计时。“时间计数器”函数 返回计算机开机到当前的时间毫 秒数。在第2个子框图中,放入需 要计算的动作模块,并将初始的 时间值传递给移位寄存器。在第3 个子框图中将利用移位寄存器的 值进行时间差的计算,得到动作 模块运行所消耗的时间,并退出 循环。
设计模式的分类
按照两种类型分类,各种类型又分别包含以 下几种设计模式:
通用型:主要包括状态机模式、消息队列模 式和用户界面事件模式;
专用型:主要包括主从线程模式、生产消费 模式、后台服务模式、异常处理模式和代理模 式。
状态机模式
绝大多数的测试测量系统在运行时需要从一 个状态转换到另一个状态,或者在不同的状态 之间互相切换,直至结束。因此状态机模式作 为一种典型的类顺序结构方式,被广泛应用于 各种自动化测试系统中。
顺序型状态机模式
顺序型状态机是最简单的一种状态机结构, 它和顺序结构等价。在状态机的基本构架上, 将循环索引端连接到结构的选择端口上,并在 最后一个子框图中控制循环结束。
利用LabVIEW进行电路板设计与布局
利用LabVIEW进行电路板设计与布局LabVIEW是一种功能强大的可视化编程语言和开发环境,它可以用于电路板设计和布局。
在本文中,将介绍如何使用LabVIEW进行电路板设计和布局的基本步骤和技巧。
一、概述电路板设计与布局是电子工程中非常关键的环节。
一个良好设计的电路板可以提高电路的性能与可靠性,并节省电路板的空间。
而LabVIEW作为一种流行的工具,为电路板设计和布局提供了丰富的功能和灵活性。
二、LabVIEW基础知识在开始之前,我们先了解一些LabVIEW的基础知识。
1. 控件和工具栏:LabVIEW提供了各种各样的控件和工具栏,用于实现电路板的设计和布局。
例如,我们可以使用按钮控件来表示开关,使用数值显示控件来表示电流和电压等。
2. 连线和框图:LabVIEW以框图的方式表示程序的流程和结构。
我们可以使用连线来连接各个控件和模块,实现电路的连接和信号传输。
3. 功能模块:LabVIEW提供了多种功能模块,用于完成各种电路板设计和布局的任务。
例如,我们可以使用滤波器模块来实现滤波功能,使用数据存储模块来保存数据等。
三、电路板设计与布局的基本步骤下面是使用LabVIEW进行电路板设计与布局的基本步骤:1. 理清电路结构:首先,我们需要根据电路的功能和需求,理清电路的结构和模块之间的关系。
这一步骤可以帮助我们确定所需的控件和模块。
2. 建立框图:在LabVIEW中,我们可以使用框图语言来建立电路的流程和结构。
使用LabVIEW提供的控件和工具栏,我们可以方便地创建和配置框图。
3. 连接控件和模块:使用LabVIEW提供的连线功能,将各个控件和模块连接起来。
确保信号的正确传输和连接。
4. 参数设置:根据电路的需求,对各个控件和模块进行参数设置。
例如,设置滤波器的截止频率,设置数据采集的采样率等。
5. 优化和测试:在完成电路的设计和布局后,我们可以使用LabVIEW提供的调试和测试功能,对电路进行优化和测试。
如何利用LabVIEW进行虚拟仪器设计和仿真
如何利用LabVIEW进行虚拟仪器设计和仿真利用LabVIEW进行虚拟仪器设计和仿真LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种集数据采集、信号处理、仪器控制和虚拟仪器设计于一身的集成开发环境,广泛应用于各个领域的工程实验和测试中。
本文将介绍如何利用LabVIEW进行虚拟仪器设计和仿真,并提供一些实际案例来说明其应用价值。
一、LabVIEW介绍LabVIEW是由美国国家仪器公司(National Instruments, NI)于1986年推出的一种图形化编程语言。
与传统的文本编程语言相比,LabVIEW通过将函数块拖拽到界面上并进行连接来组成程序,使得程序的开发更加直观、易于理解。
LabVIEW提供了丰富的工具箱和函数库,可用于数据采集、信号处理、仪器控制和用户界面设计等方面。
二、虚拟仪器设计虚拟仪器是指利用计算机软件和硬件模拟真实仪器的功能。
利用LabVIEW可以轻松地设计各种虚拟仪器,如示波器、信号发生器、频谱分析仪等,用于实现数据采集和信号处理等功能。
LabVIEW提供了众多的仪器模拟器和控件,用户只需简单地拖拽和配置这些组件,即可实现一个功能完备的虚拟仪器。
三、虚拟仪器仿真利用LabVIEW进行虚拟仪器仿真可以帮助用户在设计阶段快速验证算法和性能,并且可以方便地进行多种参数的调整和测试。
LabVIEW提供了灵活且强大的仿真工具,用户可以根据需要配置仿真场景、定义仿真信号和操作流程,并通过动态调整参数和监测仿真结果来完成虚拟仪器的性能评估。
四、LabVIEW在工程实践中的应用1. 数据采集和处理利用LabVIEW可以方便地搭建数据采集系统,并通过各种传感器和硬件设备获取实时数据。
同时,LabVIEW提供了丰富的信号处理函数和算法,可以对采集的数据进行滤波、降噪、频谱分析等处理,从而提取出有效信息。
2. 仪器控制和自动化LabVIEW支持与各类仪器设备的通讯和控制,可以通过GPIB、USB、Ethernet等接口与仪器进行连接,并通过LabVIEW编写程序来实现仪器的自动化控制。
Labview程序设计模式
Labview程序设计模式LabVIEW程序设计模式,这个相对学术化的词语是对一系列用于LabVIEW程序设计结构的归纳和总结。
在建造房子时,需要针对房子的用途设计整个房屋的架构,确保房子在这个架构上的坚固性和可建造性。
写程序时同样如此,不同的应用需要使用不同的程序设计结构。
例如我们在LabVIEW中构建一个用户界面型程序时,往往首先在背面板中加入一个大的while循环以使程序持续运行。
如果需要响应用户界面事件则还需要加入一个Event事件结构。
那么我们是否曾经考虑过以下的这些问题:(1) 应用中是否存在并行响应的情况?如在持续的数据采集过程中,是否需要同时响应单击菜单的事件?(2) 底层获取的数据如何与上层的数据显示部分进行数据交互?(3) 上层的界面如何受底层程序的控制?(4) 同一个循环中采用哪种方式进行数据交换?是局域变量、全局变量、共享变量还是移位寄存器?(5) 程序是否具有可扩展性?(6) 如果程序运行过程中,发生系统错误或者硬件通讯错误,是否会停止运行?待错误排除后是否会继续运行?(7) 如何组织程序中的核心数据结构?是否需要采用面向对象程序设计?(8) 如何记录测试数据并生成报表?如何保存用户配置参数?(9) 如何处理程序运行中的断电情况?重新启动时的继续运行?数据的最低丢失?(10) 如何实现运行过程的采样触发和多点采样的同步?当然,也许只是使用LabVIEW临时地调试或开发某个小的应用,无需考虑上述的问题。
但是,如果使用LabVIEW开发一个典型应用的程序却无法回避这些问题。
因此,有必要对各种程序开发的应用进行归纳和总结,提取它们对应的LabVIEW程序结构中的共性。
此外,针对这些共性研究哪种结构更加适合于应用。
这些结论综合起来就形成了程序设计的模式。
对于初学者而言,理解和掌握程序设计模式往往能起到事半功倍的效果;而对高级用户而言,归纳各种程序设计模式又能够不断完善程序中遇到的问题,并衍生一套符合特定应用的特有的程序设计模式。
LabVIEW中的虚拟仪器设计和开发
LabVIEW中的虚拟仪器设计和开发LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一款由国家仪器公司(National Instruments)开发的图形化编程平台,用于虚拟仪器设计和开发。
本文将介绍LabVIEW中的虚拟仪器设计和开发的基本原理、应用场景以及开发流程。
一、LabVIEW虚拟仪器设计的基本原理在LabVIEW中,虚拟仪器是由各种测量和控制模块组成的图形化程序,它们模拟了真实世界中的各种仪器和设备。
LabVIEW通过将这些模块连接起来形成数据流图(Dataflow Diagram),实现了虚拟仪器的设计和开发。
虚拟仪器的设计和开发过程中,首先需要选择和配置合适的模块,例如传感器、数据采集卡、执行器等。
然后利用LabVIEW提供的各种模块库,通过简单的拖拽、连接和配置,实现虚拟仪器中各个模块之间的功能关联。
LabVIEW的编程语言是一种图形化语言,称为G语言(G-language)。
用户可以使用G语言来编写虚拟仪器的程序,利用各个模块的输入和输出来实现数据采集、信号处理、控制执行等功能。
G语言的编程方法与传统的文本编程语言有所不同,它更加直观、易于理解,即使是对于没有编程经验的用户也能够很快上手。
二、LabVIEW虚拟仪器设计的应用场景LabVIEW的虚拟仪器设计和开发广泛应用于各个领域的科学研究、工程实验和生产制造等环节。
以下是几个典型的应用场景:1. 科学实验室:LabVIEW可以用于设计和开发各种科学实验的虚拟仪器,例如物理实验、化学实验、生物实验等。
通过LabVIEW可以实现实时数据采集、信号处理、曲线绘制、数据分析等功能,帮助科学家和研究人员更好地进行实验和研究工作。
2. 工程测试:LabVIEW可以作为工程测试的核心工具,用于开发各种测试仪器的虚拟化解决方案。
它支持多种通信协议和接口,可以与各种传感器、仪器和设备进行数据交互。
如何使用LabVIEW进行电路设计与分析
如何使用LabVIEW进行电路设计与分析LabVIEW是一种基于图形化编程的集成开发环境,广泛应用于各种科学与工程领域。
对于电路设计与分析而言,LabVIEW提供了丰富的工具和函数,可以帮助工程师和研究人员快速、准确地完成相关任务。
本文将介绍如何使用LabVIEW进行电路设计与分析,包括电路建模、仿真和结果分析等方面。
一、电路建模在使用LabVIEW进行电路设计与分析之前,首先需要将电路建模。
LabVIEW提供了各种电路元件的建模工具,可以根据实际情况选择适合的元件进行建模。
在建模过程中,需要考虑电路拓扑、元件参数、功率和信号等因素,并将其映射到LabVIEW的图形化编程框图中。
1.1 创建电路模型使用LabVIEW时,可以选择自带的电路元件库或者自定义的元件库进行电路建模。
打开LabVIEW,选择电路模块,拖动所需元件到框图中,并按照电路拓扑连接元件,完成电路的初始化。
1.2 设置元件参数在建模过程中,需要设置电路元件的参数。
LabVIEW提供了参数配置界面,可以通过输入/输出控件设置元件的数值和状态,并与其他元件进行连接。
1.3 建立连接关系建立电路元件之间的连接关系是电路建模的重要步骤。
LabVIEW 提供了连接线的工具,可以通过连接线将元件连接在一起。
在建立连接的过程中,需要确保连接的正确性和有效性。
二、电路仿真完成电路建模后,可以使用LabVIEW进行电路仿真,即模拟电路的运行情况。
LabVIEW提供了多种仿真工具和器件,可以模拟电路的输入和输出信号,并根据设定的参数计算电路的工作状态。
2.1 设置输入信号在进行电路仿真之前,需要设置电路的输入信号。
LabVIEW提供了多种信号源和波形发生器,可以生成各种形式的输入信号。
通过设置输入信号的幅值、频率和相位等参数,可以模拟真实电路的输入条件。
2.2 运行仿真设置好输入信号后,即可运行电路仿真。
LabVIEW会根据电路模型和输入信号计算电路的输出结果,并在仿真界面上显示相应的波形图和工作状态。
LabVIEW程序设计方法
LabVIEW程序设计方法为了提高程序设计效率、保证程序设计质量、便于程序的维护,在设计程序时应遵循一些基本的设计方法。
当开发一个较大的项目时,有必要使用由顶向下的设计方法。
LabVIEW语言在使用由顶向下的设计方法上,比其他语言有优势,因为可以先做出用户的接口,然后再逐渐完善它。
1.使用由顶向下的设计方法1)用户需求列表先列出一个表格,包括用于用户操作的面板(指大的程序中需要弹出的子程序的面板),这些面板上一般包含控制量与显示量类型,实时分析需求以及数据的表达等。
然后创建一个临时的前面板,提供给预期的用户。
通过一系列交互的过程,按用户的要求反复调整用户接口。
在这个阶段,可能还需要做一些底层的调研,确定可以达到预期的设计要求。
2)设计程序的层次结构LabVIEW语言的强大功能建立在它的层次特性之上。
每创建一个程序,就可以在高层程序的框图中把它当做子程序使用。
在这种层次结构下,从本质上说层数是无限的。
确定所需顶层模块之后,使用这些顶层模块创建程序代码。
为每个模块创建一个子程序,这个子程序不具备任何功能,只是代表未来子程序的一个模型。
每个子程序应有一个图标和一个包括所有必要的输入输出量的前面板。
但是暂时不必为它创建程序代码,而是确认它是否为顶层程序所必需的。
把这些模型程序组合在一起后,一般说来就应该去理解每个模块的功能,以及它们如何提供需要的结果。
研究每一个模块是否能提供后续程序所必需的信息,然后确认顶层程序代码包含了各程序间传递数据的正确连线。
尽量避免使用不必要的全局变量,因为它们会掩盖了程序间的数据依存关系。
对一个大的程序来说,如果依赖全局变量作为程序间传递信息的手段,会使调试变得困难。
3)程序编码在程序编制过程中,应按照工作的逻辑划分和考虑代码复用的可能性,通过创建子程序实现模块化的编程,把解决一般性问题与特殊问题相结合。
子程序创建以后及时调试。
高层的调试尽管是不可避免的,但是在一个小模块中发现程序缺陷要比在多个程序的层次上方便得多。
LabVIEW 编程模式
LabVIEW 软件工程方法一、LabVIEW 编程模式编程模式,是指一些固定有用的程序结构模式,是编程经验的总结和提炼,并经过了多次成功验证。
使用被广泛接受的编程模式设计出的应用程序,很容易被其他开发人员读懂或修改,也是软件重用的重要基础。
常见的LabVIEW编程模式主要有状态机模式(Staste Machine)、队列消息模式(QueuedMessage Handler)、用户界面事件模式(UI Event Loop)、主/ 从结构模式(Master/Slave)和生产者/ 消费者模式(Producer/Consumer)等。
这5 种模式应用的非常普遍,并且在LabVIEW中,也可以较为方便地实现这5 种编程模式。
状态机模式是LabVIEW 程序设计中最常用的设计模式之一。
它可以用来清晰地实现任何以状态图描述的算法,它的每一种状态对应一种相应的操作。
状态机常用在决策算法中。
例如诊断、监测和控制等。
图1 所示为LabVIEW状态机程序框图的主框架。
由图1 可知,LabVIEW 标准状态机主要由一个While 循环和一个Case 结构构成,并利用移位寄存器来实现状态的跳转。
为了方便编程,可采用Typedef 来实现状态枚举值,这样当需要修改程序状态时,只需要改变Typedef 就可以改变所有的枚举变量。
图1 标准状态机程序框图队列消息模式同状态机模式有些类似,这种模式通常被用于需要特定处理顺序的场合。
用户界面事件模式采用事件结构来响应用户的操作,这种交互方式可以处理诸如鼠标移动、键盘操作、值改变等事件。
由于事件捕获的方式是采用中断方式实现的,因而避免了轮询导致的CPU 资源的浪费,而且会自动产生事件队列,避免了事件的丢失。
但由于它必须执行完前一个事件后才能执行下一个事件,因此任何一个事件结构的执行时间必须尽量地短,以避免用户的误操作。
主/ 从结构模式通常应用于同时有两个或多个以不同频率运行的循环并且循环之间存在有信息交换时的场合。
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)系统一次只能执行一个状态,不适合做并行任务处理。
7. LabVIEW编程:面向对象编程之设计模式一
Redhead Duck display() { //looks like redhead}
Rubber Duck display() { //rubber duck}
策略模式
重写方法
Duck quack() swim() display() fly() //Other duck-like methods
继承的一种重要用途是实现代码的重用
继承
Mallard Duck display() { //looks like mallard} Redhead Duck display() { //looks like redhead} Rubber Duck display() display() { { //rubber duck} //rubber duck} fly() { //override to do nothing}
继承不易维护
Mallard Duck display() { //looks like mallard}
Redhead Duck display() { //looks like redhead}
Rubber Duck display() { //rubber duck} fly() { //override to do nothing}
Redhead Duck display() { //looks like redhead}
策略模式
Duck quack() swim() display() fly() //Other duck-like methods
橡皮鸭子不能飞
Mallard Duck display() { //looks like mallard}
观察者模式
Stock <<abstract>> Price Symbol Add Observer() Remove Observer() Update()
5.1 LabVIEW图形化编程语言的设计模式
第5章LabVIEW图形化编程语言的设计模式(LabVIEW graphical programming language, design patterns)版本 4创建于: 2010-12-26 上午6:58 作者jwdz - 最后修改: 2011-1-14 下午10:06 作者jwdz在基本上弄清楚了图形化代码的基本功能以及它的数据流运行机制后,许多人都可能会有一种跃跃欲试的编程冲动,因为他们相信通过对上述内容的了解和认识后,自己已经具备了使用图形化编程语言进行程序设计的能力。
是的,我们也深信这绝对应该是可以的!但是,需要要告诫的是:如果要想使用图形化代码设计出令用户满意的程序,或者说,把它作为职业生涯的一种技术手段,仅仅了解到这些显然还是不够的。
那么,还需要知道哪些方面的一些内容呢?崭且不考虑其它方面的因素,比如:硬件及硬件驱动体系等等。
仅就软件编程方面至少还需要了解图形化代码的一些基本的设计模式。
这些正是本章所要介绍的主要内容。
5.1 设计模式概述什么是设计模式?图形化语言的设计模式会有那些?它对图形化程序的设计会带来那些帮助?5.1.1 设计模式许多讲解LabVIEW图形化编程语言的教课书中都谈到了设计模式重要性,那什么是设计模式呢?首先,我们要说明的是:设计模式是包含在许多工程设计领域中的基本概念。
我们这里所说的设计模式是指软件范畴中的基本概念。
下面我们给出软件设计中设计模式的基本定义:设计模式——软件设计中,在某情境下,针对某问题的某种解决方案。
[]情境——就是应用某个模式的情况。
这应该是会不断出现的情况。
问题——就是你想在某情境下达到的目标,但也可以是某情境下的约束。
解决方案——就是你所追求的,一个通用的设计,用来解决约束,达到目标的方法。
我们在一同来看看《维基百科》中的解释或说明:“设计模式这个术语是由Erich Gamma等人在1990年代从建筑设计领域引入到计算机学科的。
它是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。
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 结构用来确定是否向从循环发出通知。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4、通过取消注册时间函数停止事件发生。
动态事件注册demo
最值器
用户界面事件demo 一个动态+5个静态
状态机——用户界面事件混合demo
LabVIEW 事件结构
• 什么是事件结构?
– 带有多个子框图的结构节点, 就像条件结构
• 事件结构是如何工作的?
– 当面板上事件发生时才被唤醒 – 自动执行相应事件框图内的事件代码 – 当处理完成相应事件后便结束,并不一直循环等
待
为什么要使用事件结构 ?
• 用更简单的事件处理替代原来的查询循环 • 最小化 CPU 的使用 • 不会遗漏用户界面交互事件 • 可检测更多的交互事件 • 编程生成您自己的事件
一个自定义的枚举类型对应一个状 态机中的状态集合
枚举常量举例
控件选板“Modern”
1、枚举控件、指示、常量
2、默认U16
3、修改 Edit Items
4、隐式与显式类型转换
DEMO1
顺序型状态机模式
数据传 递方式
DEMO2
改进的顺序型状态机模式
1、去掉i 2、添加一个移位寄存器
DEMO3
测试流程型状态机
• 变量 • 通知器 • 队列 • 信号量 • 集合
队列
在队列中添加元素
选择队列中元素的数据类型 Reference to existing queue in memory
从队列中释放元素
出列操作需要等待数据进入或者超时情况
生产者 / 消费者循环
后台服务模式
问:“我需要程序在后台运行,不要前面板,不要交互”
在程序中动态调用子VI
——减少程序占用内存以及载入时间
• 打开VI引用 • 通过引用节点调用 • 关闭引用
1
2
3
配置 VI加载
1
2
数据类型转换
• 强制点表明连接了两种不同的数据类型
– LabVIEW中类型强制转换需要数据备份 – 涉及大数组的类型强制转换会占用大量内存
推荐的类型转换方式
• 更好的解决方式是在随机数创建时进行转换
Quarter
Total < 50
Total >= 50
Total < 50
Total < 50
Dime
Total >= 50
Nickel
Total >= 50
Total > 50
Vend
Exit
Total = 50
基本三要素:
状态、事件、动作
背景
静态顺序结构
动态结构:允许不同的状态,按通过编程决定的顺序进 行执行
数组方式DEMO
队列函数方式DEMO
队列函数与数组的不同
1、消息传递方式不同 移位寄存器 & FIFO
2、释放消息队列的方式不同
用户界面事件模式
“我需要轮询用户的操作,但是这样会降低我程 序的运行速度,并且有时我还检测不到……”
LabVIEW中基于事件驱动的编程
LabVIEW事件示例 • 按下鼠标 • 键盘按键 • 前面板的用户交互
演示:定时循环
演示:定时循环
可具体手动设置定时循环运行的核
设置定时循环运 行的指定核
可具体手动设置定时循环运行的核
定时顺序结构Timed Sequence 含帧的定式循环Timed Loop with Frames
为什么要优化LabVIEW程序内存管理
• LabVIEW的自动管理内存特性
1、解决顺序型状态机不便阅读和修 改的问题,采用枚举型常量。
2、采用自定义型控件,方便修改。
over
消息队列模式
“我需要执行一系列的事件步骤,但是步骤顺序可通过 编程决定的。”
步骤是由用户界面事件决定的,如某个应用程序共要处 理4个状态,分别是A,B,C和D,前面板有3个按钮分别 控制3种运行时的状态序列ABCD、DCAB和BDCA。
– 数据流 – 事件驱动 – 状态机结构 – 生产者/消费者
• 而功能型全局变量(functional global variable) 是为了避免竞争机制而实现的一种非重入型 子vi
定时结构
• 精确的定时 while 循环 • 精确的定时顺序结构 • 多个时钟频率的定时 • 反馈, 动态定时特性 • 多优先级设置 • examples\general\timedloop.llb
– 创建数组 – 连接字符串
演示:编程方法影响程序性能
总在开辟新内存,必定时间长
演示:编程方法影响程序性能
循环次数并非事先指定,因此每次循环也会开 辟新的内存,但节省了Build Array函数的时间。
演示:编程方法影响程序性能
循环无需开辟新的内存,时间会明显减少。
应用程序启动模式
1、SubVI目录 2、启动应用程序.vi 3、主程序“网络实验系统.vi”
代理模式
“我希望顶层VI(主VI)需要某个子VI时,才将其载入内存” “可以在应用程序中引入迟载入技术”
代理模式
总结
• 设计模式
– 简化LabVIEW开发过程 – 被广泛使用及证明其可用
• 常用的LabVIEW设计模式
初始化时不 再需要用户 自定义事件
其他模式
“我希望同一时刻能够处理多个消息事件,而不 是下一个消息代码必须等待上一次响应完成后才 能执行”
“我不希望消息排队,等待很烦的,有时采集数据和 记录数据应该同时进行的”。
主从线程模式
通常应用于具有多个 同时发生的并且拥有 不同运行速率的线程 的程序中。比如采集 电压同时写入磁盘, 采集速率1KHz,记录 则每5秒一次。
答:“采用VI属性和方法接口,足以使你控制后台运行的VI”
例子:一个网络服务监听程序,程序只需要接收与客户端Sockets 的连接,实现三次握手,连接完成后将引用交给前端应用程序处理, 同时继续监听。
后台服务模式
后台服务模式
应用程序启动模式
“我想设计一个启动画面,同时显示应用程序加载的进度,加载 完毕后退出启动画面,运行主程序”
– 避免转换大块数据缓存
(22.7 KB)
(14.3 KB)
把复杂VI分解成多个子VI
• 子vi会增加额外的前面板和框图的空间,但并 不增添额外的代码和数据空间。由于程序运行 时只有代码和数据被调入内存,子vi不会占用 额外的内存。
• 好处是子vi运行结束后,LabVIEW可以及时收回 子VI的数据空间,从而改善内存的使用效率。
• 具有灵活的配置功能 • 被广泛使用
使用设计模式的益处
简化整个开发过程
– 更容易理解程序代码 – 代码可重用
可靠性
– 被使用多年,被证明其“可用并可靠” – 大量技术资源与例程
使用设计模式注意事项
1、不是一成不变的定律,既要知道有哪 些设计模式,还要知道每种模式解决实 际应用中的哪些问题,是如何解决的, 效果如何?
用户界面事件的两种类型
通知事件 和 过滤事件
事件源:用户界面事件 用户自定义事件
5个函数
用户自定义事件DEMO
事件注册
静态事件注册:只有用户界面事件
选择事件源(程序、VI或控件)、特定事件、编辑 分支处理事件数据。Vi运行时自动注册。
动态事件注册:何时产生何种事件
静态事件注册demo
动态事件注册4个步骤
3、Deadline:用于指定完成一个循环的时间限定,如未在 指定的时间内完成,则左端数据节点Finished Late?[i-1]返 回真。默认值-1表示Deadline由Period决定。
4、如何处理某次循环使用的时间大于设定的周期? 是否丢弃丢失的了的循环?是否保持原始相位?
定时循环
定时循环
2、文本式编程语言中广泛使用的设计模 式在图形化数据流编程中的应用问题。
注意!
有些时候你没有必要选用最 复杂的设计模式
不要忘记最常见的设计模式 ——数据流!
LabVIEW设计模式
通用型:状态机模式、
消息队列模式、 用户界面事件模式
专用型:主从线程模式、
生产/消费模式、 后台服务模式、 应用程序启动模式、 代理模式
引入消息队列模式,通过建立队列缓冲区来解决这个问 题,这种模式也称为“队列型状态机模式”。
消息处理过程
建立消息队列
消息源
加入消息
探测消息
No
EXIT?
Yes 销毁消息队列
删除消息
接收消息 执行代码
队列建立方式 队列函数和数组
队列函数
最常用的 4个函数
数组 1、数组函数 2、配合移位寄存器 3、无需手动销毁队列空间
工具性能分析性能和内存
显示VI内存分配情况的工具
• 帮助分析程序中各个数据变量的内存拷贝情况
– 目标:消除黑点
工具性能分析显示缓存区分配
了解程序内存的使用
演示:监测内存使用
优化 LabVIEW程序内存管理
• 适时选择动态调用子VI • 避免强制类型转换 • 把复杂VI分解成多个子VI • 采用多面板程序 • 没必要时不要设置VI的重入特性 • 合理分配数组内存 • 灵活使用LabVIEW自带的VI • 使用元素同址操作结构In Place Element Structure
采用多面板程序
• 通过多面板程序实现只有在必要时才显示某些 窗口,因为界面显示是最费内存的,因此这样 可以极大降低内存的消耗。
没必要时不要设置VI的重入特性
• 重入型vi每次运行时都会对自己使用的数 据生成一个副本,这增加了内存开销
合理分配数组内存