LabVIEW中的动态事件

描述

众所周知:LabVIEW中的事件结构可以响应用户操作,并且它会根据发生的事件来决定执行不同事件分支。当发生某个事件时,事件结构会自动捕获,并自动执行对应代码。

使用事件结构克服了以前轮询方式结构的缺点,可以让我们的代码更加高效,极大提升了界面处理的运行效率,同时也降低了CPU占用,提高了用户使用体验。但有时候事件结构中已有的事件种类并不能完全满足我们的需求,这时候应该怎么办呢?其实动态事件就是为此而生,开发人员可以通过自定义注册和使用动态事件,满足各种特殊情况下的事件响应需求。

接下来请大家跟随小编一起学习LabVIEW事件结构以及动态事件的使用!

本文分享:

LabVIEW动态事件

一、 事件结构介绍

事件结构和条件结构比较类似,它们都是通过满足某个条件来选择执行其对应分支代码的一种结构;区别在于条件结构是根据条件接线端的选择来决定执行对应的分支,而事件结构则是根据发生的事件来决定执行对应的分支。

事件结构可以自动捕获所发生的事件,并根据事件选择执行不同的事件分支。事件结构正上方内侧的事件标签可以显示当前分支所对应的事件,除此之外,事件结构还可以捕获有关该事件的一些相关数据,比如事件发生的时间、事件源、类型等。

cpu

二、 事件分类

事件可以根据事件产生的源来区分,LabVIEW中的事件可以分为六大类,它们分别是:<应用程序>、<本VI>、<窗格>、<分隔栏>、<控件>以及<动态>。这六类事件可以在“编辑事件”对话框的“事件源”这一栏中看到,而每一个事件源中对应的具体事件可以在“事件”栏中看到,如下图所示:

cpu

<应用程序>

这类事件主要反映整个应用程序状态的变化,例如程序是否关闭,书签信息是否有改动,是否超时等。事件结构中默认的超时分支就是该类事件。

cpu

<本VI>

这类事件主要反映当前VI状态的改变,例如前面板大小以及状态、鼠标、键盘对本VI的操作状态、是否选择了本VI菜单项中的某一个等。

cpu

<窗格>

这类事件包括与前面板中某一窗格有关的事件,比如鼠标进入/离开某一个窗格。一般情况下一个VI的前面板都是默认只有一个窗格,但是如果前面板上使用了“分隔栏”那就可以将一个VI的前面板分隔为多个窗格。每个窗格都可以理解为新的且互相独立的前面板,可以用来放置不同类型的控件。

cpu

<分隔栏>

这类事件主要包括与分隔栏有关的事件,比如鼠标在分隔栏上点击/释放等。分隔栏可以用来划分VI前面板的不同功能区域,让我们的界面设计和布局更加美观且条理分明。

cpu

<动态>

这类事件用于处理在程序中临时注册的事件或者用户自定义的事件,在未注册动态事件之前,该事件源为灰色不可选状态,下面本文将详细介绍动态事件。

cpu

二、 动态事件

概述:

动态事件可以分为两种,一种是由LabVIEW本身可以产生的动态事件,比如前面介绍的除了动态事件以外的其他五种分类的事件(也就是说这五种事件可以被注册成为动态事件),还有一种是由用户自己定义的动态事件。

动态事件相关的函数在程序框图面板>>编程>>对话框与用户界面>>事件中。接下来我们先了解一下事件子程序框图中的这些节点。

cpu

所有动态事件在使用之前都需要先注册事件,它的含义其实是将动态事件注册到事件结构中,即声明该动态事件将在这个事件结构中响应。两种动态事件都可以使用“注册事件”节点来注册,注意在程序结束后需要使用“取消注册事件”来关闭注册事件引用句柄。

在使用用户自定义的动态事件时需要先使用“创建用户事件”创建该动态事件,然后再使用“注册事件”将该动态事件注册到一个事件结构中,在需要触发事件的地方使用“产生用户事件”来让事件结构响应该事件,在程序不需要再次响应用户事件时使用“销毁用户事件”来销毁用户事件引用句柄,释放用户事件引用。所有注册为该用户事件的事件结构不再接收该事件。

LabVIEW自产生动态事件:

事件分类中提到的除了“动态”事件之外的那五类静态事件都可以被注册为LabVIEW自产生的动态事件,区别就是静态事件只能是本VI中对象产生的,而动态事件却可以在一个VI中使用其他VI中的对象产生的事件。

设想一个场景:在一个大型项目中,往往会使用大量的子VI,一般情况下我们会有一个VI专门用来响应事件操作,而这个VI经常必须要处理其他VI的控件产生的事件,但是这个控件很明显并不在这个VI中,所以在这个VI的事件结构编辑事件的对话框中是没办法找到这个控件的,LabVIEW中为了应对这种状况专门设计了动态事件。

在注册动态事件时,需要先为产生这个事件的对象(控件、窗格、分隔栏等)创建一个引用,然后将该引用连线至“注册事件”的事件源输入接线端,随后将“注册事件”生成的“注册事件引用句柄”连线至事件结构的“动态事件接线端”完成事件的注册,如下图所示:

cpu

cpu

上图中的程序框图是子VI的程序框图,一共注册了两个动态事件,一个是主VI窗格的鼠标移动事件,另一个是主VI中“停止”按钮的值改变事件。 这两个事件注册完成后可以在这个事件结构的编辑事件对话框<动态>一栏找到并编辑使用。 上图中前面板为主VI的前面板,功能是在“鼠标坐标”中实时跟随并刷新鼠标在前面板中的位置坐标,按下停止按钮后响应并停止程序运行(示例代码会在后面给出)。

cpu用户事件:

假设需要在程序中,在满足其它某种条件时也产生一个事件,而这个条件不是LabVIEW自产生的(如用户按了某个按钮、改变某个控件值等),这时就可以考虑用户自定义事件了。

用户自定义事件灵活性较高,可以让用户自己设计什么时候发生并执行什么事件代码,使用用户事件时需要先定义一个用户事件数据类型,就像建立消息队列时需要定义队列元素的数据类型一样,用户事件数据类型可以是LabVIEW支持的任意数据类型。

和LabVIEW自产生动态事件相同的是创建用户事件之后同样需要在一个事件结构中注册该事件,不同的是事件什么时候发生、在哪个VI中发生我们都是可以自定义的,只需要拿到创建用户事件后的输出句柄使用“产生用户事件”产生一次该事件。

下面这个示例是模拟一个温度采集VI和显示界面VI之间的交互,温度采集VI采集到温度信息后使用用户事件的方式传递给显示界面VI去做对应的处理,显示当前报警信息并且当温度太高时LED灯报警(示例代码会在后面给出)。

cpu

示例中注册了两个用户事件,一个是“温度报警”事件,一个是“停止程序”事件。 注册用户事件时有个小技巧就是可以将你要注册的所有用户事件输出句柄捆绑到一个簇中,然后使用“注册事件”节点直接注册这个簇,这样可以方便同时注册多个事件。

cpu以上就是关于LabVIEW动态事件的知识分享啦。 本文的演示代码及安装包已存入百度网盘,有需要的小伙伴可以自行取用,演示代码请使用LabVIEW 2020及以后版本打开。

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
jf_30195590 2023-08-02
0 回复 举报
网盘连接在哪里 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分