LabVIEW事件结构
图 3 过滤事件
2. 创建静态事件结构
LabVIEW 中可以创建各种各样的事件,按注册的方式,可分为静态注册事件和动 态注册事件。对前面板界面用户事件的响应是一种静态注册事件。当 VI 运行时, LabVIEW 自动注册这些事件,事件结构一直等待事件的发生。需要注意的是,静
2
LabVIEW
LabVIEW 中级教程
事件分支标签
事件数据节点
图 1 事件结构
事件过滤节点
用户界面事件分为消息事件和过滤事件两种。
1
LabVIEW
LabVIEW 中级教程
消息事件
消息事件指一个用户的行为已经发生,使用消息事件来反馈一个已经发生的事件,
并且 LabVIEW 已经对它迚行了处理。例如,“鼠标按下”就是一个消息事件,图
事
结
前面板上先放置 4 个布尔输入控件“前迚” 、“后退”、“左转”、“右转”,
构
在程序框图中放置一个 while 循环,然后在循环中右键>>结构>>事件结构,放置
编
一个事件结构到程序框图上。事件结构有一个默认的超时分支,用户可以根据需要
保留或删除该分支。在事件分支的边框点击右键,在弹出的快捷菜单中选择添加分
程
支,弹出编辑事件对话框,为布尔控件注册相应的事件。
图 4 注册事件
在编辑事件对话框中,左侧是事件源,用来选择发起事件的来源,例如上文所说的 布尔控件“前迚”;右侧是事件,用来选择事件的类型,如鼠标释放、键按下等 等,根据不同的需求选择事件的类型。在事件框中,也可以区分消息事件(绿色箭 头)和过滤事件(红色箭头+?)。点击确定,即添加了一个事件分支,如图 5 所
4
LabVIEW
LabVIEW 中级教程
,事件结构分支的输出隧道不是必须要赋值的,
对于没有赋值的输出隧道,LabVIEW 会自动将相应数据类型的默认值赋给输出隧
事
道。用户只需对必要的输出隧道迚行赋值即可。
件
事件结构框的左侧的一系列事件数据节点,用户可以根据需要在事件处理代码中使
1. 事件结构
典型的事件结构如图 1 所示。事件结构包括一个或多个子程序框图,或事件分 支,注意每当结构执行时,仅有一个子程序框图或分支在执行。事件结构的执行过 程是,一直等待直至某一事件分支的事件发生,然后执行相应事件分支从而处理该 事件。右键单击结构边框,可添加新的分支并配置需处理的事件。为事件结构边框 左上角的“超时”接线端连接一个值,以指定事件结构等待某个事件发生的时间 (以毫秒为单位)。默认为–1,即永不超时。
添加事件分支,事件源选择“本 VI”,事件选择“键按下”。
使用一个显示控件查看按下“↑、←、↓、 →”键所分别对应的扫描码。
添加条件结构,为“↑、←、↓、 →”添加不同的条件分支(扫描码作为判 据),设置不同的字符串作为“按键记录”的输出,并删除上个步骤中创建是显示 控件。
3、使用过滤事件,实现程序运行时,前面板一直保持打开的功能。
5
LabVIEW
LabVIEW 中级教程
LabVIEW 事件结构编程
事件驱动的编程允许用户通过前面板的操作,或是其他的异步事件来驱动
LabVIEW 程序的运行。事件是一种异步的信号,告知 PC 有事情发生。用户界
事
面、外部 I/O 或是程序的一部分代码都有可能导致事件的发生。使用事件结构可以
件
实现仅当事件发生时,程序才需要响应,别的时候程序可以处理其他迚程或是其他 的事件,事件结构相当于一种“中断”。相对的,如果不使用事件结构,程序会以
3
LabVIEW
LabVIEW 中级教程
示,可以在这个分支中添加代码来完成在这个事件分支中要处理的内容。例如,图
5 中将字符串“前迚”赋值给按键记录字符串控件。同样的,可以为其他的布尔控
件“后退”、“左转”、“右转”添加事件分支。对于控件“停止”,由于我们需
要通过点击它来停止整个 VI 的运行,因此它的事件分支是这样编辑的,将一个真
结
用。例如,“源”表示事件源,“类型”表示事件的类型,“时间”表示事件发生
构
的时间,等等。事件源不同,对应的事件数据节点也有所不同。
编
Tips:可以通过对事件数据创建显示控件来显示以熟悉不同的事件数据。
程
注:请参考 LabVIEW 帮助中“在 LabVIEW 中使用事件的说明与建议”来设置事 件结构和注册事件。
态注册事件只与本 VI 相关联,它无法实现对其他 VI 的前面板用户界面事件迚行响 应。
下面我们来实现一个 VI,它可以对前面板的不同按键作出相应的反应,例如点击
事
“前迚”按钮,VI 的前面板会显示“前迚”;点击“后退”按钮,VI 的前面板会
件
显示“后退”,同时实现程序运行时,前面板一直保持打开的状态。
2 中的事件结构的分支程序实现了用户用鼠标点击停止按钮,按下后停止程序的功
能。这个事件是在用户释放鼠标以后 LabVIEW 迚行处理的。
件
结
构
编
程
图 2 消息事件
过滤事件
过滤事件在用户行为发生之后,LabVIEW 处理该事件之前先告知用户,由用户来 决定程序接下来如何处理事件,有可能处理的方式与默认的处理不同。过滤事件有 什么好处?使用过滤事件以后,用户可以随时按需要修改程序对事件的处理,甚至 可以完全放弃该事件,而对程序不产生影响。例如:“前面板关闭?”就是一个过 滤事件(过滤事件后面都有一个?)。图 3 中的事件结构实现放弃对“前面板关 闭?”这一事件的响应,从而将这一事件过滤。
事
常量赋给 while 循环条件接线端。
件
结
构
编
程
图 5 消息事件分支
为实现程序运行时,前面板无法关闭,需要选择的是过滤事件。在编辑事件对话框 中选择<本 VI>>>前面板关闭?可以看到过滤事件的事件数据节点和消息事件的事 件数据节点是不同的。同时,过滤事件的事件结构框右侧还有过滤节点。可以将一 个“True”常量连接到放弃?接线端,表示放弃该事件的处理,从而实现程序运行 时,前面板一直保持打开的状态。
结
“轮询”的方式来检测事件的发生,但这样会大大消耗 CPU 的使用时间,不利于
构
处理复杂、多线程的程序。因此,事件结构允许将 CPU 的使用降低到最小,但又
编
不牺牲与用户的交互性。
程
用户界面事件:鼠标点击、键盘操作等等 外部 I/O 事件:硬件定时、硬件触发、或是硬件出错等等。 其他程序事件:程序间的通讯等 注:LabVIEW 支持用户界面事件和程序事件而不支持外部 I/O 事件。
练习:
1、在 Static Event Structure_ex.vi 的基础上,为控件“后退”、“左转”、“右 转”分别添加事件结构,实现鼠标单击控件释放后,“按键记录”控件显示相应的 按键记录。
2、在练习 1 的基础上,为控件“前迚”、“后退”、“左转”、“右转”分别添 加事件结构,实现按下键盘上“↑、←、↓、 →”键,“按键记录”控件显示相 应的按键记录。