事件结构,是labview编程结构的精髓所在。它类似于单片机的中断功能,优点在于不占用CPU资源。比如按键按下串口发送数据,以及设置键盘快捷键等等功能,事件结构比查询结构要节省很多系统资源。下面我介绍一下利用事件结构的关键点,基础的自己去看帮助吧。
1,关于事件结构超时连线的问题:事件结构有一个超时事件的输入,当不连接时代表永不超时。这点要十分注意,因为有时候你的事件就够会和其他结构放在一个while循环里,比如下图:
我们理想的情况是,其他服务程序正常循环运行(小灯闪烁),而鼠标按下后,处理事件结构。但是如果这样写的话,由于事件结构永不超时,while循环只会运行一次,只有当鼠标按键按下后,才会开始第二次循环。这个程序的运行结果是,按一下鼠标,小灯变化一次。
要解决这个问题有两个办法:一个是给事件结构的延时输入处添加延时时间,比如5ms,这样循环就会5ms运行一次,不会影响其他服务程序的正常运行。二个就是把其他服务程序放到另外一个while循环中,事件结构单独一个循环。个人建议选择第二个方法。
2,关于事件结构软触发的问题:前面板有一个按钮,按下后触发很简单,也很常用。不过有时候要涉及到软触发的问题,就是利用程序(而不是前面板的控件)去触发一个事件。先看下面这个例子:
"服务程序"软件改变“软触发”的值,我们的理想目标是,每次改变服务程序的值为真时,标志小灯会改变一次。但是实际程序运行结果是,无论按多少次,小灯都不变。因为直接赋值只能改变变量的值,而不能引起次变量的事件触发。
解决办法就是:要软件触发事件,必须对变量右键->创建->属性节点->值(信号)进行赋值,这样才能触发事件结构。例如下图:
(事件结构设置时要把锁定前面板勾掉)程序运行结果:当“服务程序”弹起时,小灯不变,但是事件会一直触发,用高亮模式可以看见,连续两次给“软触发”赋F,事件同样会触发,换句话说,只要赋值,就会触发事件,而不是值改变才会触发。所以在事件结构里加了一个条件结构。当“服务程序”按下时,不停的给“软触发”赋T,事件结构不停运行,小灯闪烁。
再次强调,事件结构是labview的精髓,用好事件结构是编写复杂程序的基础。
labview事件大致可以分为三部分:用户界面、外部I/O、程序的其他部分:
接下来举一个例子:
上面的程序,如果选择波形,则进入事件结构,处理波形,至此事件结构执行完毕,在改变波形,由于事件结构不在循环里,则不会再次触发事件。
一个很好的解决方法是将事件结构放在循环里面,循环的次数由事件发生的次数决定。如下图:
循环结构工作原理:若事件并不发生,循环也不再继续,无法检测循环条件,只有当事件发生后,循环继续时,才会检测到循环条件端子,停止程序。
一般这种情况,我们往往在事件结构中添加“结束”或者是“停止”按钮,方便用事件结束整个程序的运行。
另外值得注意的是,尽量不要把循环嵌套在事件结构中,一旦这样做了,会产生生产者消费者循环,导致事件触发以后,循环一直在执行,无法响应其他事件。
下面再举一个例子说明:
其中事件0是超时,在这个程序中,一旦点击开始处理,则计数器开始计数,无论怎么点击其他按钮程序都不会响应。如果高亮执行程序,你会发现程序一直在内层循环里面。究其原因,可以右击事件,编辑本事件所处理的分支,发现有一项“锁定前面板”被勾选了,因此在事件循环中的执行没有结束之前,无论如何触发前面板控件,都是无效的,取消勾选则可以解决这个问题。
附上三个例程:链接:https://pan.baidu.com/s/1eyuyBZYXlqQl-MV1EAIc6w 密码:qonn
三个程序的前面板和程序框图完全相同,但运行结果不完全一样。如果你运行”007 事件结构中的循环1.vi“和”008 事件结构中的循环2.vi",你会很抓狂,运行"009 事件结构中的循环1.vi",你会获得意外惊喜。
程序操作步骤是:
1、运行程序,点击“开始处理”,计数器和指示灯会不断变化;
2、点击“结束处理”,计数器和指示灯会停止变化;
3、点击“退出系统”,VI退出。
(区别在于事件的编辑设置上,是否锁定前面板,2个事件都是如此)
综上所述,事件结构最好放在循环结构中,但是循环结构最好不要放在事件结构中。另外动态事件注册也是灵活运用事件结构的一种方法,有兴趣可以再深入了解一下,有时间会仔细研究一下总结一篇博客。
参考资料:http://bbs.elecfans.com/jishu_370514_1_1.html