第5讲 LabVIEW程序结构2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.3.1 事件结构的创建与简单示例
一个标准的事件结构由框架、超时端子、事件数据节点、递增/ 减按钮、选择器标签组成,如图4-21所示。和条件结构相似,事件结 构也可以由多层框架组成,但与条件结构不同的是,事件结构虽然每 次只能运行一个框图,但可以同时响应几个事件。
区域和分割线
图4-21 事件结构的基本构成
LABVIEW中的事件结构也是一种特殊的选择结构。 其他方式的事件可通过编程生成并与程序的不同部分进行通信。 LabVIEW支持用户界面事件和通过编程生成的事件,但不支持外部I/O 事件。
LabVIEW中的事件结构也是一种能改变数据流执行方式的一种结 构,使用事件结构可以实现用户在前面板的操作(事件)与程序执行的 互动。
5.3.4 静态事件和动态事件
事件结构分为静态和动态两种。如果只需对前面板对象进行操 作判断,使用静态事件结构就完全可以实现;但如果需要实时改变注 册内容或将程序中的数据作为事件的发生条件,将事件注册的过程限 制在一段代码内等特殊情况时就要用到动态事件结构:动态注册事件 源、动态端子连接、配置动态响应事件、在结构外部注销事件。
第五讲 LabVIEW的基本程序 结构2
5.1 程序框图禁用结构
与条件结构类似,两者的区别在于:禁用结构并非在运行时输 入分支选择条件,它执行哪一个分支是在编辑程序时就确定好 了的。
可以有多个分支,但是只有一个名为“启用”的分支,其他所 有分支都是“禁用”的,程序运行时,只运行名为“启用”的 那个分支。
件结构中处理该触发停止布尔控件。
• 如无需通过编程监视特定的前面板对象,考虑使用“等待前面板活动”函数。 • 用户界面事件仅适用于直接的用户交互。 • 避免在一个事件分支中同时使用对话框和“鼠标按下?”过滤事件。 • 避免在一个循环中放置两个事件结构。 • 使用动态注册时,确保每个事件结构均有一个“注册事件”函数。 • 使用子面板控件时,事件由含该子面板控件的顶层VI处理。 • 如需在处理当前事件的同时生成或处理其他事件,考虑使用事件回调注册函
函数发出一个事件。
程序抛出的用户自定义事件可以携带自定义的某些数据。 用户自定义事件可以作为一种规范的格式,用在VI的初始化、
终止等场合。处理VI被调用或开始运行时首先需要处理的事情 以及VI终止前必须处理的事情。
例:程序有两个输入控件:一是数值型控件A,二是字符串控件B,当A>10或B的长 度大于10个字符时,程序抛出一个用户自定义事件“警告”
用户自定义事件
LabVIEW自产的事件主要指那些由用户对界面对象进行操作的 事件,比如单击、改变某个控件的值以及程序自身状态变化等, 如果需要在程序中满足其他某种条件时也产生一个事件,就只 能用用户自定义事件了。
用户自定义事件是使用“创建用户事件”函数创建出来的事件。 当需要抛出一个用户自定义事件时,可以使用“产生用户事件”
禁用机构常用在调试程序时,与其他语言将某些代码段注释起来的 作用类似,主要用于寻找并定位错误代码。对某段程序代码有怀疑 时,可以先禁用疑似有问题的部分,以逐步定位并排除错误代码。
调试程序时,通常需要用写文件的方式记录程序运行过程中的某些 数据,但程序发布后不再需要,可以把记录数据这部分代码放置在 禁用结构中。调试时启用,发布程序时,禁用。
常被用在跨平台的程序中,使程序能够适用于不同的操作系统。
配置条件对话框
符号-列出所有可用的符号。
==/!=-列出表达式中可用的比较运算符。有效的比较是:==,指定符号 与值相等;!=,指定符号与值不相等。 值-指定所选符号的值。值区分大小写,输入必须与下列有效值相同。
条件禁用结构还可以使用项目或项目运行的目标机器所定义的符号。
事件结构和条件结构类似,区别在于:事件结构是根据发生的事件 决定执行哪一个分支中的代码;
事件发生,事件结构自动感知,不需要数据线把事件传递至事件结 构;
事件标签显示当前分支所对应的事件,事件发生时,事件结构除了 会得知是何事件发生,还会得到一些相关数据,比如事件发生的时 间、发生在哪一个控件上等,这些数据可以从事件结构左边内侧的 事件数据节点得到;
上图虚线百度文库内的程序,编写程 序时无法确定最后是否使用它,但 两种方案都需要调试。这时,应该 使用禁用结构,下图所示。
当需要运行它时,把这个分支 设为“启用”分支即可。
禁用结构会默认生成一个启用分支,需要修改一下启用分支,已保 证程序逻辑和输出数据无误。上例中,需要把文件句柄和错误数据 进出结构的隧道分别相连,才能保障后续程序得到正确的数据。
可以明显地看出,过滤型事件比相应的通知型事件要先发出。
图4-25 事件结构框架0(过滤事件)
事件 过滤 节点
决定 是否 处理 后继 事件
图4-26 事件结构框架1(通知事件)
(a)“确定”按钮动作前 (b)选择“是”的计算结果 (c)选择“否”的计算结果
图4-27 静态事件结构运行结果
5.3.3 事件结构的使用
程序运行时,禁用分支中的程序并不被生成可执行代码,因此,使 用禁用结构并不会影响程序的运行效率。而条件结构中的每一个分 支的代码都要生成可执行代码并装载在内存中。
5.2 条件禁用结构
与程序框图禁用结构类似,两者的区别在于:条件禁用结构是根据用户设定 的符号的值来判断决定执行哪个分支上的程序,类似于C语言中的#ifdef宏。
动态事件结构的创建就需要使用注册事件节点注册事件(指定 事件结构中事件的事件源和事件类型的过程称为注册事件),再将结 果输出到事件结构动态事件注册端子上。若要创建一个事件动态注册 端子,可以在事件结构框图上单击鼠标右键,在弹出的快捷菜单中选 择“显示动态事件接线端”选项即可。
图4-28 事件函数选板
由于LabVIEW是一个图形化编程界面,因此其事件处理和其他编程语言中的事 件处理有所不同。下文列出了在LabVIEW应用程序中使用事件的说明和建议。 • 确保事件结构能在任何时间处理发生的事件。 • 记得在“值改变”事件分支中读取触发布尔控件的接线端。 • 使用条件结构处理触发布尔控件的撤消操作。 • 将一个条件分支配置为处理多个通知事件的操作时,使用警告信息。 • 不要使用不同的事件数据将一个分支配置为处理多个过滤事件。 • 如包含事件结构的While循环基于触发停止布尔控件的值而终止,记住要在事
数。
• 请谨慎选择通知或过滤事件。用于处理通知事件的事件分支,并将无 法影响LabVIEW处理用户交互的方式。如要修改LabVIEW是否处理用 户交互,或LabVIEW怎样处理用户交互,可使用过滤事件。
• 不要将前面板关闭通知事件用于重要的关闭代码中,除非事先已采取 措施确保前面板关闭时VI不中止。例如,用户关闭前面板之前,确保 应用程序打开对该VI的引用。或者,可使用前面板关闭?过滤事件,该 事件在面板关闭前发生。
通常,程序不可能只需要处理一个事件,往往在程序运行中不断有需要处理的各种 事件出现,所以,事件结构通常会被放在一个while循环结构内。我们把这种一个 事件结构外套一个while循环结构的程序模式称为“循环事件结构”。
循环事件结构非常适合应用于界面编程,所以它是LabVIEW中最常见的程序模式 之一。 实例:用量表显示旋钮和转盘的和,要求: 1. 程序自动连续运行; 2. 程序显示无卡顿; 3. 占用物理资源尽量少; 4. 可随时结束运行;
主VI前面板
让子VI可以找到并控制主VI上的控件(“引用”,4字节,指向 一块数据的内存地址),主VI窗格的引用、坐标显示控件的引 用、停止按钮的引用;
在子VI中创建3个引用参数,分别指向3个引用;
子VI中注册需要处理的事件,窗格的“鼠标按下”、按钮的 “值改变”事件;
子VI中将鼠标按下的位置“告诉”主VI上的坐标显示控件(控 件的属性节点只能在本VI中使用,跨VI读写控件的属性要用控 件的引用来实现:将控件的引用传递给“编程应用程序控制 属性节点”的引用输入端,即可在属性节点下方的属性数据 接线端选择该对象的属性);
5.3.2 过滤事件和通知事件
按照事件的发出时间来区分,LabVIEW的事件可分为通知型事件 Notify Event)和过滤型事件(Filter Event)。
通知型事件是在LabVIEW处理完用户操作之后发出的,比如用户利 用键盘操作改变了一个字符串,LabVIEW 在改变了该控件的值之后,发 出一个值改变(Value Changed)通知型事件,告诉事件结构,控件的 值被改变了。如果事件结构内有处理该事件的框架,则程序转去执行该 框架。
项目浏览器“我的电脑”项的右键菜单“属性”对话框中添加属性
使用属性作为条件
5.3 事 件 结 构
所谓事件,是指对程序活动发生的异步通知。事件可以来自于用 户界面、外部I/O或其他方式。用户界面事件包括鼠标点击、键盘按键 等动作,外部I/O事件则指诸如数据采集完毕或发生错误时硬件触发器 或定时器发出信号。
有时候,用户的一个操作会使得多个事件产生源都发出某一事件, 比如在“开关”上单击,则“开关”控件和“开关”控件所在的窗 格都会发出一个“鼠标按下”事件。
与键盘相关的事件,如键按下、键释放等,只在当前被选中的控件 上产生。
与鼠标相关的事件,如鼠标按下、鼠标释放等,按照从外向里的顺 序发生。
值改变事件按照从内向外的顺序发出。
连接常量数据给“创建用户事件”函数的“用户事件数据类型”参数,常量的数据 类型就是抛出事件的事件数据类型,常量的标签是创建出来的事件的名称。
在编辑事件对话框中首先要选 择一个事件处理分支作为对象,然后 在事件源中选择合适的事件源。
编辑事件对话框中的事件列表 中放置的是选中事件源对应的所有可 能的事件名称,使用鼠标左键选择希 望的动作选项就可以为事件源创建事 件。
图4-23 编辑事件对话框
图4-24 事件结构示例
5.3.1 事件结构创建的注意事项
按照事件来源,Labview支持下列6类事件(“编辑事件” 对话框的“事件源”中)
1.应用程序,这类事件主要反映整个应用程序状态的变化,例如:程序是否关 闭,是否超时等。
事件结构中的默认事件“超时”就属于应用程序事件,如果不连接任何数据给它,默认“用 不超时”,在程序中可以传入一个表示毫秒的数值(n)给它,则每隔n毫秒,此事件会自动运 行超时处理分支中的代码;
2.本<VI>,这类事件反映当前VI状态的改变。例如:当前VI是否被关闭,是否 选择了菜单中的某一项等等。 3.动态事件(Dynamic),用于处理用户自己定义的或在程序中临时生成的事 件。 4. 窗格,包括与某一窗格有关的事件,比如鼠标进入离开窗格等。 5.分割栏,包括与分割栏先关的事件,比如鼠标拖动分割栏等。 6.控件,最常用的一种事件,用于处理某个控件状态的改变。例如,控件值的 改变,或者鼠标键盘的操作。
超时端子用来设定超时时间,其接入数据是以毫秒为单位的整 数值。-1为关闭超时事件。
事件数据节点由若干个事件数据端子构成,数据端子的增减可 以通过拖拉事件数据节点来进行,也可以通过单击鼠标右键从弹出的 快捷菜单中选择“添加/删除元素”选项进行。
事件结构同样支持隧道。
图4-22 添加事件分支
先在前面板 上放置控件, 然后,事件 源会自动把 它作为选项 列出。
注册事件节点可以注册两种 事件:LabVIEW自产事件和 用户自定义事件,前者包括 前述6类事件。
动态事件注册过程: 1、获得对象的引用,引用输 入到“注册事件”节点。 2、“注册事件”节点输出接 到动态端子上。 3、配置”动态事件“。 4、在结构外,加入”取消注 册事件“节点。
实例:编写一个VI,在VI的面板上单击时,显示出鼠标所在的坐标,但所有的事件 需要在一个子VI中处理。
过滤型事件是在 LabVIEW 处理用户操作之前发出的,并等待相对应 的事件框架执行完成之后,LabVIEW 再处理该用户操作。这类事件的名 称之后都有一个问号。例如键盘按下?事件(Key Down? Event),当 用户处理该事件时,控件的值还没有被改变,因此,用户可以在该事件 对应的事件框架内决定是否让 LabVIEW先处理该事件,或改变键盘按下 的值之后再让LabVIEW继续处理该事件。