5.3 LabVIEW设计模式——用户接口事件处理程序
- 格式:doc
- 大小:824.00 KB
- 文档页数:18
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程序设计模式(三)—用户界面事件模式针对基本状态机模式的第(4~5)个问题,需要对模式进行改进。
本节将一一分析这些问题对应的解决方案,并最终形成一种新的状态机模式——用户界面事件模式。
(1)程序一直在占用CPU资源。
(2)无法响应更多的前面板事件。
熟悉LabVIEW的工程师应该能够很容易地解决这两个问题,在LabVIEW 7.0以后的版本中提供的事件结构(Event Structure)能够让我们非常便捷地处理这两类问题。
在LabVIEW中事件结构的使用并不是一件难事,根据事件的发出源,事件可以抽象地分为用户界面事件和用户自定义事件。
相关的基本知识可以参考有关的书籍,这里不再阐述事件结构的使用方法。
图14所示的结构称为用户界面事件模式,它能够很便捷地响应各种事件并且不占用CPU的资源,这是由LabVIEW中事件结构本身的特性决定的。
图14 用户界面事件模式【应用3】本例要模拟一个简单的画图板功能。
它有4个功能选项:点(point)、线(line)、圆(circle)和椭圆(oval),一次完成的绘画过程是:在画布上单击鼠标开始绘制→按住鼠标的同时在画布上拖动鼠标→在画布上放开鼠标结束绘制。
程序的前面板如图15的样式,下面是画布,右上方的图15 画图板前面板由于系统需要响应鼠标在画布上单击、移动和释放事件,因此使用状态机模式是无法解决的,只能通过事件结构。
因此本例将使用用户界面事件模式实现上述的画图板功能。
程序的背面板如图164个事件。
(1)Panel Close?:响应前面板的(2)Picture <Mouse Down>:表示绘画的开始。
(3)Picture <Mouse Move>:表示绘画的路径和轨迹。
(4)Picture <Mouse Up> <Mouse Leave>:表示绘画的结束,此时一定要加入<Mouse Leave>事件,因为当鼠标移动到画布的外面时就可以认为是绘画结束了,并不需要一定要求鼠标在画布中释放。
LabVIEW中的事件驱动编程实现交互式用户界面介绍:LabVIEW是一款强大的图形化编程环境,广泛应用于科学、工程和控制领域。
在LabVIEW中,事件驱动编程是一种常见的开发模式,通过捕获用户的操作事件并相应地改变程序的行为,能够实现交互式的用户界面。
本文将介绍LabVIEW中的事件驱动编程,以及如何利用该编程模式实现动态而且吸引人的用户界面。
一、什么是事件驱动编程事件驱动编程是一种广泛应用于软件开发的模式。
它基于事件的触发和相应机制,当某个事件发生时,程序会执行相应的操作。
在LabVIEW中,事件可以是用户的鼠标点击、键盘输入,也可以是其他设备或传感器发送的信号。
用户界面的操作通常通过事件驱动来响应。
二、事件和事件处理在LabVIEW中,事件是指用户在界面上进行的操作,如鼠标点击按钮、拖拽滑块等行为。
为了捕获这些事件并进行相应的处理,我们需要使用事件结构来实现。
事件结构通过监听用户的操作,当事件发生时,触发相应的事件处理程序,从而实现对界面的动态控制。
三、示例:实现一个简单的交互式用户界面为了更好地理解事件驱动编程在LabVIEW中的应用,我们以一个简单的交互式用户界面为例进行讲解。
该界面包括一个滑块和一个文本框,滑块用于控制文本框中显示的数值。
首先,在LabVIEW中创建一个新的VI,添加一个滑块和一个文本框控件。
接下来,我们需要为滑块添加事件处理程序。
右击滑块控件,选择「添加事件」。
在弹出的对话框中,选择「值改变」事件,并点击「确定」。
这样,滑块的值改变事件就和一个事件处理程序关联起来了。
接着,我们需要在事件处理程序中编写代码,控制文本框的显示。
在事件结构中找到滑块的值改变事件处理程序,可以看到该事件处理程序已经与滑块的值改变事件关联。
我们在该事件处理程序中添加代码用于更新文本框中的数值。
编写的代码如下:```// 获取滑块的值float value = slider.Value;// 将值显示在文本框中textBox.Text = value.ToString();```通过这段代码,当滑块的值改变事件被触发时,程序会获取滑块的新值,并将其转换为字符串,并将该字符串赋值给文本框控件,实现实时的数值显示。
labview控制程序流程——labview事件结构1 事件结构及它的图形化表示法事件被用来通知用户有异步活动发生。
图形化语言的事件响应包括:用户界面事件、外部I/O 事件和程序其它部分的事件。
对事件的处理程序也被称为:事件驱动程序。
事件驱动程序可以分为若干个分支,每个分支处理不同的事件响应。
所以对事件的响应结果也可以控制程序的流程。
事件驱动机制来自于可视化的操系统,可视化操作系统对用户事件提供了简洁、有效的响应方式,最常见的事件来自于鼠标和键盘。
虚拟仪器借助于操作系统的事件处理机制实现了图形化语言的事件响应能力。
在没有引入事件结构之前,LabVIEW 是借助于轮询的方式来查询用户操作,由于轮询的方式会占用一定的CPU 资源,甚至可能遗漏事件,所以这种处理方式并非理想。
事件结构的出现避免了对CPU 资源的占用,同时也避免了事件的遗漏。
事件结构在函数选板》编程》结构子选板中可以找到,并可以将其直接拖拽到程序框图中,图形化表示的事件结构,参见下图。
图 1 图形化的事件结构与Case 结构和循环结构类似,事件结构也包含了一个主框架,这个框架内将用来放置事件处理的事件驱动程序代码。
如果事件处理任务众多,会有众多事件分支存在,在结构上类似Case 的多帧结构(选择器标签)。
当在程序框图上拖放一个事件结构时,我们只能看到上图所示的一帧已经预先注册的超时事件(Timeout),超时事件分支。
它具有定时延迟的基本功能(不包括While 循环),参见下图。
图 2 具有定时延迟的基本功能当然也可以采用另一种表示方法,参见下图。
图 3 利用事件结构内部节点获得中止时间通过这个例子也好理解内部节点中时间的含义(是事件响应的停止时间)。
超时事件超时事件是一种特殊的事件,当然也可以看成是默认的事件分支。
如果存在其它事件源时,超时事件完全可以被忽略或取消。
看下面一个例子。
图 4 仅有的两个事件之一超时事。
Labview程序设计模式LabVIEW程序设计模式,这个相对学术化的词语是对一系列用于LabVIEW程序设计结构的归纳和总结。
在建造房子时,需要针对房子的用途设计整个房屋的架构,确保房子在这个架构上的坚固性和可建造性。
写程序时同样如此,不同的应用需要使用不同的程序设计结构。
例如我们在LabVIEW中构建一个用户界面型程序时,往往首先在背面板中加入一个大的while循环以使程序持续运行。
如果需要响应用户界面事件则还需要加入一个Event事件结构。
那么我们是否曾经考虑过以下的这些问题:(1) 应用中是否存在并行响应的情况?如在持续的数据采集过程中,是否需要同时响应单击菜单的事件?(2) 底层获取的数据如何与上层的数据显示部分进行数据交互?(3) 上层的界面如何受底层程序的控制?(4) 同一个循环中采用哪种方式进行数据交换?是局域变量、全局变量、共享变量还是移位寄存器?(5) 程序是否具有可扩展性?(6) 如果程序运行过程中,发生系统错误或者硬件通讯错误,是否会停止运行?待错误排除后是否会继续运行?(7) 如何组织程序中的核心数据结构?是否需要采用面向对象程序设计?(8) 如何记录测试数据并生成报表?如何保存用户配置参数?(9) 如何处理程序运行中的断电情况?重新启动时的继续运行?数据的最低丢失?(10) 如何实现运行过程的采样触发和多点采样的同步?当然,也许只是使用LabVIEW临时地调试或开发某个小的应用,无需考虑上述的问题。
但是,如果使用LabVIEW开发一个典型应用的程序却无法回避这些问题。
因此,有必要对各种程序开发的应用进行归纳和总结,提取它们对应的LabVIEW程序结构中的共性。
此外,针对这些共性研究哪种结构更加适合于应用。
这些结论综合起来就形成了程序设计的模式。
对于初学者而言,理解和掌握程序设计模式往往能起到事半功倍的效果;而对高级用户而言,归纳各种程序设计模式又能够不断完善程序中遇到的问题,并衍生一套符合特定应用的特有的程序设计模式。
LabVIEW形编程打造自定义用户界面LabVIEW (Laboratory Virtual Instrument Engineering Workbench)是一种基于图形化编程的集成开发环境,广泛应用于工程和科学领域。
通过LabVIEW,用户可以使用各种图形化的工具和函数来构建自定义的用户界面。
这篇文章将介绍如何利用LabVIEW形编程来打造自定义的用户界面。
一、LabVIEW形编程简介LabVIEW形编程是基于图形化编程的思想和方法,其核心概念是将代码表示为一个个的图形化模块,称为虚拟仪器(Virtual Instrument)。
在LabVIEW中,我们可以使用各种图形化工具和函数来设计和配置这些虚拟仪器,从而实现自定义的用户界面。
二、自定义用户界面的设计1. 界面布局:LabVIEW提供了丰富的UI控件,如按钮、文本框、图表等。
我们可以通过拖拽这些控件并调整其位置和大小来设计界面的布局。
2. 控件设置:每个控件都有各自的属性和事件,可以通过设置这些属性和事件来实现控件的功能和交互。
例如,我们可以设置按钮的标签和颜色,以及按钮被点击时触发的事件。
3. 数据绑定:LabVIEW支持将控件与数据源进行绑定。
通过数据绑定,界面上的控件可以实时显示、更新来自数据源的数据。
这样,用户可以方便地通过界面与数据进行交互。
4. 图形化编程:LabVIEW提供了丰富的图形化编程工具和函数库,可以通过连接和配置这些工具和函数来实现自定义的行为。
例如,我们可以使用条件判断、循环和数学函数来对数据进行处理和计算。
5. 事件处理:LabVIEW支持处理界面上的各种事件,如按钮点击、鼠标移动等。
通过设置事件处理函数,我们可以在相应事件发生时执行特定的操作,从而实现更加灵活和交互性的用户界面。
三、LabVIEW形编程实例下面,我们将通过一个简单的实例来演示LabVIEW形编程的过程。
我们要设计一个简单的计算器界面,包含两个文本框用于输入两个数字,一个下拉列表用于选择运算符,一个按钮用于执行计算,并在界面上显示计算结果。
labview学习——⽣产者消费者(数据)(事件)其主要的模型:主要从以下⼏个⽅⾯理解:1、可重⼊性正常的labview是多线程设计语⾔,⽽我们在执⾏VI时的规则是通过VI的命名来分别调⽤实现的。
打开VI的Highlight调试⼯具,可以看出两个Wait.vi实例的调⽤并不是同时执⾏的,⽽是依次按顺序执⾏的,⾄于哪⼀个实例先执⾏是不确定的。
这是由于LabVIEW本⾝是并⾏设计的,从理论上⽽⾔,两个VI的实例是同步执⾏的,但是如果两个Wait.vi实例同时执⾏必定会产⽣参数赋值紊乱,因为LabVIEW只允许内存中存在⼀个名称的VI。
如果在⼀个顺序结构⾥要同时进⾏两个vi的调⽤,采⽤的⽅法是单击ctrl+I,在新点出来的对话框中选择执⾏框⾥边的可重⼊选择Reentrant execution,这样的话再次运⾏上述实例⽤时长为并⾏执⾏的时间。
事实上,LabVIEW的可重⼊技术相当于在原有VI的基础上产⽣了⼀个相同的副本,打开Wait.vi从标题栏可以看出VI的名称为Wait.vi:1(clone)。
同理这是由于LabVIEW中不允许内存中的VI存在同名,VI的可重⼊技术相当于产⽣了与原VI具有同样功能的新VI并且修改了该VI的命名。
在实际应⽤中,需要根据情况决定是否设置VI的可重⼊属性,灵活使⽤。
并不是需要将所有的VI都设置为可重⼊,那将占据⼤量的内存资源。
2、动态调⽤通常调⽤⼦VI有两种⽅法,⼀种是静态调⽤,直接在控制板⾥选择⼦VI的⽅法,即编译⽣成可执⾏程序后,⼦VI的代码将会被静态链接到可执⾏程序中另⼀种就是动态调⽤,指的是通过程序调⽤另⼀个程序的运⾏、停⽌、赋值和获取值。
通过程序框图-查看(菜单)-函数-编程-应⽤程序控制-通过引⽤调⽤,通过VI引⽤动态调⽤,可以保证VI在需要时才被装⼊内存,与静态调⽤相⽐节约了内存资源。
labview有多种动态调⽤的⽅式,从底层⽽⾔采⽤的是VI Server技术来实现的。
Labview简易程序设计1.引言本文档旨在提供关于LabVIEW简易程序设计的详细教程。
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一款流行的图形化编程语言和开发环境,用于快速开发各种控制、测量和数据采集应用程序。
通过本文档,读者将学习如何使用LabVIEW进行基本的程序设计和开发。
2.环境准备在开始使用LabVIEW进行程序设计之前,您需要准备以下环境:2.1.安装LabVIEW开发环境:并安装LabVIEW最新版本,根据操作系统选择32位或64位版本。
2.2.硬件设备:连接需要控制或采集数据的硬件设备,如传感器、运动控制器等。
2.3.了解LabVIEW界面:学习基本的LabVIEW界面元素,如面板(Front Panel)和图表(Block Diagram)等。
bVIEW基础在本章节中,将介绍LabVIEW的基本概念和基本操作:3.1.程序结构:LabVIEW程序的基本结构,包括面板和图表的布局。
3.2.数据流编程:学习LabVIEW的数据流程图编程方式,理解数据流和控制流的概念。
3.3.数据类型和变量:LabVIEW中的数据类型以及如何创建和使用变量。
3.4.控制结构:学习条件语句、循环结构和事件结构的使用方法。
3.5.函数和VI:了解LabVIEW的函数和虚拟仪器(Virtual Instrument)的概念,学习如何使用和创建自定义VI。
4.数据采集与处理本章介绍LabVIEW的数据采集与处理功能:4.1.设备驱动程序:了解如何安装和配置硬件设备的驱动程序。
4.2.仪器控制:学习如何使用LabVIEW控制仪器进行数据采集和输出控制。
4.3.数据采集:介绍如何使用LabVIEW进行数据采集,包括模拟信号和数字信号的采集。
4.4.数据处理:学习LabVIEW中常用的数据处理方法,如平滑、滤波、数字信号处理等。
5.图形界面设计本章介绍LabVIEW的图形界面设计功能:5.1.面板设计:学习如何设计具有用户交互界面的LabVIEW面板。
5.3 LabVIEW设计模式——用户接口事件处理程序(LabVIEW Design Patterns - User Interface Event Handler)版本 5创建于: 2011-1-24 下午5:42 作者jwdz - 最后修改: 2011-2-3 下午8:29 作者jwdz 在第4.3.2 节,简单的介绍了事件驱动设计模式的特点。
下面针对LabVIEW中所提供的设计模式之一用户接口事件处理程序(user interface event handler)进行讨论。
5.3.1 用户接口事件处理程序(user interface event handler)顾名思义,用户接口事件处理程序就是用来处理应用程序中的GUI事件。
也就是说,现在的GUI用户响应是通过用户接口事件处理机制来实现的。
过去,在事件处理机制没有引入之前(LabVIEW 6.1发布之前),处理这类响应通常采用的是轮询技术(包括队列)。
关于轮询与事件结构之间的优缺点前面已经谈到过,这里就不在进行相关的讨论了。
用户接口事件处理程序的设计模式比较简单,示意性的。
程序框图和前面版图参见下面。
图5.3.1-1 设计模式——用户接口事件处理程序框图图5.3.1-2 设计模式——用户接口事件处理程序前面版图通常的用户接口事件处理程序设计,有一定LabVIEW编程基础的用户基本上都能够完成这些简单的设计任务。
下面再给出几个实际应用中事件处理的例子。
例:5.3.1-1 鼠标双击事件在前面版设计中,有时候我们希望通过鼠标双击某控件来显示该控件的Context Hlep中的内容,利用事件中的鼠标双击事件就可以达到这个目的。
首先,我们用一个Numeric控件(Voltage)代替图5.3.1-2中的Command 1控件,参见下图。
图5.3.1-3 鼠标双击事件的前面版然后,设计事件驱动程序。
具体的设计步骤就不谈了,相信大家都会。
下面给出这几个事件分支处理的程序框图。
labview的事件结构的用法LabVIEW是一款强大的图形化编程软件,具备强大的数据采集和处理的能力,广泛应用于自动化、监控、控制等领域。
其中,事件结构是LabVIEW中最常见的流程控制结构之一。
本文将围绕事件结构的用法进行详细阐述。
事件结构是LabVIEW中的一种流程控制结构,它的主要功能是在某个事件发生时,执行相关的代码。
在实际应用中,事件结构通常用于响应用户的输入、硬件设备的触发等事件。
具体来说,事件结构可以分为两个主要部分:事件源和事件处理程序。
首先,需要明确的是,事件结构的建立需要先确定事件源,也称为该事件的产生者。
常见的事件源包括面板上的控件、VI的输入和输出、硬件设备和文件等。
选择合适的事件源很关键,因为它决定了事件结构的执行时机。
其次,需要编写相应的事件处理程序,即在事件发生时,要执行的程序段。
LabVIEW提供了许多已经编写好的事件处理程序,也可以根据需要编写自己的事件处理程序。
事件处理程序一般包括以下几个基本步骤:读取事件数据、执行相应的操作、更新界面或数据等。
不同类型的事件处理程序细节略有不同,但总体逻辑相似。
接下来,我们来看一下事件结构的具体用法。
1.使用事件结构实现面板控件的响应使用事件结构可以实现对面板控件的响应。
例如,我们要在按下按钮时执行某个操作,只需要在事件结构中选择该按钮控件作为事件源,然后编写相应的事件处理程序即可。
这样,只要用户按下该按钮,就会自动触发相应的事件处理程序。
2.使用事件结构实现VI的响应除了对面板控件进行响应外,事件结构还可以实现对整个VI的响应。
在新建事件结构时,可以选择VI作为事件源,然后编写响应程序。
这样,只要该VI被调用,就会自动触发相应的事件处理程序。
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中常用的几种设计模式,介绍了各种设计模式的特点及适用范围,并提供了每种设计模式对应的典型应用实例。
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会依次调用每个监听者的相应代码块,实现响应操作。
二、事件驱动编程的实现方法在LabVIEW中,实现事件驱动编程可以通过以下步骤进行:1. 创建事件处理器:首先,需要创建一个事件处理器,用来监听和响应事件。
可以通过在Block Diagram中拖拽“Event Structure”来创建一个事件结构。
2. 注册事件:在事件处理器的属性面板中,可以选择要监听的事件,并进行相应的设置。
可以选择系统事件、自定义事件等等。
3. 编写事件处理代码:在事件处理器中,可以添加相应的代码块,用来响应事件发生时的操作。
可以通过拖拽代码模块、使用已有的VIs等方式来实现。
4. 连接事件源和事件处理器:将事件源(例如用户交互控件、传感器等)和事件处理器进行连接,使得事件源可以触发相应的事件,并调用事件处理器中的代码。
5. 运行程序:当事件发生时,LabVIEW会自动调用相应的事件处理器进行处理。
三、事件驱动编程的应用场景事件驱动编程在LabVIEW中有广泛的应用场景,例如:1. 用户界面设计:可以通过事件驱动编程实现用户界面的响应,例如按钮点击、鼠标移动等操作。
LabVIEW程序设计模式(四)—状态机和事件结构的结合上两节分别解决了基本状态机的第(1~5)个问题,但是是否具备一种模式能够综合队列型状态机模式和用户界面事件型模式的优点呢?这样可以同时避免基本状态机的第(1~5)个问题。
答案是肯定的,本节将介绍如何将状态机与事件结构结合起来形成一种新的、稳定的模式。
状态机模式的基本构成元素是while 循环和case 结构,而事件结构模式的基本构成元素是while 循环和event 结构,因此新的模式应该由while 循环、case 结构和event 结构组成。
而while 循环的目的是为了保证程序的持续运行,因此必须在最外层,这样就只剩下了图20 所示的两种组合方式。
在第一种方式中,每次循环的运行需要经过一个事件结构才能够实现case 中各个分支的运行,那么到底需要多少个分支呢?一般而言不同的事件都会有不同的事件处理函数(这些函数可以在case 结构中共用),显示这是无法满足要求的,它从本质上而言仍然是一种事件结构。
在第二种方式中,程序的主体是一个状态机结构,不同的是在某一个状态分子中有一个事件结构。
我们可以回忆状态机模式中的空闲Idle 状态,这正是长时间占用CPU 资源的源头,如果在Idle 中加入一个事件结构后就有效地规避了这个问题。
图20 三种结构的组合方式因此图20 中的第二种结构综合了状态机和事件结构的优点,有效地克服了基本状态机的第(1~5)个问题。
此外,在【应用2_自动贩卖机】例程中,按钮1USD、2USD 和5USD 的作用是相同的,唯一不同的是它们的代表的币值不同。
如果我们希望系统共用币值相加这个功能,即当这三个按钮任何一个被按下后都调用同一个函数(该函数的功能是将系统中原来的货币值与新加入的币值相加得到新的值)。
这样,需要有一种途径把1USD、2USD 和5USD 代表的币值作为参数传递给函数。
图21 所示为带参数的状态机结构,在消息队列的状态机模式中,加入了一个变体型的变。
5.3 LabVIEW设计模式——用户接口事件处理程序(LabVIEW Design Patterns - User Interface Event Handler)版本 5创建于: 2011-1-24 下午5:42 作者jwdz - 最后修改: 2011-2-3 下午8:29 作者jwdz 在第4.3.2 节,简单的介绍了事件驱动设计模式的特点。
下面针对LabVIEW中所提供的设计模式之一用户接口事件处理程序(user interface event handler)进行讨论。
5.3.1 用户接口事件处理程序(user interface event handler)顾名思义,用户接口事件处理程序就是用来处理应用程序中的GUI事件。
也就是说,现在的GUI用户响应是通过用户接口事件处理机制来实现的。
过去,在事件处理机制没有引入之前(LabVIEW 6.1发布之前),处理这类响应通常采用的是轮询技术(包括队列)。
关于轮询与事件结构之间的优缺点前面已经谈到过,这里就不在进行相关的讨论了。
用户接口事件处理程序的设计模式比较简单,示意性的。
程序框图和前面版图参见下面。
图5.3.1-1 设计模式——用户接口事件处理程序框图图5.3.1-2 设计模式——用户接口事件处理程序前面版图通常的用户接口事件处理程序设计,有一定LabVIEW编程基础的用户基本上都能够完成这些简单的设计任务。
下面再给出几个实际应用中事件处理的例子。
例:5.3.1-1 鼠标双击事件在前面版设计中,有时候我们希望通过鼠标双击某控件来显示该控件的Context Hlep中的内容,利用事件中的鼠标双击事件就可以达到这个目的。
首先,我们用一个Numeric控件(Voltage)代替图5.3.1-2中的Command 1控件,参见下图。
图5.3.1-3 鼠标双击事件的前面版然后,设计事件驱动程序。
具体的设计步骤就不谈了,相信大家都会。
下面给出这几个事件分支处理的程序框图。
[0]“stop” Mouse Down 事件处理程序代码代码注释:鼠标单击“stop”控件,本程序停止运行。
[1]“Voltage” Mouse Down 事件处理程序代码图5.3.1-5 [1]“Voltage” Mouse Down 事件处理程序代码代码注释:1、创建鼠标双击事件,用鼠标右击“Event Date Node”选择》Select item》Mods》Double Click。
2、鼠标单击“Voltage” 控件,关闭Context Hlep窗口;鼠标双击“Voltage” 控件,打开Context Hlep窗口。
[2]“Pane” Mouse Down 事件处理程序代码代码注释:鼠标单击前面版的任意位置,关闭Context Hlep窗口。
例:5.3.1-2 While循环中长时间定时的迅速退出前面曾讨论过,在While循环中存在长时间定时过程中,如何快速退出While循环已经给出了多个方法,这里给出一个用事件结构来迅速退出的方法。
假如有一个定时1分钟的While循环,参见下图。
图5.3.1-7 含定时1分钟的While循环它的问题想必大家都是清楚的,按动Stop按键它不会马上停下来(最长需要两个定时周期)。
即便是按下图设计也不会马上停下来(最长需要一个定时周期)。
图5.3.1-8 利用一般的事件处理长定时的While循环实际上,可以巧妙的利用事件结构本身来处理这种情况,并且可以立刻退出长定时的While循环。
参见下图。
注:[0]Timeout[1]“Stop” Mouse Down图5.3.1-9 立刻退出长定时的While循环5.3.2 GUI接口事件处理程序(按键操作)一般的应用项目架构如下图所示(个人的喜好不同会有些差别)。
图5.3.2-1 通用应用程序基本架构下面先注解这几个vi:Top VI.vi——每个应用程序都会有一个顶级vi,程序开始运行时首先运行它。
它相当于C语言中的“Main”函数。
在这个顶级vi中程序中可以进行初始化操作,包括:用户信息输入、全局变量初始化等等。
Call_Subvi.vi——动态调用App.vi,打开、运行App.vi,然后关闭Top VI.vi(Top VI.vi退出,显示App.vi 的前面版)。
实际上是程序的控制权转交,所以在架构图中用单箭头表示。
App.vi——控制程序运行的新领导者。
这里采用事件结构处理来自[Test_1]、[Test_2]、[Test_3]、[Test_4]以及[退出测试]等按键的响应。
Call_Subvi_Do.vi——动态调用Test_1.vi(或Test_2.vi、Test_3.vi、Test_4.vi)。
其中根据按键每次只调用其中的一个,并在在该子vi运行结束后返回App.vi,进一步等待其它按键按下。
所以在架构图中用双箭头表示。
如果[退出测试]按下,整个应用程序退出。
Test_1.vi(或Test_2.vi、Test_3.vi、Test_4.vi)——不同的测试程序,每个测试程序中可能包含状态机、生产者/消费者等结构。
按照这样的思路,创建一个项目,命名为:GUI_Event_Key。
在Mac版的labview2010下,项目的结构参见下图。
图5.3.2-2 GUI_Event_Key项目结构程序的具体设计很简单这里就不谈了,后面我们会给出全部的程序代码供下载。
运行Top VI如下图所示:图5.3.2-3 Top VI的运行窗口当进度条执行满,意味着引导程序初始化完成,程序自动关闭Top VI的运行窗口(退出内存),并自动导引出App应用程序的界面,参见下图。
图5.3.2-4 App应用程序运行界面在这个界面中可以选择4个不同的测试项目(通过事件结构进行动态调用)以及退出应用程序。
每个测试程序(如:Test_1)运行完成后,都将返回图5.3.2-4 App所示的应用程序运行界面。
最终在这里退出应用程序。
这里在给出动态调用使用的两个子vi的程序框图。
请注意它们之间程序代码的不同之处。
图5.3.2-5 Call_Subvi.vi程序框图图5.3.2-6 Call_Subvi_Do.vi程序框图其它几个VI的程序框图。
图5.3.2-7 Top VI.vi程序框图图中的While循环(仅运行一次)没有任何实际意义,仅仅为了保证图形化代码分布、排列清晰。
图5.3.2-8 App.vi程序框图(事件处理)这种通过按键开关切换选择不同测试程序的方法,对于只有少量测试分支的应用程序设计是简单而有效的。
当测试项目类别多于一个,测试分支较多的的情况就显得不适用了。
解决这类问题的方法就是选择菜单形式的事件处理方式。
下载:LabVIEW8.6(GUI_Event_Key).zip5.3.3 GUI接口事件处理程序(菜单操作)GUI接口事件处理程序(菜单操作)的应用程序架构与图 5.3.2-1 通用应用程序基本架构基本相同,只是将其中的App.vi进行了一些改动,其它的子vi保持不变。
所以,本节中我们仅讨论App.vi的程序设计问题。
由于我Mac电脑上的LabVIEW好像有Bug存在,无法设计运行菜单,所以下面的程序设计是在Windows版LabVIEW2010上完成。
与上节相同,首先创建一个新的项目,名称为:GUI_Event_Menu。
然后,分别将原来GUI_Event_Key 项目中的所有vi和控件都通过下图所示的方式另存到桌面后(这样可以保证这些文件与原来的项目脱离链接关系)。
图5.3.3-1 所有vi和控件另存在桌面上进一步,重新整理这些文件并将它们拖放到新建的GUI_Event_Menu项目中。
这样新创建完成的GUI_Event_Menu项目结构如下图所示。
图5.3.3-2 GUI_Event_Menu项目结构(后面会介绍运行菜单App.rtm)下面我们就来开始设计菜单式GUI事件处理程序。
首先,打开GUI_Event_Menu.lvproj项目中的App.vi。
修改该vi的属性,选择前面版的菜单栏可视。
勾选<显示菜单栏>选项。
参见下图。
图5.3.3-3 修改App.vi的属性——勾选<显示菜单栏>现在开始设计运行菜单,打开GUI_Event_Menu.lvproj项目中的App.vi。
首先清除掉原有的按键开关Test_1至Test_4,然后选择文件栏中的“编辑”》“运行时菜单”,参见下图。
图5.3.3-4 编辑运行时菜单在上图中用鼠标点击“运行时菜单”,开发系统会弹出一个“菜单编辑器”见下图。
图5.3.3-5 菜单编辑器如何操作设计菜单,这里就不谈了。
按上图设计好菜单,关闭菜单编辑器,将App.rtm文件保存在App 文件夹下,菜单编辑完成。
运行App.vi,可以看到下图所示的界面。
可见原来的按键切换方式已经用菜单的方式来代替了。
图5.3.3-6 菜单方式的测试项目选择这种菜单方式的测试项目选择方法也是基于事件驱动的,现在按下图修改事件结构中的程序代码。
图5.3.3-7 菜单事件驱动的程序代码前面我们谈到过,程序代码的变化不大,子vi基本不用重新编写。
需要修改的仅仅是App.vi,但代码的改动量不大。
参见上图。
试运行一下程序,感觉如何?如果测试项目分类较多选择这种方式还是相对好些。
回顾本章中前面的内容,已经明显的感觉到我们完全可以进行一般的应用程序设计了。
的确,我们可以通过本节中动态调用的内容实现各程序间的连接;通过采用生产者/消费者循环在类似Test_1等测量程序中实现数据采集和分析处理。
其实,仅仅采用这些手段还是不够的。
Test_1等测量程序是否还可以进一步扩展,从而实现更灵活的测量应用程序。
答案是肯定的,通过下节所要介绍的状态机架构,我们就可以实现更复杂和更灵活的Test_1应用程序设计。