LabVIEW事件结构
- 格式:pdf
- 大小:296.60 KB
- 文档页数:5
LabVIEW事件结构2011-01-12 15:30:57| 分类:硬件学习 | 标签:测量 vi 菜单事件例图|字号订阅使用LabVIEW图形化语言开发的应用程序界面是图形化用户操作界面,也称为:GUI (graphical user interface),它的作用是与操作者实现人机对话形式的互动操作。
这种对界面操作的互动响应在LabVIEW 6.1发布之前,只能通过“轮询(polling)”的方式来实现。
轮询的方式的缺点是:需占用一定的CPU资源(在没有事件发生时)和灵活性不好。
在LabVIEW6.1引入事件结构(Event Structure)后,采用事件结构来设计、实现的GUI操作则变得更加灵活、方便,并且不占用CPU的资源,这与先前采用轮询的方式来查询事件的方式相比要合理的多。
下面结合应用项目中的设计实例来介绍GUI设计中的事件驱动。
有关事件结构的一些基本概念、原理及使用方法在LabVIEW Help及许多书中都作了详细的讲解,这里我就不作更多地介绍了。
事件结构通常包括以下部分:1、Event cases——包含有若干个注册的事件源及同等数目的Event case层,在每个Event case层中包含对该事件响应的处理程序。
2、While循环——用来检测连续不断产生的事件事件结构中的While循环,是用来确保检测到连续不断发生的事件。
如果没有这个While循环,无论有多少事件发生只能对第一个发生的事件进行处理,处理完后程序将退出事件结构。
—————————————————————————————————————————菜单选项事件结构实例Agilent VT1415A是C尺寸、单槽寄存器基VXI模块,可以提供64个通道的多功能输入/输出的闭环控制功能。
第1步、创建一个项目:综合参数测量仪按照我的设计习惯,首先在桌面上创建一个新的文件夹,命名为《综合参数测量仪》。
然后,打开、运行LabVIEW开发环境,并选择开发环境中的:新建》项目。
labview控制程序流程——labview事件结构1 事件结构及它的图形化表示法事件被用来通知用户有异步活动发生。
图形化语言的事件响应包括:用户界面事件、外部I/O 事件和程序其它部分的事件。
对事件的处理程序也被称为:事件驱动程序。
事件驱动程序可以分为若干个分支,每个分支处理不同的事件响应。
所以对事件的响应结果也可以控制程序的流程。
事件驱动机制来自于可视化的操系统,可视化操作系统对用户事件提供了简洁、有效的响应方式,最常见的事件来自于鼠标和键盘。
虚拟仪器借助于操作系统的事件处理机制实现了图形化语言的事件响应能力。
在没有引入事件结构之前,LabVIEW 是借助于轮询的方式来查询用户操作,由于轮询的方式会占用一定的CPU 资源,甚至可能遗漏事件,所以这种处理方式并非理想。
事件结构的出现避免了对CPU 资源的占用,同时也避免了事件的遗漏。
事件结构在函数选板》编程》结构子选板中可以找到,并可以将其直接拖拽到程序框图中,图形化表示的事件结构,参见下图。
图 1 图形化的事件结构与Case 结构和循环结构类似,事件结构也包含了一个主框架,这个框架内将用来放置事件处理的事件驱动程序代码。
如果事件处理任务众多,会有众多事件分支存在,在结构上类似Case 的多帧结构(选择器标签)。
当在程序框图上拖放一个事件结构时,我们只能看到上图所示的一帧已经预先注册的超时事件(Timeout),超时事件分支。
它具有定时延迟的基本功能(不包括While 循环),参见下图。
图 2 具有定时延迟的基本功能当然也可以采用另一种表示方法,参见下图。
图 3 利用事件结构内部节点获得中止时间通过这个例子也好理解内部节点中时间的含义(是事件响应的停止时间)。
超时事件超时事件是一种特殊的事件,当然也可以看成是默认的事件分支。
如果存在其它事件源时,超时事件完全可以被忽略或取消。
看下面一个例子。
图 4 仅有的两个事件之一超时事。
LabVIEW经典结构——组合动作执行模型
在LabVIEW应用程序开发中,广泛使用了一种高效的程序结构——组合动作执行模型。
该模型由While、Evnet(事件)、For、Case、enum(枚举)等向种结构和数据类型构成。
执行机理:面向对象的事件结构,响应前面板发生的针对控件的鼠标、键盘的动作,产生事件,并输出一个枚举数组,该数组作为For循环执行的索引,同时数组元素定义了执行的Case。
将各种事件响应进行分解为基本的动作单元,利用枚举数组定义出若干个由动作单元组合而成的动作序列,依据控件事件选择执行枚举数组,顺序完成对应的动作单元。
模型特点:重复利用各基本动作单元,增加代码复用率,程序更加简洁。
通过新建事件,可以定义任意组合的动作序列,灵活高效。
具有很强的模块化设计思想。
图1组合动作执行模型。
labview事件结构使用方法在LabVIEW中,事件结构是一种可以按照事件的发生改变程序流程的数据结构,可以通过人机互动或者事件干预的方式产生事件驱动,在LabVIEW中是一种常用的数据结构,下面我就来讲解一下其具体的使用方法。
一、事件结构的使用目的在LabVIEW中一个重要的概念就是数据流,我们在编程的时候可以来设置某些事件来对数据流进行干预,比如说单击鼠标产生事件,按下键盘按键等,这些都可以被当作为事件结构的条件,进而实现对程序的控制。
二、事件结构的创建方法1.在程序窗口中的空白处单击鼠标右键,在弹出的函数选板中选择<结构>子选板,然后再选择<事件结构>并将其拖到程序框图中即可。
2.最基本的事件结构是由<程序框架>、<子框图标识符>和<事件数据节点>组成。
3.在刚创建事件结构时,会自动的创建一个<超时端口>,<超时端口>用于连接一个数值指定等待事件的毫秒数,如果超过设定的时间没有发生事件的话,程序就会产生一个超时事件。
4.<事件数据节点>用于访问事件的数据值,可以单击节点中的数据项,然后在弹出的菜单中,选择<选择项>,可以进行选择访问哪个事件数据的成员。
5.在事件结构的边框上单击鼠标右键,在弹出的菜单中选择<添加事件分支>,即可完成子框图的添加。
三、对事件进行编辑1.换到要进行编辑的子框图中,在边框上单击鼠标右键,在弹出的快捷菜单中选择<编辑本分支所处理的事件>选项,打开<编辑事件>对话框。
2.在<编辑事件>界面中可以对相应的事件源和事件进行定义,在左侧的<事件说明符>下面点击<添加事件>或者<删除>即可相应的改变事件数量。
在<事件源>和<事件>两个子窗口中分别选中相应的对象,左侧的<事件说明符>下面就会出现两者的组合,点击<确定>,此子事件框图就可以完成编辑。
labview学习——⽣产者消费者(数据)(事件)其主要的模型:主要从以下⼏个⽅⾯理解:1、可重⼊性正常的labview是多线程设计语⾔,⽽我们在执⾏VI时的规则是通过VI的命名来分别调⽤实现的。
打开VI的Highlight调试⼯具,可以看出两个Wait.vi实例的调⽤并不是同时执⾏的,⽽是依次按顺序执⾏的,⾄于哪⼀个实例先执⾏是不确定的。
这是由于LabVIEW本⾝是并⾏设计的,从理论上⽽⾔,两个VI的实例是同步执⾏的,但是如果两个Wait.vi实例同时执⾏必定会产⽣参数赋值紊乱,因为LabVIEW只允许内存中存在⼀个名称的VI。
如果在⼀个顺序结构⾥要同时进⾏两个vi的调⽤,采⽤的⽅法是单击ctrl+I,在新点出来的对话框中选择执⾏框⾥边的可重⼊选择Reentrant execution,这样的话再次运⾏上述实例⽤时长为并⾏执⾏的时间。
事实上,LabVIEW的可重⼊技术相当于在原有VI的基础上产⽣了⼀个相同的副本,打开Wait.vi从标题栏可以看出VI的名称为Wait.vi:1(clone)。
同理这是由于LabVIEW中不允许内存中的VI存在同名,VI的可重⼊技术相当于产⽣了与原VI具有同样功能的新VI并且修改了该VI的命名。
在实际应⽤中,需要根据情况决定是否设置VI的可重⼊属性,灵活使⽤。
并不是需要将所有的VI都设置为可重⼊,那将占据⼤量的内存资源。
2、动态调⽤通常调⽤⼦VI有两种⽅法,⼀种是静态调⽤,直接在控制板⾥选择⼦VI的⽅法,即编译⽣成可执⾏程序后,⼦VI的代码将会被静态链接到可执⾏程序中另⼀种就是动态调⽤,指的是通过程序调⽤另⼀个程序的运⾏、停⽌、赋值和获取值。
通过程序框图-查看(菜单)-函数-编程-应⽤程序控制-通过引⽤调⽤,通过VI引⽤动态调⽤,可以保证VI在需要时才被装⼊内存,与静态调⽤相⽐节约了内存资源。
labview有多种动态调⽤的⽅式,从底层⽽⾔采⽤的是VI Server技术来实现的。
事件结构阮奇桢Event Structure 也是一种选择结构,程序根据发生的事件决定执行哪一个页面的程序。
此时,LabVIEW 的界面编写与Visual Basic 的界面程序有些类似。
一. 按照产出源来区分事件的种类按照事件的产生源来区分,LabVIEW有以下几种事件:图1:配置事件1.应用程序事件(<Application>),这类事件主要反映整个应用程序状态的变化,例如:程序是否关闭,是否超时等。
2.VI事件(<This VI>),这类事件反映当前VI状态的改变。
例如:当前VI是否被关闭,是否选择了菜单中的某一项等等。
3.动态事件(Dynamic),用于处理用户自己定义的或在程序中临时生成的事件。
4.区域事件(Pane)和分割线事件(Splitter)是LabVIEW 8中新添加的特性。
LabVIEW 8中,用户可以把一个VI的前面板分割成几份,这两类事件用来处理用户对某个区域或区域分割线的状态的改变。
图2:面板上划分区域5.控件事件(Control)是最常用的一种事件,用于处理某个控件状态的改变。
例如,控件值的改变,或者鼠标键盘的操作。
打开上述的“edit events”框,只要选定了某一个事件产生源,其相应的所有事件均排列在右侧events框中。
有时候,多个事件产生源会对同一个用户操作分别产生相应事件。
比如在某一控件上按下鼠标,区域事件和控件事件都会发出鼠标按下(Mouse Down)事件。
LabVIEW 按以下规则顺序产生不同的事件:键盘相关的事件(Key Down, Key Up, etc.)只在当前选中(Key Focused)的控件上产生;鼠标相关的事件(Mouse Down, etc.)按照从外向里的顺序发出。
例如,区域的鼠标按下事件先于控件的鼠标按下事件发出;结构的鼠标按下事件先于先于结构内控件的鼠标按下事件发出。
值改变事件按照从内向外的顺序发出。
LabVIEW技巧系列(一)——事件结构
事件结构,是LV编程结构的精髓所在。
它类似于单片机的中断功能,优
点在于不占用CPU资源。
比如按键按下串口发送数据,以及设置键盘快捷键
等等功能,事件结构比查询结构要节省很多系统资源。
下面我介绍一下利用事件结构的关键点,基础的自己去看帮助吧。
1,关于事件结构超时连线的问题:事件结构有一个超时事件的输入,当不连接时代表永不超时。
这点要十分注意,因为有时候你的事件就够会和其他结构放在一个while循环里,比如下图:
我们理想的情况是,其他服务程序正常循环运行(小灯闪烁),而鼠标按下后,处理事件结构。
但是如果这样写的话,由于事件结构永不超时,while循
环只会运行一次,只有当鼠标按键按下后,才会开始第二次循环。
这个程序的运行结果是,按一下鼠标,小灯变化一次。
要解决这个问题有两个办法:一个是给事件结构的延时输入处添加延时时间,比如5ms,这样循环就会5ms运行一次,不会影响其他服务程序的正常运行。
二个就是把其他服务程序放到另外一个while循环中,事件结构单独一个循环。
个人建议选择第二个方法。
2,关于事件结构软触发的问题:前面板有一个按钮,按下后触发很简单,
也很常用。
不过有时候要涉及到软触发的问题,就是利用程序(而不是前面板的控件)去触发一个事件。
先看下面这个例子:
“服务程序”软件改变软触发的值,我们的理想目标是,每次改变服务程序的
值为真时,标志小灯会改变一次。
但是实际程序运行结果是,无论按多少次,小灯都不变。
因为直接赋值只能改变变量的值,而不能引起次变量的事件触发。
Labview【事件结构】
帮助⽂档
1.简单程序例⼦
单击确定,计数加⼀。
单击停⽌,程序停⽌执⾏。
运⾏结果:
2.步骤
创建while循环,添加循环终⽌条件端⼦,添加定时器;检测是否单击了确定按钮;
添加事件结构,给超时端⼦赋值,超时事件中不⽤编辑程序:表⽰超时后不执⾏任何操作;
事件结构框右键“添加事件分⽀”:
选择事件源与事件:
在事件列表中选择事件分⽀进⾏编辑:
值加⼀操作:
给计数值赋初值0,应⽤顺序结构,⼀帧⼀帧的执⾏;
3.创建计数值局部变量⽅法
变量使程序在多个地⽅对同⼀个控件进⾏读写操作。
法⼀:直接右键创建
法⼆:函数选板局部变量
列表选择:。
labview的事件结构的用法
LabVIEW的事件结构是一种特殊的程序结构,它可以让程序在等待用户输入或系统事件时暂停执行,直到事件发生后再继续执行。
事件可以是用户交互、数据输入、系统消息等,都可以被事件结构捕捉。
使用事件结构可以增强程序的交互性和灵活性,使程序能够更好地响应用户操作和外部事件。
事件结构包含一个或多个事件框,每个事件框都可以捕捉一个特定类型的事件。
当事件发生时,事件结构会自动跳转到相应的事件框,执行相应的代码,然后等待下一个事件的到来。
事件结构还可以设置超时时间,当等待事件的时间超过设定的超时时间时,事件结构会自动退出等待状态,进行下一步操作。
LabVIEW的事件结构还支持多个事件的并发处理,不同的事件框可以同时处于等待状态,当事件发生时,相应的事件框会立即响应,执行相应的代码,而不影响其他事件框的等待状态。
在LabVIEW中,事件结构可以用于各种应用场合,比如图形界面、数据采集、通信等。
通过事件结构,程序可以更好地与用户交互,响应外部事件,增强程序的实用性和可靠性。
- 1 -。
LabVIEW事件结构编程事件驱动的编程允许用户通过前面板的操作,或是其他的异步事件来驱动LabVIEW程序的运行。
事件是一种异步的信号,告知PC有事情发生。
用户界面、外部I/O或是程序的一部分代码都有可能导致事件的发生。
使用事件结构可以实现仅当事件发生时,程序才需要响应,别的时候程序可以处理其他迚程或是其他的事件,事件结构相当于一种“中断”。
相对的,如果不使用事件结构,程序会以“轮询”的方式来检测事件的发生,但这样会大大消耗CPU的使用时间,不利于处理复杂、多线程的程序。
因此,事件结构允许将CPU的使用降低到最小,但又不牺牲与用户的交互性。
用户界面事件:鼠标点击、键盘操作等等外部I/O 事件:硬件定时、硬件触发、或是硬件出错等等。
其他程序事件:程序间的通讯等注:LabVIEW支持用户界面事件和程序事件而不支持外部I/O事件。
1. 事件结构典型的事件结构如图1所示。
事件结构包括一个或多个子程序框图,或事件分支,注意每当结构执行时,仅有一个子程序框图或分支在执行。
事件结构的执行过程是,一直等待直至某一事件分支的事件发生,然后执行相应事件分支从而处理该事件。
右键单击结构边框,可添加新的分支并配置需处理的事件。
为事件结构边框左上角的“超时”接线端连接一个值,以指定事件结构等待某个事件发生的时间(以毫秒为单位)。
默认为–1,即永不超时。
图 1事件结构用户界面事件分为消息事件和过滤事件两种。
a.消息事件消息事件指一个用户的行为已经发生,使用消息事件来反馈一个已经发生的事件,并且LabVIEW已经对它迚行了处理。
例如,“鼠标按下”就是一个消息事件,图2中的事件结构的分支程序实现了用户用鼠标点击停止按钮,按下后停止程序的功能。
这个事件是在用户释放鼠标以后LabVIEW迚行处理的。
图 2 消息事件b.过滤事件过滤事件在用户行为发生之后,LabVIEW处理该事件之前先告知用户,由用户来决定程序接下来如何处理事件,有可能处理的方式与默认的处理不同。
LabVIEW设计模式汇总本文归纳了LabVIEW中常用的几种设计模式,介绍了各种设计模式的特点及适用范围,并提供了每种设计模式对应的典型应用实例。
1 标准状态机1.1简介状态机(State Machine)是编程中经典的设计模式之一。
状态机对系统所有可能的状态进行罗列,在每个状态分支中执行该状态的代码,并指明系统要执行的下一个状态。
状态机能清晰和准确地完成与状态密切相关的任务。
1.2结构图1-1为典型的标准状态机结构。
系统包含“Initialize”,“Idle”,“Case1”,“Case2”,“Stop”五个状态;系统可以在“Initialize”中初始化系统参数,在“Idle”中专门做状态选择处理,“Case1”和“Case2”为用户自定义的状态分支,“Stop”状态使系统停止运行。
图1-1 标准状态机结构1.3要点(1)状态枚举常量该枚举常量包含了系统所有可能的状态,每次可以选择一个指定的状态。
(2)带移位寄存器的while循环状态机通过while循环上的移位寄存器传递下一个要执行的状态,每次循环只能执行一个条件分支。
(3)条件结构该条件结构的每个分支对应一个系统的可能的运行状态。
Tips:●可以将枚举常量设计为自定义控件类型。
当系统状态需要修改时,只需要修改一次“自定义控件”即可更新整个程序中所有的枚举常量。
●将枚举常量连接到条件结构的选择器接线端后,右击条件结构边框,选择“为每个值添加分支”,可以轻松地为条件结构实现分支配置。
1.4实例(1)情景:使用温度监控系统监测当前温度,当温度超过高温阈值时发出“高温警报”,当温度低于冷冻阈值时发出“冷冻警报”。
(2)代码:详见附件中的“标准状态机”项目文件。
图1-2 前面板设计图1-3 程序框图设计1.5小结标准状态的应用非常广泛,它的特点是:(1)系统的所有状态和转换条件都是可以提前预期设定的,而不是随机产生的;(2)系统一次只能执行一个状态,不适合做并行任务处理。
LabVIEW 事件结构
郑重声明
本课程视频来源于National Instruments公司《LabVIEW网络讲坛》系列,链接地址:/china/labviewtips,针对视频的内容已经得到NI公司的授权。
请按照下列步骤学习本课程:
1.收看LabVIEW事件结构教学视频
点击收看
2.查看相关资源(包括技术白皮书、Demo程序等)
3.完成课后练习
课后练习
1.关于事件结构的超时接线端的说明,正确的是:
A.以毫秒为单位,到达指定时间后结束事件结构
B.以毫秒为单位,到达指定时间后,执行时间结构中的TimeOut分支
C.以秒为单位,到达指定时间后结束事件结构
D.以秒为单位,到达指定时间后,执行时间结构中的TimeOut分支
2.事件结构正在执行某事件分支的同时,又产生了其他的事件,程序会如何执行?
A.产生冲突,直接退出前面执行的事件,并返回错误;
B.产生冲突,直接退出前面执行的事件,并立即响应后面产生的事件;
C.不产生冲突,继续执行前面的事件直到结束,忽略后面的事件;
D.不产生冲突,缓存后面的事件,直到前面的事件执行完成,继续执行后面的事件;
3.注册事件的事件源包括哪些?
A.控件引用
B.前面板控件
C.VI引用
D.用户事件
4.判断题:事件结构的每个分支只能创建一个事件源。
labview从⼊门到出家4--⽤事件结构实现运算功能使⽤事件结构可以快速定位响应界⾯的操作事件,如按下,拖动,双击的事件。
基本上我们所要实现的所有功能,都可以通过条件结构+事件结构去实现,⽐如后⾯进阶篇将会讲到的状态机就是通过条件结构和事件结构组成的。
⼀个好的状态机可以帮助我们搭建⼀个好的程序框架,这将⾮常有利于我们以后写⼀些⼤型程序。
在此前,我们先⽤之前的加减乘除运算熟悉⼀下事件结构。
1、同样的,按上⼀章节的操作,或者直接拷贝上⼀章的程序。
新建⼯程->新建calc主VI->新建⼦VI,这⾥把主VI打回原型,把之前的条件结构减掉(其实就是⽤事件结构代替⾥⾯的条件结构,但只是介绍事件结构的使⽤,不是说事件结构可以取代条件结构)。
2、添加事件结构我们可以看到事件结构的第⼀个默认事件是超时事件(⽬前只有⼀个事件),左上⾓那个沙漏状的是超时时间设定,相当于单⽚机⾥⾯的定时中断,我们后⾯可以右键新建⼀个数值常量⽤于设定超时时间。
如果没设定超时时间,则在没有其他事件产⽣或触发前,整个while循环就卡在超时事件这边等待超时事件的发⽣,因为没有设定超时时间,所以程序⼀直等待,不响应事件之外的其他操作。
只有⼀个超时事件3、添加“布尔”按键的事件,⿏标移到事件结构上⽅的事件显⽰图标,右键选择“添加事件分⽀”。
选择布尔,选择值改变,点击确定就添加了我们的布尔按键的事件了。
⿏标点击事件结构上⽅的⿊下三⾓,显⽰有超时和布尔值改变两个事件分⽀,我们选中布尔值改变的事件分⽀,在该分⽀添加相关的程序逻辑。
4、将上⼀次章条件结构中的程序直接拷贝或者重新编写⾄事件分⽀中5、运⾏程序试⼀下功能(后⾯会出⼀章讲程序调试操作,我们到时候可以⽤调试⼯具查看事件功能的响应情况)。
我们发现基本功能和上⼀章的⼀致,但是会发现⼀个问题,点击退出按键的时候界⾯不响应退出的功能。
这时因为while循环中我们添加的是事件结构,也就是程序只有识别到事件发⽣时,才会执⾏⼀次while循环,没事件发⽣的话,则不会运⾏其他操作,也就不响应按键的执⾏了。