LabVIEW经典事件结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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.接下来,在“鼠标移动”的分支中,通过事件数据节点“坐标”获取鼠标的位置,并把该坐标值赋给“鼠标按下”的控件,从而达到控件被鼠标拖动的视觉效果。