首页 理论教育LabVIEW2012中文版虚拟仪器:通知事件结构工作原理

LabVIEW2012中文版虚拟仪器:通知事件结构工作原理

【摘要】:通知事件用于在事件发生且LabVIEW已对事件处理后对事件作出响应。事件发生时,LabVIEW会将该事件的副本发送到每个并行处理该事件的事件结构。在过滤事件的事件结构分支中,可在LabVIEW结束处理该事件之前验证或改变事件数据,或完全放弃该事件以防止数据的改变影响到VI。但LabVIEW将按自然顺序将过滤事件发送给为该事件所配置的每个事件结构。在LabVIEW能够通知下一个事件结构之前,每个事件结构必须执行完该事件的所有事件分支。

在讲解事件结构前,先介绍一下事件的有关内容。首先,什么是事件?事件是对活动发生的异步通知。事件可以来自于用户界面、外部I/O或程序的其他部分。用户界面事件包括鼠标单击、键盘按键等动作。外部I/O事件则诸如数据采集完毕或发生错误时硬件定时器触发器发出信号。其他类型的事件可通过编程生成并与程序的不同部分通讯。LabVIEW支持用户界面事件和通过编程生成的事件,但不支持外部I/O事件。

在由事件驱动的程序中,系统中发生的事件将直接影响执行流程。与此相反,过程式程序按预定的自然顺序执行。事件驱动程序通常包含一个循环,该循环等待事件的发生并执行代码来响应事件,然后不断重复以等待下一个事件的发生。程序如何响应事件取决于为该事件所编写的代码。事件驱动程序的执行顺序取决于具体所发生的事件及事件发生的顺序。程序的某些部分可能因其所处理的事件的频繁发生而频繁执行,而其他部分也可能由于相应事件从未发生而根本不执行。

另外,使用时间结构的原因是因为在LabVIEW中使用用户界面事件可使前面板的用户操作与程序框图执行保持同步。事件允许用户每当执行某个特定操作时执行特定的事件处理分支。如果没有事件,程序框图必须在一个循环中轮询前面板对象的状态以检查有否发生任何变化。轮询前面板对象需要较多的CPU时间,且如果执行太快则可能检测不到变化。通过事件响应特定的用户操作则不必轮询前面板即可确定用户执行了何种操作。LabVIEW将在指定的交互发生时主动通知程序框图。事件不仅可减少程序对CPU的需求、简化程序框图代码,还可以保证程序框图对用户的所有交互都能作出响应。

使用编程生成的事件,可在程序中不存在数据流依赖关系的不同部分间进行通讯。通过编程产生的事件具有许多与用户界面事件相同的优点,并且可共享相同的事件处理代码,从而更易于实现高级结构,如使用事件的队列式状态机

事件结构是一种多选择结构,能同时响应多个事件,传统的选择结构没有这个能力,只能一次接受并响应一个选择。事件结构位于函数选板的结构子选板上。

事件结构的工作原理就像具有内置等待通知函数的条件结构。事件结构可包含多个分支,一个分支即一个独立的事件处理程序。一个分支配置可处理一个或多个事件,但每次只能发生这些事件中的一个事件。事件结构执行时,将等待一个之前指定事件的发生,待该事件发生后即执行事件相应的条件分支。一个事件处理完毕后,事件结构的执行亦告完成。事件结构并不通过循环来处理多个事件。与“等待通知”函数相同,事件结构也会在等待事件通知的过程中超时。发生这种情况时,将执行特定的超时分支。

事件结构由超时端子,事件结构节点和事件选择标签组成,如图5-39所示。

超时端子用于设定事件结构在等待指定事件发生时的超时时间,以毫秒为单位。当值为-1时,事件结构处于永远等待状态,直到指定的事件发生为止。当值为一个大于0的整数时,时间结构会等待相应的时间,当事件在指定的时间内发生时,事件接受并响应该事件,若超过指定的时间,事件没发生,则事件会停止执行,并返回一个超时事件。通常情况下,应当为事件结构指定一个超时时间,否则事件结构将一直处于等待状态。

事件结构节点由若干个事件数据端子组成,增减数据端子可通过拖拉事件结构节点来进行,也可以在事件结构节点上单击右键选添加或删除元素来进行。事件选择标签用于标识当前显示的子框图所处理的事件源,其增减与层叠式顺序结构和选择结构中的增减类似。

与条件结构一样,事件结构也支持隧道。但在默认状态下,无须为每个分支中的事件结构输出隧道连线。所有未连线的隧道的数据类型将使用默认值。右键单击隧道,从快捷菜单中取消选择未连线时使用默认可恢复至默认的条件结构行为,即所有条件结构的隧道必须要连线。

