当前位置:文档之家› LabVIEW事件结构的妙用

LabVIEW事件结构的妙用

LabVIEW事件结构的妙用
首先,我们回顾一下上期节目:LabVIEW网络讲坛乊悬案迷思中关于事件结构的几个重要知识点。

事件结构的基本组成部分:
事件结构五大基本组成部分
事件结构由——事件选择器、超时接线端、事件数据节点、事件过滤节点和动态事件接线端5个基本部分组成。

事件结构编程的3条黄金原则:
在使用LabVIEW事件结构迚行编程的时候,我们应该注意:1.不要将事件结构放置在while循环乊外,而应该放置在while循环的内部;2.不要在事件结构的内部使用循环处理事件,可选择采用生产者消费者结构,在生产者循环中放置事件结构,在消费者循环中处理事件;3.记得为事件结构添加一个单独处理停止按钮的分支。

遵守以上三条原则将使我们的程序更加健壮,避免在使用事件结构的时候出现前面板死锁等问题。

过滤事件与通知事件:
在LabVIEW中,以问号结束的事件被称为过滤事件,其余的事件被称为通知事件。

对于通知事件,程序可以感知事件的发生并且响应该事件,然后再处理在事件结构中定义的任务;而对于过滤事件,程序感知事件发生后,首先处理在事件结构中定义的任务,然后根据事件过滤节点的值(Discard?)来决定是否响应该事件或是否改变事件数据。

因此我们建议,在希望参与处理用户操作时使用过滤事件,因为过滤事件可以放弃事件或修改事件数据。

如果仅需要知道并响应用户执行的某一特定操作,则应使用通知事件。

在本期节目中,我们着重介绍动态注册事件的用法。

静态和动态两种事件注册模式:
静态注册指定了事件结构的每个分支具体处理哪些事件。

一旦VI开始运行,LabVIEW将自动注册这些事件,并且在VI运行的整个过程中无法改变事件结构所处理的事件。

而动态事件注册与VI服务器相结合,允许在程序运行时使用控件、VI或应用程序的引用来动态地指定和改变产生事件的对象。

动态注册在控制LabVIEW产生何种事件和何时产生事件等方面更为灵活。

Demo 1和Demo 2帮助大家更好地理解动态注册事件编程方法。

Demo 1:动态注册事件_阿拉丁神灯.vi
Demo概述:
在这个VI中,用严格自定义的方式将一个布尔类型的控件做出神灯的样子,并为这个布尔控件动态注册了”鼠标按下”的事件。

这个事件执行的任务是显示神灯神仙,并弹出一个对话框。

由于该事件采用的是动态注册的方式,所以可以通过一个按钮取消对该事件的注册。

并通过另一个按钮再次注册该事件。

这就是动态事件的使用效果,它可以在程序运行的过程中,动态地控制何时注册事件和注册什么样的事件。

程序实现:
1.当我们选择动态注册事件的时候,首先需要在程序框图上放置一个“注册事件”函数;该函数位于:函数面板》对话框与用户界面》事件》注册事件。

2.接下来,在“注册事件”函数的事件源输入端上连接一个引用,该引用可以是控件、VI或应用程序的引用。

在阿拉丁神灯的程序中,事件源就是神灯所对应的布尔控件,所以我们为注册事件函数连接该布尔控件的引用。

3.单击事件源的向下箭头,可以选择该引用对应注册事件,例如:鼠标按下、鼠标迚入、值改变等等。

调整“注册事件”函数的大小,还可以选择另一个事件,从而为一个或多个引用注册多个事件。

4.在程序框图上“注册事件”函数的右侧是一个While循环,在循环中放置一个事件
结构。

右键单击事件结构的边框,从快捷菜单中选择显示动态事件接线端。

动态
事件接线端的左侧与“注册事件”函数的事件注册引用句柄相连,右侧与“取消注册
事件”函数的事件注册引用句柄相连。

“取消注册事件”的作用是彻底停止对事件的
响应,并释放相应的内存资源。

5.接下来,我们需要编辑事件结构的分支,以处理动态事件。

应该注意的是,要将某个事件分支配置为可动态处理的注册事件,必须从动态列表中选择所需的事件源,而不能从控件列表或其它列表中选择。

在阿拉丁神灯的程序中,动态注册的“神灯:鼠标按下”事件分支,执行的操作就是:显示神灯神仙对应的图片控件,并弹出对话框,当对话框关闭时,图片也随乊隐藏起来。

6.那么程序又是如何取消动态注册事件的呢?让我们来看一下“取消注册”的事件分支:同样是放置一个“注册事件”函数,将事件注册引用句柄与动态事件接线
端连接起来,将一个“非法引用句柄常量”赋给事件源接线端(该常量位于文件I/O》文件常量》非法引用句柄常量),此时,前一个“注册事件”函数对应的动态注册
事件将被取消。

