注册事件(用户自定义事件)
在使用事件结构时有木有人发现这样一个选项,右键事件框弹出菜单中有一项"Show Dynamic Event Terminals"如下图。如果我们选中该项后于是在事件框的左右两侧出现了下图红色框框里的图标,这个图标做什么用的呢?这就是事件结构的又一功能:注册事件,该功能对应的函数在Dialog & User Interface>>Events,如图。
有人有要问了注册事件是个什么东东?用过事件结构一般都知道触发事件的方式为值改变、鼠标各种动作、菜单操作等,基本上只能在同一个VI内触发事件。假如用户想自己定义一些类型的事件需要通过程序触发或者在不同VI内触发事件、传递数据该怎么办呢?于是注册事件这个功能就诞生了。这个功能怎么用呢,简单介绍一下,前面板有Stop控件,为程序添加停止事件大家都已经会了,现在换一种添加方式。在Block Diagram面板上右键Stop控件创建一个引用,如下图。
在前面所说事件函数中拖出"注册事件"节点,将引用连至输入端,然后点击Event选择一事件如下图,我们选择Value Change。
将注册事件节点的输入连至事件结构上左侧的那个图标,然后添加事件如下图,
操作完成后完整程序框图如下,我们看下与以往创建的事件有什么不同,下图红框处事件的名字不同了,stop被<>框住了,这就代表了该事件为注册事件。运行下程序,点击Stop按钮,小试一下。
有人说了,这和直接创建个Stop事件有啥区别呢,浪费时间。下面怎么利用注册事件进行程序触发自己定义事件或者在不同VI内触发事件呢?这就要用到Event函数中的第二行的几个函数:Create User Event、Generate User Event、Destroy User Event 。Create User Event 函数说明如下,输入user event data type为用户自定义类型数据,这里我们定义的数据类型为簇,簇元素为字符串和变体,如图字符串Name代表事件名称用来区分自定义事件,变体Data用来传送数据。
我们将该函数连接至注册事件节点并创建该注册事件,如下图,该事件的名称会以你自定义数据变量的名称来命名,在事件框左侧就会有我们自定义的数据变量的名称,当有用户事件触发时可以直接引用事件名和数据。
用户事件创建好了,那我们该怎么来使用呢?加入我们有多个自定义事件,怎么区分呢?事件区分就是通过前面定义数据中的Name来区分,加一个Case框来选择执行不同代码。
举个简单的例子:每100ms产生一个大小0~10范围内的随机数,其中当随机数介于2~5之间的时候计数一加1,介于7~9之间的时候计数器二加一,怎么实现?于是有人说了我用一个While循环就能实现了!的确While可以实现而且代码简单,但是我们这里利用注册事件来实现,简单介绍一下用户自定义事件的运行机制。好了,首先我们将用户自定义事件进行定义,题目中有2个事件:1.计数器一加1;2.计数器二加1;我们定义为Counter1、Counter2.在用户事件内添加一个Case框并将2个事件名输入
Case内,即Case:Counter1执行计数器一加1,Case:Counter2执行计数器二加1。并将加1的程序代码填入,应用移位寄存器的方法来实现,相信大家都可以完成。
我们编写一个产生介于0~10的随机数,以及2~5、7~9范围判断的程序。接下来就是怎么来发送这两个计数命令的事件了,这就有赖于函数Generate User Event了,当判断随机数在指定范围内时就通过该函数触发2个计数事件,每个Generate的输入数据中Name对应一个事件名称,由于没有数据传递,变体Data为空。好了程序完成了。做事要有始有终,编写代码亦是一样,系统资源被你打开了,使用结束时要记得关闭哟。这时就应用到了 Unregistere for event 和Destroy user event函数了。完整程序框图如下:
程序触发事件就结束了,那两个或多个VI之间触发事件怎么弄呢,很简单,你把上图下边那个循环变成个子VI不就实现了吗!所以不同VI之间数据传递、事件触发只要将用户事件引用进行传递后,在利用Generate User Event来触发事件,一切问题不就迎刃而解了。
附件传了一个我自己封装的用户事件使用类,其实
labview也自带这个,只是每次用的时候都要手动去寻找文件路径,索性自己做了个,功能基本上差不多。使用方法也很简单,只不过是把那几个函数封装了一下,引用传递类型变成了Class。上面的程序用我封装的类编写的话,程序如下:
好了,事件结构到此就结束了,希望对大家有些帮助。
10