对于事件结构,无论是编辑还是添加或是复制等操作,都会使用的编辑事件对话框。编辑对话框的建立,可以通过在事件结构的边框上点右键,从中选择编辑本分支所处理的事件,如图5-40所示。

如图5-41所示,为一个编辑事件对话框。每个事件分支都可以配置为多个事件,当这些事件中有一个发生时,对应的事件分支代码都会得到执行。事件说明符的每一行都是一个配置好的事件,每行分为左右两部分,左边列出事件源,右边列出该事件源产生事件的名称,如图5-41中分支2只指定了一个事件,事件源是<本VI>,事件名称是键按下。

978-7-111-40983-0-Chapter05-41.jpg

图5-39 事件结构框图

978-7-111-40983-0-Chapter05-42.jpg

图5-40 创建编辑事件对话框(www.chuimin.cn)

978-7-111-40983-0-Chapter05-43.jpg

图5-41 编辑事件对话框

事件结构能够响应的事件有两种类型:通知事件和过滤事件。在编辑事件对话框的事件列表中,通知事件左边为绿色箭头,过滤事件左边为红色箭头。通知事件用于通知程序代码某个用户界面事件发生了,过滤事件用来控制用户界面的操作。

通知事件表明某个用户操作已经发生,如用户改变了控件的值。通知事件用于在事件发生且LabVIEW已对事件处理后对事件作出响应。可配置一个或多个事件结构对一个对象上同一通知事件作出响应。事件发生时,LabVIEW会将该事件的副本发送到每个并行处理该事件的事件结构。

过滤事件将通知用户LabVIEW在处理事件之前已由用户执行了某个操作,以便用户就程序如何与用户界面的交互作出响应进行自定义。使用过滤事件参与事件处理可能会覆盖事件的默认行为。在过滤事件的事件结构分支中,可在LabVIEW结束处理该事件之前验证或改变事件数据,或完全放弃该事件以防止数据的改变影响到VI。例如,将一个事件结构配置为放弃前面板关闭事件可防止用户关闭VI的前面板。过滤事件的名称以问号结束,如“前面板关闭?”,以便与通知事件区分。多数过滤事件都有相关的同名通知事件,但没有问号。该事件是在过滤事件之后,如没有事件分支放弃该事件时由LabVIEW产生。

同通知事件一样,对于一个对象上同一个通知事件,可配置任意数量与其响应的事件结构。但LabVIEW将按自然顺序将过滤事件发送给为该事件所配置的每个事件结构。LabVIEW向每个事件结构发送该事件的顺序取决于这些事件的注册顺序。在LabVIEW能够通知下一个事件结构之前,每个事件结构必须执行完该事件的所有事件分支。如果某个事件结构改变了事件数据,LabVIEW会将改变后的值传递到整个过程中的每个事件结构。如果某个事件结构放弃了事件,LabVIEW便不把该事件传递给其他事件结构。只有当所有已配置的事件结构处理完事件,且未放弃任何事件时,LabVIEW才能完成对触发事件的用户操作的处理。

建议仅在希望参与处理用户操作时使用过滤事件,过滤事件可以是放弃事件或修改事件数据。如仅需知道用户执行的某一特定操作,应使用通知事件。

处理过滤事件的事件结构分支有一个事件过滤节点。可将新的数据值连接至这些接线端以改变事件数据。如果不对某一数据项连线,那么该数据项将保持不变。可将真值连接至“放弃?”接线端以完全放弃某个事件。

事件结构中的单个分支不能同时处理通知事件和过滤事件。一个分支可处理多个通知事件,但仅当所有事件数据项完全相同时才能处理多个过滤事件。

图5-42和图5-43给出了包含两种事件处理的代码示例,可以通过此例来进一步了解事件结构,如图5-42对于分支0,在编辑事件结构对话框内,响应了数值控件上“键按下?”的过滤事件,用假常量连接了“?放弃”,这使得通知事件键按下得以顺利生成,若将真常量连接了“?放弃”,则表示完全放弃了这个事件,则通知事件上的键按下不会产生,如图5-43对于分支1,用于处理通知事件键按下,处理代码弹出内容为“通知事件”的消息框。图中While循环接入了一个假常量,所以循环只进行一次就退出,这样,键按下事件实际并没得到处理。若连接真常量,则执行。

978-7-111-40983-0-Chapter05-44.jpg

图5-42 过滤事件

978-7-111-40983-0-Chapter05-45.jpg

图5-43 通知事件