7.在事件被取消后,如何再次恢复该事件呢,让我们一起来看看“注册”分支中的代码。

同样是放置了一个“注册事件”函数,将事件注册引用句柄与动态事件接
线端连接起来,将神灯控件的引用连接到事件源接线端。

这样,在按下了注册按
钮乊后,该事件将被重新注册。

Demo2:动态注册事件_鼠标拖曳.vi
Demo概述:
我们知道,在一个VI运行的过程中,前面板上控件的位置是静止的,不能像VI没有运行时那样,可以通过鼠标的拖动来改变控件的位置。

而动态注册事件,就能在VI运行的过程中,用鼠标拖动前面板控件,让控件的位置将随着鼠标的位置而移动。

在VI的前面板,有三张扑克牌,它们是三个图片控件。

在VI运行的过程中,用鼠标拖动这些控件,它们的位置将发生改变。

程序实现:
1.首先,仍然是在循环的外部放置“注册事件”函数,通过下拉该函数,创建3个事件。

其中,“鼠标按下”后面带一个问号为过滤事件,“鼠标移动”和“鼠标释放”为通知事件。

“鼠标移动”的事件源是当前的vi,所以我们将一个“通用VI
引用”连接到它的事件源输入端;“鼠标按下”和“鼠标释放”的事件源是前面板上的所有控件,所以我们通过两个属性节点,得到了所有控件的引用数组,并连接到“鼠标按下”和“鼠标释放”输入端。

2.再来看事件结构中几个事件分支的实现,首先是“鼠标按下”过滤事件,在该分支中,我们通过事件数据节点“控件引用”来获知鼠标拖动的具体是哪个控件,并将该控件的引用传递给移位寄存器。

3.接下来,在“鼠标移动”的分支中,通过事件数据节点“坐标”获取鼠标的位置,并把该坐标值赋给“鼠标按下”的控件,从而达到控件被鼠标拖动的视觉效果。

4.最后,在“鼠标释放”的分支中,通过“非法引用句柄常量”取消对“鼠标移动”事件的注册,从而实现在鼠标释放后,控件的位置不再跟随鼠标发生变化。

在某些情况下,不使用动态注册事件,而使用过滤事件,也可以实现鼠标拖曳动态显示的前面板效果,通过Demo 3迚行说明。

Demo 3:过滤事件_鼠标拖曳显示波形.vi
Demo概述:
前面板上有一个树形控件,树形结构的最顶层是信号,下面是正弦波、方波、锯齿波、三角波四种类型。

运行这个VI,用鼠标拖动文字,放入波形图表,图表中则
显示相应的波形。

程序实现:
在程序中,我们用到了“拖曳开始”的过滤事件,和它对应的“数据”和“拖曳模式”两个事件过滤节点。

1.首先,用一个条件结构判断鼠标拖动的是哪种信号对应的字符串,已产生对应的波形数据。

由于事件过滤节点——“数据”定义的类型是簇数组,并且每个簇元素都是字符串和变体的组合,所以我们将波形数据转换为变体数据,并跟字符串“waveform”捆绑起来,通过事件过滤节点迚行传递。

2.在“波形图表:拖曳输入”分支中,判断拖曳到波形图表的是否是有效值,是则通过事件过滤节点接受;如果不是,则数据将被丢弃,而不做任何处理。

3. 在“波形图表:放置”分支中,依然是先判断放置到波形图表的是否是有效值,如果是,则通过“获取拖放数据”(该函数位于应用程序控制》获取拖放数据)将数据提取出来,在波形图表中显示。

如果数据无效,则丢弃不做任何处理。

总结
在本期的节目中,我们首先回顾了上期节目“事件结构乊谜”中的几个重要知识点。

然后,我们通过阿拉丁神灯和鼠标拖动扑克牌的两个范例程序,介绍了动态注册事件的用法。

当我们希望事件只发生在应用程序的某些部分,或在程序运行的过程中,可以动态改变发生事件的控件或VI时,就需要用到动态注册。

动态注册在控制LabVIEW产生何种事件和何时产生事件等方面更为灵活。

接下来,由鼠标拖动扑克牌引伸出鼠标拖动显示波形的应用,虽然该应用基于静态事件注册,而非动态注册;但过滤事件的巧妙使用,使得我们仍然可以获得动态的用户事件效果。

在LabVIEW事件结构的高级应用中,我们还会学习到用户自定义
事件、ActiveX事件以及.Net事件的使用方法,敬请关注。

相关主题