LABVIEW 中的事件结构杂谈

合集下载

第4章—条件结构、顺序结构、公式节点和事件结构

第4章—条件结构、顺序结构、公式节点和事件结构

49
4.4.4. 事件结构边框上弹出的快捷菜单:
书:P123
50
4.4.5. “编辑事件”对话框:
具体介绍详
选择器标签
书:P114 图6-15 增量按钮
减量按钮
分支选择器
在该分支下执行的 框图程序
条件结构有一个或多个子框图。每个子框图都是一个执行分支, 每一个执行分支都有自己的选择器标签。执行条件结构时,与接入分 9 支选择器数据相匹配的标签对应的框图得到执行。
与C语言Switch语句相比,LabVIEW的选择结构更加灵活。 分支选择器端子的值可以为以下四种:布尔型、整型、字符串型 或者枚举型。
20
4.1.5
条件结构应用举例
目的:求一个数的平方根,若该数≥0,计算该值平方根 并将计算结果输出;若该数<0时,则用弹出式对话框报告 错误,同时输出错误代码“-999.99”。
应该如何写程序?
21
程序框图:
22
运行结果:
23
§4.2 顺序结构
在VI中,程序的运行是靠数据流来驱动的,利用数据流 机制可以实现很多顺序执行的功能。但是只有数据流控制的 顺序执行还不够,在某些复杂的情况下,需要更强的顺序执 行控制结构。引入了“顺序结构”的概念。
对于情况B:执行……
计算表达式值
……. 其他:执行……
...
语句1
语句2
语句n
语句n+1
表达式值= <常量表达式1> 时该开关合上,执行语句1
7
4.1.1 条件结构框图的创建:
创建:在函数选板编程结构中选择“条件结构”, 在程序框图上按住鼠标左键拖出条件结构框图,然 后将在该条件下执行的程序放入相应的条件结构框 图内。

labview控制程序流程——labview事件结构

labview控制程序流程——labview事件结构

labview控制程序流程——labview事件结构1 事件结构及它的图形化表示法事件被用来通知用户有异步活动发生。

图形化语言的事件响应包括:用户界面事件、外部I/O 事件和程序其它部分的事件。

对事件的处理程序也被称为:事件驱动程序。

事件驱动程序可以分为若干个分支,每个分支处理不同的事件响应。

所以对事件的响应结果也可以控制程序的流程。

事件驱动机制来自于可视化的操系统,可视化操作系统对用户事件提供了简洁、有效的响应方式,最常见的事件来自于鼠标和键盘。

虚拟仪器借助于操作系统的事件处理机制实现了图形化语言的事件响应能力。

在没有引入事件结构之前,LabVIEW 是借助于轮询的方式来查询用户操作,由于轮询的方式会占用一定的CPU 资源,甚至可能遗漏事件,所以这种处理方式并非理想。

事件结构的出现避免了对CPU 资源的占用,同时也避免了事件的遗漏。

事件结构在函数选板》编程》结构子选板中可以找到,并可以将其直接拖拽到程序框图中,图形化表示的事件结构,参见下图。

图 1 图形化的事件结构与Case 结构和循环结构类似,事件结构也包含了一个主框架,这个框架内将用来放置事件处理的事件驱动程序代码。

如果事件处理任务众多,会有众多事件分支存在,在结构上类似Case 的多帧结构(选择器标签)。

当在程序框图上拖放一个事件结构时,我们只能看到上图所示的一帧已经预先注册的超时事件(Timeout),超时事件分支。

它具有定时延迟的基本功能(不包括While 循环),参见下图。

图 2 具有定时延迟的基本功能当然也可以采用另一种表示方法,参见下图。

图 3 利用事件结构内部节点获得中止时间通过这个例子也好理解内部节点中时间的含义(是事件响应的停止时间)。

超时事件超时事件是一种特殊的事件,当然也可以看成是默认的事件分支。

如果存在其它事件源时,超时事件完全可以被忽略或取消。

看下面一个例子。

图 4 仅有的两个事件之一超时事。

labview事件结构使用方法

labview事件结构使用方法

labview事件结构使用方法在LabVIEW中,事件结构是一种可以按照事件的发生改变程序流程的数据结构,可以通过人机互动或者事件干预的方式产生事件驱动,在LabVIEW中是一种常用的数据结构,下面我就来讲解一下其具体的使用方法。

一、事件结构的使用目的在LabVIEW中一个重要的概念就是数据流,我们在编程的时候可以来设置某些事件来对数据流进行干预,比如说单击鼠标产生事件,按下键盘按键等,这些都可以被当作为事件结构的条件,进而实现对程序的控制。

二、事件结构的创建方法1.在程序窗口中的空白处单击鼠标右键,在弹出的函数选板中选择<结构>子选板,然后再选择<事件结构>并将其拖到程序框图中即可。

2.最基本的事件结构是由<程序框架>、<子框图标识符>和<事件数据节点>组成。

3.在刚创建事件结构时,会自动的创建一个<超时端口>,<超时端口>用于连接一个数值指定等待事件的毫秒数,如果超过设定的时间没有发生事件的话,程序就会产生一个超时事件。

4.<事件数据节点>用于访问事件的数据值,可以单击节点中的数据项,然后在弹出的菜单中,选择<选择项>,可以进行选择访问哪个事件数据的成员。

5.在事件结构的边框上单击鼠标右键,在弹出的菜单中选择<添加事件分支>,即可完成子框图的添加。

三、对事件进行编辑1.换到要进行编辑的子框图中,在边框上单击鼠标右键,在弹出的快捷菜单中选择<编辑本分支所处理的事件>选项,打开<编辑事件>对话框。

2.在<编辑事件>界面中可以对相应的事件源和事件进行定义,在左侧的<事件说明符>下面点击<添加事件>或者<删除>即可相应的改变事件数量。

在<事件源>和<事件>两个子窗口中分别选中相应的对象,左侧的<事件说明符>下面就会出现两者的组合,点击<确定>,此子事件框图就可以完成编辑。

第5讲 LabVIEW程序结构2

第5讲 LabVIEW程序结构2

用户自定义事件
LabVIEW自产的事件主要指那些由用户对界面对象进行操作的 事件,比如单击、改变某个控件的值以及程序自身状态变化等, 如果需要在程序中满足其他某种条件时也产生一个事件,就只 能用用户自定义事件了。
用户自定义事件是使用“创建用户事件”函数创建出来的事件。 当需要抛出一个用户自定义事件时,可以使用“产生用户事件”
数。
• 请谨慎选择通知或过滤事件。用于处理通知事件的事件分支,并将无 法影响LabVIEW处理用户交互的方式。如要修改LabVIEW是否处理用 户交互,或LabVIEW怎样处理用户交互,可使用过滤事件。
• 不要将前面板关闭通知事件用于重要的关闭代码中,除非事先已采取 措施确保前面板关闭时VI不中止。例如,用户关闭前面板之前,确保 应用程序打开对该VI的引用。或者,可使用前面板关闭?过滤事件,该 事件在面板关闭前发生。
函数发出一个事件。
程序抛出的用户自定义事件可以携带自定义的某些数据。 用户自定义事件可以作为一种规范的格式,用在VI的初始化、
终止等场合。处理VI被调用或开始运行时首先需要处理的事情 以及VI终止前必须处理的事情。
例:程序有两个输入控件:一是数值型控件A,二是字符串控件B,当A>10或B的长 度大于10个字符时,程序抛出一个用户自定义事件“警告”
可以明显地看出,过滤型事件比相应的通知型事件要先发出。
图4-25 事件结构框架0(过滤事继 事件
图4-26 事件结构框架1(通知事件)
(a)“确定”按钮动作前 (b)选择“是”的计算结果 (c)选择“否”的计算结果
图4-27 静态事件结构运行结果
5.3.3 事件结构的使用
通常,程序不可能只需要处理一个事件,往往在程序运行中不断有需要处理的各种 事件出现,所以,事件结构通常会被放在一个while循环结构内。我们把这种一个 事件结构外套一个while循环结构的程序模式称为“循环事件结构”。

LABVIEW深入探索之布尔控件与事件结构

LABVIEW深入探索之布尔控件与事件结构

LABVIEW的布尔控件是极富特色的,除了丰富的外观设计外,更为重要的是它的六种不同的机械动作,这是其它编程语言不存在的,对于我们正确使用布尔控件是非常重要的,它特别强调布尔值改变的时刻,这和物理世界的许多现象是相符的。

六种不同的机械动作分为上下两组,上面三种布尔控件的值改变时刻之与鼠标的按下和释放有关,也就是说改变的时刻完全是由鼠标决定的。

下面的一组则不同,改变的时刻是由鼠标和软件读取控件的时刻共同决定的。

上图中,m代表鼠标的动作,v代表值改变的时刻,RD代表软件读取的时刻,我们今天要讨论的布尔控件的机械动作和事件结构之间的关系,对于不同机械动作的含义不做详细分析。

一、单击时转换第一行左数第一个图标,单击时转化,每次单击的时刻,就是布尔状态的改变时刻,与鼠标何时释放和软件是否读取布尔控件没有关系,我们常用的灯开关就是这种方式。

事件结构中,对于鼠标动作,提供多种事件,比如鼠标进入、鼠标离开,这两个事件并不影响布尔控件的动作。

我们重点讨论鼠标按下、鼠标释放和值改变事件。

从图标可以推测出,次序应该是这样的,鼠标按下---》布尔值改变---》鼠标释放,我们可以验证一下,下面我们使用了NI公司最新的桌面跟踪工具包(Desktop Execution Trace Toolkit),通过这个工具包,很容易跟踪鼠标动作的次序。

上面的程序框图中,鼠标按下通知事件应该是最先发生的,通过通知事件可以决定鼠标消息是否需要进一步处理,看一下这几个事件的执行次序。

鼠标事件的相应次序是:鼠标按下--》值变化---》鼠标释放,使用单击时转换机械动作时,采用鼠标按下事件或者值变化事件处理布尔控件是最合适的,但是显然不应该使用鼠标释放事件来处理,因为鼠标释放的时刻由用户决定,与希望改变的时刻是不相符的。

二、释放时转换第一行第二个图标,这种机械模式与单击时转换不同,值改变的时刻由鼠标抬起的时刻决定。

事件的产生次序是:鼠标按下---》鼠标释放---》值改变,所以这种方式的事件处理应该放在在鼠标释放或者值改变事件中。

labview学习——生产者消费者(数据)(事件)

labview学习——生产者消费者(数据)(事件)

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技术来实现的。

LabVIEW技巧系列(一)——事件结构

LabVIEW技巧系列(一)——事件结构

LabVIEW技巧系列(一)——事件结构
事件结构,是LV编程结构的精髓所在。

它类似于单片机的中断功能,优
点在于不占用CPU资源。

比如按键按下串口发送数据,以及设置键盘快捷键
等等功能,事件结构比查询结构要节省很多系统资源。

下面我介绍一下利用事件结构的关键点,基础的自己去看帮助吧。

1,关于事件结构超时连线的问题:事件结构有一个超时事件的输入,当不连接时代表永不超时。

这点要十分注意,因为有时候你的事件就够会和其他结构放在一个while循环里,比如下图:
我们理想的情况是,其他服务程序正常循环运行(小灯闪烁),而鼠标按下后,处理事件结构。

但是如果这样写的话,由于事件结构永不超时,while循
环只会运行一次,只有当鼠标按键按下后,才会开始第二次循环。

这个程序的运行结果是,按一下鼠标,小灯变化一次。

要解决这个问题有两个办法:一个是给事件结构的延时输入处添加延时时间,比如5ms,这样循环就会5ms运行一次,不会影响其他服务程序的正常运行。

二个就是把其他服务程序放到另外一个while循环中,事件结构单独一个循环。

个人建议选择第二个方法。

2,关于事件结构软触发的问题:前面板有一个按钮,按下后触发很简单,
也很常用。

不过有时候要涉及到软触发的问题,就是利用程序(而不是前面板的控件)去触发一个事件。

先看下面这个例子:
“服务程序”软件改变软触发的值,我们的理想目标是,每次改变服务程序的
值为真时,标志小灯会改变一次。

但是实际程序运行结果是,无论按多少次,小灯都不变。

因为直接赋值只能改变变量的值,而不能引起次变量的事件触发。

Labview事件结构

Labview事件结构

Labview事件结构例⼦,创建两个按键,当没有按下按键1时,按键2⽆法被按下并显⽰为灰⾊。

当按下按键1后,按键2允许被操作。

继续按下按键2,弹出对话框“”按下按键2“思路:利⽤顺序结构,先禁⽤按键2,并以按下按键1为事件结构的触发事件,按下按键1后,使能按键2。

以按下按键2为条件结构的触发条件,真时弹出对话框。

遇到的难点:事件结构的操作。

⾸先,我们利⽤按键属性节点中的“”禁⽤“,可以编程按键的使能和使能。

创建禁⽤节点如下,共有三个选项可以选择帮助信息:这⾥我们在顺序结构的第⼀帧⾥先失能按键2.然后第⼆帧⾥因为要以按键1按下作为触发事件,所以要⽤到事件结构。

⽽时间结构必须要搭配while循环使⽤。

这⾥要注意这样连线并不意味着就讲“按键1按下”与结束while联系起来了,还必须对本分⽀进⾏编辑!!打开后如下图所⽰我们先添加事件,然后选择事件源。

这⾥我们利⽤按键1的值改变。

这样编辑之后,由于我们没有为事件结构添加等待时间(永不超时),所以只有按下按键1之后,才会退出while循环。

进⼊下⼀帧,我们先使能按键2然后添加条件结构,添加对话框并添加⽂本。

那么整体程序框图如下学习总结:labview中事件结构与wihle循环⼀起使⽤。

由于事件源很丰富,所以事件结构常常使⽤。

在事件结构编辑事件源,并将其连接⾄while循环条件。

可以添加多个事件分⽀,⽽且可以配置结构等待事件的时间作为⼀个分⽀:超时时间等于事件结构等待⼀次事件的时间,在超时时间内没有等到事件则执⾏[超时]事件例如我们单独为超时事件这样设置⼀个分⽀,那么在2s后该分⽀⾃动赋真值给结束按钮。

LabVIEW的程序结构

LabVIEW的程序结构



在层叠式顺序结构的边框上面右击,选择Add Sequence Local即 可在当前帧创建一个顺序局部变量端口。

将本帧中的数据连接到该局部变量端口,该数据就可传到后面的 帧,该数据不会作用到它前面的帧。
如下图示意了层叠式顺序结构通过局部变量传递数据的 情况。在标识是1号帧的一个数据传递到标识是2号的帧 进行“或”运算,0号帧不能使用该数据。
下面是用移位寄存器(左图)和反馈节点(右图)实现 a++的框图程序。
2 While循环 For循环和While循环的区别:
For循环要执行预先指定的循环次数。
而While循环只有在条件端口接收到的值为 False(or:True)时才停止循环。While循环不必知道循 环次数。 While循环不满足条件也要执行1次。 For循环当N<1时1次都不执行。
在message数据端口新建一个常量,输入“超时或单 击了OK按钮”。
在超时端口连接值为5000的一个数字常量。
运行程序,如果单击了“OK Button”按钮或等待5秒都 会显示出对话框“超时或单击了OK按钮”。
法2:
在事件结构边框的快捷菜单中选择Add Event Case…来 创建事件结构的一个分支 。 在弹出的对话框中,选取“EventSources”事件源窗口 中的“OK Button” 。并在“Event”事件窗口中选择 “Value Change” 。 后面的设置与法1类似。
超时端口,默认
值为-1,表示无 限等待 。
事件数 据端口
结构框
2.事件结构的使用
可有一个或多个子图形代码框,该图形代码框可以设置为响应多 个事件。 右击事件结构边框,从弹出的快捷菜单中选择Edit Events Handled by ThisCase…,这时将弹出编辑事件对话框。 显示当前建立的事件, 默认“Timeout’事件。 增加事件 删除事件

labview的事件结构的用法

labview的事件结构的用法

labview的事件结构的用法
LabVIEW的事件结构是一种特殊的程序结构,它可以让程序在等待用户输入或系统事件时暂停执行,直到事件发生后再继续执行。

事件可以是用户交互、数据输入、系统消息等,都可以被事件结构捕捉。

使用事件结构可以增强程序的交互性和灵活性,使程序能够更好地响应用户操作和外部事件。

事件结构包含一个或多个事件框,每个事件框都可以捕捉一个特定类型的事件。

当事件发生时,事件结构会自动跳转到相应的事件框,执行相应的代码,然后等待下一个事件的到来。

事件结构还可以设置超时时间,当等待事件的时间超过设定的超时时间时,事件结构会自动退出等待状态,进行下一步操作。

LabVIEW的事件结构还支持多个事件的并发处理,不同的事件框可以同时处于等待状态,当事件发生时,相应的事件框会立即响应,执行相应的代码,而不影响其他事件框的等待状态。

在LabVIEW中,事件结构可以用于各种应用场合,比如图形界面、数据采集、通信等。

通过事件结构,程序可以更好地与用户交互,响应外部事件,增强程序的实用性和可靠性。

- 1 -。

第五章LabVIEW介绍5

第五章LabVIEW介绍5

(1)调用 • 由函数模板中的Select a VI…子模板打开选择用户 程序对话框,选择已经保存的全局变量声明VI程序 ,此时将在框图程序中显示全局变量数据端口。 • 如果在全局变量声明VI中建立多个控件,可以用操 作工具在全局变量的图标上单击,在列出的所有变 量对象中选择所需的对象。
–(2)使用示例 • 利用全局变量在不同VI中传递数据。 • 创建一个全局变量声明Ⅵ,其中包含一个数值型控件和布 尔型控件,保存为“GV.vi”。 • 新建一个VI命名为“采集信息.vi”,前面板中有一个旋钮 开关和按键开关,将它们的值送到全局变量中。由函数模 板中的选择VI子模板打开选择用户程序对话框,选择 “GV.vi”,调用两次全局变量声明Ⅵ,选择全局变量的不 同数据类型,对端口连线并保存VI。如图
2019/1/18 32
强度图表的应用
本程序中,先由正弦函数在for循环的边框通道上形成一个 一维数组,然后通过“创建数组”函数形成一个列数为1的 二维数组,送到强度图表控件。因为强度图表所需的数据类
型为二维数组。
2019/1/18 33
5.7.5 数字波形图
数字数据类型
在数字电路设计中经常要分析数字电路的逻辑, 因此通常需要分析时序图。LabVIEW提供了数 数字数据 字波形图解决了此类问题。
4、特点 (1)以独立文件的形式存在 (2)一个全局变量中可以包含多个对象,拥有多种数 据库类型 (3)与子VI不同,不能进行编程,只能用于简单的数 据存储。 (4)速度快 (5)其中的数据可以分别访问
(四)慎用局部变量与全局变量
理由: 1、占用大量内存 2、使程序可读性差 3、在多线程并行运行的程序中,局部变量也可能引 起竞态条件。
二维数组
5.7.7 三维图形

labview的事件结构的用法

labview的事件结构的用法

labview的事件结构的用法LabVIEW是一款强大的图形化编程软件,具备强大的数据采集和处理的能力,广泛应用于自动化、监控、控制等领域。

其中,事件结构是LabVIEW中最常见的流程控制结构之一。

本文将围绕事件结构的用法进行详细阐述。

事件结构是LabVIEW中的一种流程控制结构,它的主要功能是在某个事件发生时,执行相关的代码。

在实际应用中,事件结构通常用于响应用户的输入、硬件设备的触发等事件。

具体来说,事件结构可以分为两个主要部分:事件源和事件处理程序。

首先,需要明确的是,事件结构的建立需要先确定事件源,也称为该事件的产生者。

常见的事件源包括面板上的控件、VI的输入和输出、硬件设备和文件等。

选择合适的事件源很关键,因为它决定了事件结构的执行时机。

其次,需要编写相应的事件处理程序,即在事件发生时,要执行的程序段。

LabVIEW提供了许多已经编写好的事件处理程序,也可以根据需要编写自己的事件处理程序。

事件处理程序一般包括以下几个基本步骤:读取事件数据、执行相应的操作、更新界面或数据等。

不同类型的事件处理程序细节略有不同,但总体逻辑相似。

接下来,我们来看一下事件结构的具体用法。

1.使用事件结构实现面板控件的响应使用事件结构可以实现对面板控件的响应。

例如,我们要在按下按钮时执行某个操作,只需要在事件结构中选择该按钮控件作为事件源,然后编写相应的事件处理程序即可。

这样,只要用户按下该按钮,就会自动触发相应的事件处理程序。

2.使用事件结构实现VI的响应除了对面板控件进行响应外,事件结构还可以实现对整个VI的响应。

在新建事件结构时,可以选择VI作为事件源,然后编写响应程序。

这样,只要该VI被调用,就会自动触发相应的事件处理程序。

3.使用事件结构实现硬件设备的响应通过LabVIEW,可以方便地实现与硬件设备的交互。

在新建事件结构时,可以选择硬件设备作为事件源,然后编写响应程序。

这样,当硬件设备产生特定的信号时,就会自动触发相应的事件处理程序。

labview第四讲 程序结构

labview第四讲  程序结构

优点: 把每个帧平铺开来比较直观,方便代 码阅读,不需借助局部变量这种机制在 帧之间传递数据。 缺点:浪费空间。
例:求循环时间
四、公式节点
通过公式节点,用户可以实现复杂的数学
公式,还可以通过文本编程写一些基本的
逻辑语句,如if…else、case、while循环
之类的语句,弥补了图形化开发语言相对
(三)全局变量 与传统编程语言中的全局变量类似, 可以在不同的VI之间进行数据传递。 1、创建 2、属性:读和写 3、使用(举例)
4、特点 (1)以独立文件的形式存在 (2)一个全局变量中可以包含多个对 象,拥有多种数据库类型 (3)与子VI不同,不能进行编程,只 能用于简单的数据存储。 (4)速度快 (5)其中的数据可以分别访问
Local variaval
3、本地变量的属性: 读(Read)和写(Write) 4、使用 前面板对象的本地变量相当于其端口 的一个拷贝,它的值与该端口同步。
举例: 例1、用一个布尔开关同时控制两个循环
例2、给一个控制赋值,从一个指示中读 出数据。
例3、在顺序结构中的使用:创建一个 VI, 计算生成等于某个给定值的随机数所需 要的时间。
例1:用While循环
创建一个可以产生 并在图表中显示随 机数的VI。 前面板 有一个控制旋钮可 在0到10秒之间调 节循环时间,还有 一个开关可以中止 VI的运行。学习怎 样改变开关的动作 属性,以便不用每 次运行VI时都要打 开开关。
随机信号 1.0 0.8 0.6 0.0 0.4 0.2 0.0 0 1023 10.0 2.0 循环延时 4.0 6.0 8.0
(二)本地(局部)变量 相当于传统编程语言中的局部变量,可以 在同一个程序内使用。 1、引入理由: (1)每个控制或指示的数据端口只有一 个; (2)需要在同一个VI的不同位置多次为 指示赋值;或多次从控制中取出数据;或者 为控制赋值,从指示中取出数据。

事件结构

事件结构

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程序设计模式(四)—状态机和事件结构的结合

LabVIEW程序设计模式(四)—状态机和事件结构的结合

LabVIEW程序设计模式(四)—状态机和事件结构的结合上两节分别解决了基本状态机的第(1~5)个问题,但是是否具备一种模式能够综合队列型状态机模式和用户界面事件型模式的优点呢?这样可以同时避免基本状态机的第(1~5)个问题。

答案是肯定的,本节将介绍如何将状态机与事件结构结合起来形成一种新的、稳定的模式。

状态机模式的基本构成元素是while 循环和case 结构,而事件结构模式的基本构成元素是while 循环和event 结构,因此新的模式应该由while 循环、case 结构和event 结构组成。

而while 循环的目的是为了保证程序的持续运行,因此必须在最外层,这样就只剩下了图20 所示的两种组合方式。

在第一种方式中,每次循环的运行需要经过一个事件结构才能够实现case 中各个分支的运行,那么到底需要多少个分支呢?一般而言不同的事件都会有不同的事件处理函数(这些函数可以在case 结构中共用),显示这是无法满足要求的,它从本质上而言仍然是一种事件结构。

在第二种方式中,程序的主体是一个状态机结构,不同的是在某一个状态分子中有一个事件结构。

我们可以回忆状态机模式中的空闲Idle 状态,这正是长时间占用CPU 资源的源头,如果在Idle 中加入一个事件结构后就有效地规避了这个问题。

图20 三种结构的组合方式因此图20 中的第二种结构综合了状态机和事件结构的优点,有效地克服了基本状态机的第(1~5)个问题。

此外,在【应用2_自动贩卖机】例程中,按钮1USD、2USD 和5USD 的作用是相同的,唯一不同的是它们的代表的币值不同。

如果我们希望系统共用币值相加这个功能,即当这三个按钮任何一个被按下后都调用同一个函数(该函数的功能是将系统中原来的货币值与新加入的币值相加得到新的值)。

这样,需要有一种途径把1USD、2USD 和5USD 代表的币值作为参数传递给函数。

图21 所示为带参数的状态机结构,在消息队列的状态机模式中,加入了一个变体型的变。

LabVIEW程序设计模式(四)—状态机和事件结构的结合

LabVIEW程序设计模式(四)—状态机和事件结构的结合

LabVIEW程序设计模式(四)—状态机和事件结构的结合LabVIEW程序设计2009-05-04 14:25:19 阅读497 评论0 字号:大中小订阅上两节分别解决了基本状态机的第(1~5)个问题,但是是否具备一种模式能够综合队列型状态机模式和用户界面事件型模式的优点呢?这样可以同时避免基本状态机的第(1~5)个问题。

答案是肯定的,本节将介绍如何将状态机与事件结构结合起来形成一种新的、稳定的模式。

状态机模式的基本构成元素是while循环和case结构,而事件结构模式的基本构成元素是while循环和event结构,因此新的模式应该由while循环、case结构和event结构组成。

而while循环的目的是为了保证程序的持续运行,因此必须在最外层,这样就只剩下了图20所示的两种组合方式。

在第一种方式中,每次循环的运行需要经过一个事件结构才能够实现case中各个分支的运行,那么到底需要多少个分支呢?一般而言不同的事件都会有不同的事件处理函数(这些函数可以在case结构中共用),显示这是无法满足要求的,它从本质上而言仍然是一种事件结构。

在第二种方式中,程序的主体是一个状态机结构,不同的是在某一个状态分子中有一个事件结构。

我们可以回忆状态机模式中的“空闲Idle”状态,这正是长时间占用CPU资源的源头,如果在Idle中加入一个事件结构后就有效地规避了这个问题。

图20 三种结构的组合方式因此图20中的第二种结构综合了状态机和事件结构的优点,有效地克服了基本状态机的第(1~5)个问题。

此外,在【应用2_自动贩卖机】例程中,按钮1USD、2USD和5USD的作用是相同的,唯一不同的是它们的代表的币值不同。

如果我们希望系统共用“币值相加”这个功能,即当这三个按钮任何一个被按下后都调用同一个函数(该函数的功能是将系统中原来的货币值与新加入的币值相加得到新的值)。

这样,需要有一种途径把1USD、2USD和5USD代表的币值作为参数传递给函数。

虚拟仪器-第4章 LabVIEW的程序结构

虚拟仪器-第4章 LabVIEW的程序结构

数据隧道
条件结构内部与外部之间的数据也是通过隧道来交换传递的。 向条件结构边框内输入数据时,各个子程序框图连接或不连接这个数 据的隧道都可以。从条件结构边框向外输出数据时,各个子程序框图都必 须为这个隧道连接数据,否则隧道图标是空的,程序也不能运行。 如果允许没有连线的子程序框图输出默认值,可以在数据隧道上右击, 在弹出的快捷菜单中选择“未连线时使用默认”命令,在这种情况下,程 序执行到没有为输出隧道连线的子程序框图时,就输出相应数据类型的默 认值。
【实训练习】
用条件结构来实现两个数的加、减、乘、除四则运算,要 求用组合框作为条件结构的选择器。
4.3 顺序结构
LabVIEW作为一种图形化的编程语言,有其独特的程序执行顺序——数据 流执行方式,数据流经节点的动作决定了程序框图上VI和函数的执行顺序。 但在实际中希望节点按一定的次序执行,这就需要引入顺序结构执行。 LabVIEW顺序结构的功能是强制程序按一定的顺序执行。
种变量的操作方法
第4章 LabVIEW的程序结构
程序结构对任何一种计算机编程语言来说都是十分重要的,它控制整 个程序语言的执行过程,一个好的程序结构,可以大大提高程序的执行效率。 LabVIEW作为一种图形化的高级程序开发语言,执行的是数据流驱动机制, 在程序结构方面除支持循环、顺序、条件等通用编程语言支持的结构外,还 包含一些特殊的程序结构,如事件结构、使能结构、公式节点等等。
条件接线端是一个布尔变量,接入布尔 值用于控制循环执行。条件接线端有两种 使用状态。
循环框架 为真时停止
计数接线端 条件接线端
为真时继续
与For循环是在执行前检查是否符合条件不同,While循环是在执行后再检查条 件端子,因此,在While循环的执行流程中,循环框架中的代码至少执行一次。

LabVIEW事件结构

LabVIEW事件结构

事件分支标签
事件数据节点
图 1 事件结构
事件过滤节点
用户界面事件分为消息事件和过滤事件两种。
1
LabVIEW
LabVIEW 中级教程
消息事件
消息事件指一个用户的行为已经发生,使用消息事件来反馈一个已经发生的事件,
并且 LabVIEW 已经对它迚行了处理。例如,“鼠标按下”就是一个消息事件,图

添加事件分支,事件源选择“本 VI”,事件选择“键按下”。
使用一个显示控件查看按下“↑、←、↓、 →”键所分别对应的扫描码。
添加条件结构,为“↑、←、↓、 →”添加不同的条件分支(扫描码作为判 据),设置不同的字符串作为“按键记录”的输出,并删除上个步骤中创建是显示 控件。
3、使用过滤事件,实现程序运行时,前面板一直保持打开的功能。
2 中的事件结构的分支程序实现了用户用鼠标点击停止按钮,按下后停止程序的功
能。这个事件是在用户释放鼠标以后 LabVIEW 迚行处理的。





图 2 消息事件
过滤事件
过滤事件在用户行为发生之后,LabVIEW 处理该事件之前先告知用户,由用户来 决定程序接下来如何处理事件,有可能处理的方式与默认的处理不同。过滤事件有 什么好处?使用过滤事件以后,用户可以随时按需要修改程序对事件的处理,甚至 可以完全放弃该事件,而对程序不产生影响。例如:“前面板关闭?”就是一个过 滤事件(过滤事件后面都有一个?)。图 3 中的事件结构实现放弃对“前面板关 闭?”这一事件的响应,从而将这一事件过滤。
5

“轮询”的方式来检测事件的发生,但这样会大大消耗 CPU 的使用时间,不利于

处理复杂、多线程的程序。因此,事件结构允许将 CPU 的使用降低到最小,但又
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LABVIEW中的事件结构杂谈刚开始接触事件结构时觉得它很好用,所以很喜欢用,但也引起了一些问题,就是前面板很容易就被挂起来了,就是所前面板没有响应了,很郁闷。

之后就不敢用了,很多可以用事件结构的地方都只用CASE结构麻烦的代替了~~今天被师兄那么一指点,觉得完全是委屈了事件结构啊,之前事件结构引起的问题可以很容易的解决。

方法就是设置“超时”(之前一直觉得这个东西没用的):一般情况下,事件结构是会和while循环套用的,通过不断的循环来执行不同事件源激发的事件,但如果不设置超时,也没有事件源发生,那么while循环将一直等待事件的发生而不进行循环,这样就会使得事件结构外的其他程序也不能执行,可能造成的结果就是前面板本该有反应的地方(比如变量值的变化)没有了反应。

而如果设置了超时,比如设置为100(ms),意思就是每隔100ms如果没有事件发生就超时,进行一次循环,那么事件结构外的其他程序也就得到了执行。

总结一下:如果事件结构在while循环中,而事件结构之外又有其他的程序需要执行(可能不依赖于事件的发生),那么就应该设置超时。

在事件处理过程内,如何响应前面板命令控件的命令? 我发现,在一个事件内的处理过程完成之前,系统不能响应前面板的其他命令。

系统是在事件完成之后的等待时期才响应其他前面板命令事件。

编辑事件结构对话框的下边有一个: 锁定前面板在事件分支执行完毕前。

你可这个默认选中的选项取消了,就可以实现你的“在一个事件过程处理中途响应前面板的其他命令"功能。

LabVIEW事件结构使用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开发环境,并选择开发环境中的:新建》项目。

此后,在“项目浏览器”就可以看到一个新建的项目:"未命名项目1"。

单击项目浏览器:文件》保存,并将该项目命名为:“综合参数测量仪”后,存放到桌面上的《综合参数测量仪》文件夹中。

此时,项目创建完毕。

第2步、创建一个主vi:综合参数测量仪.vi打开刚刚新建的“综合参数测量仪”项目,然后用鼠标右击该项目中的”我的电脑“选择:新建》VI,即创建了一个新的vi。

用鼠标点击新vi的:文件》保存(命名为:综合参数测量仪.vi)。

主vi即宣告创建完毕。

如例图所示。

第3步、设置“综合参数测量仪.vi”的属性打开刚刚创建的“综合参数测量仪.vi”,用鼠标点击:文件》VI属性,该vi的属性对话框弹出,如例图所示。

也就是设置主vi的属性。

在“类别”窗口选择属“窗口外观”,设定:“窗口标题”和“自定义”选项,见例图。

用鼠标点击上图中的“自定义”按键,进入“自定义窗口外观“对话框。

按例所示的方式选择各单元参数设定后,连续点击”确定“按键后,退出”VI属性“设定对话框。

“综合参数测量仪.vi“的属性基本设定完毕,在该vi的程序框图上,先创建一个While 循环,并放置“停止”按键来控制这个While循环。

然后,点击前面版上的运行按钮,程序开始运行,如例图所示。

此时看到“综合参数测量仪”的前面版的上部保留了一个菜单栏,但内容不是我们所期望的。

现在,按我们所要求的菜单栏来进行新的设计。

第4步、编辑设计菜单栏在该vi的前面板选择:编辑》运行时菜单,此时系统弹出“菜单编辑器”对话框,选择“自定义”、“用户项”则可以进行自定义的菜单设计。

下面就来设计运行时菜单,首先在上图所示的“菜单项名称”一栏添入第一个菜单项目:“直流电压测量”,然后,点击“+”按键。

项目菜单创建完成,在预览栏目中显示出第一个菜单项“直流电压测量”。

下面添置该项目下的子菜单(如果没有子菜单,那么重复上述步骤进入下一个项目菜单的设计)。

点击“右移”键,进入子菜单选项,在“菜单项名称”一栏添入:“60V电压测量”,点击“+”“15V电压测量”,点击“+”“4V电压测量”,点击“+”“1V电压测量”,点击“+”“125mV电压测量”,点击“+”。

然后点击“左移”按键,准备下一个项目菜单的设计。

如例图所示。

在“菜单项名称”一栏添入:“直流电流测量”。

然后点击“+”键以及“右移”键,继续在“菜单项名称”一栏添入子菜单名:“25mA电流测量”。

如图所示。

点击“+”键及“左移键”后,在“菜单项名称”一栏添入:“电阻测量”。

然后,点击“+”键及“左键”,在“菜单项名称”一栏添入子菜单名:“两线电阻测量”“四线电阻测量”两个子菜单。

同样,设定主菜单为:RTD温度测量,子菜单为:三线RTD温度测量四线RTD温度测量同样,设定主菜单为:热电偶温度测量,子菜单为:K型热电偶温度测量J型热电偶温度测量S型热电偶温度测量同样,设定主菜单为:应变测量,子菜单为:1/4桥应变测量半桥应变测量全桥应变测量至此,菜单设计完成,见例图。

关闭“菜单编辑器”试运行一下程序,状态见例图。

第5步、结合事件结构设计菜单选项的程序首先,在“综合参数测量仪”的程序框图中的While循环里,添加一个”事件“结构。

从图中可以看出,目前该事件结构只有一个事件源:”超时“。

用鼠标右键点击事件结构的边框,在弹出的快捷菜单上,选择:“添加事件分支…”,在编辑事件对话框中,事件源选择“控件、停止,鼠标按下事件”。

单击“确定”按键,这时就多了一个“停止”事件源。

此时,我们可以将“超时”事件删除。

并该程序进行修改,首先将“停止”按键的图标移动到While循环外,然后在该事件结构中放入一个“真”的布尔常量,连接到While循环的停止端子上,如下图所示。

此时,在运行该程序后,用鼠标点击“停止”按钮,程序将会停止下来。

看来程序已经响应了这个停止运行的“事件”发生。

下面我们来设计有关”菜单事件“的程序单元。

用鼠标右键单击事件结构的边框,会弹出一个快捷菜单,选择:添加事件分支...后会弹出一个新的“事件编辑”对话框。

在此对话框中:事件源选择:本VI;事件选择:菜单选择(用户),则创建了用户菜单的事件分支。

在用户菜单的事件分支放置一个case结构,并将所有的子菜单名字写入case选择器标签中。

同时,将“分支选择器”与“项标识符”相连。

此后,只要在子菜单的相应分支中放置事件处理程序(动态调用相应的子vi)既可实现菜单的事件处理。

下面给出调用“60V电压测量“的简单例子。

这里动态调用的子vi,与上一节中介绍的动态调用子vi相同。

动态调用的过程也一致。

就不多谈了。

调用“60V电压测量“子vi。

该子vi的程序框图见例图(示意图,只有一个While循环和停止按键)。

所有这些项目和子项目vi,都应保存在项目的目录下。

结合应用项目的设计,运行时菜单事件设计方法已经基本示意完成了(包括子vi的动态调用),只是所有子菜单中的测量程序框图都没有给出,需要读者自行设计(如果有机会可能后边还会继续介绍)。

事件结构注意事项:事件结构最适合人机对话界面的设计,不适合在事件处理过程中运行复杂的程序。

比如:我们通过事件结构来进行动态调用复杂的运行程序,此时主程序前面版被“关闭”,直到复杂应用程序运行完成后,返回到主程序才可以响应新的事件发生(事件响应和处理的“握手”关系,换句话说,程序处理时也同时屏蔽了其它菜单事件的响应)。

这样可以避免事件的“记忆”和“堆积”。

编程的主要目的是为了实现用户的某种功能,用户通过用鼠标、键盘、程序内部等触发某种程序动作,从而达到某种结果,这些操作都被称作为事件,LabVIEW中相应这些事件最常用的结构就是“事件结构”。

事件结构内容丰富,基本上大的程序结构都需要用到事件结构,下面将详细介绍事件结构。

事件结构在程序不能够单独响应各种事件,必须与循环结构一同使用,如下图事件添加方式很简单,鼠标右键事件框弹出菜单如上图,有添加、删除、复制、编辑事件等选项,按照操作即可。

如下图,为事件结构添加Stop事件,布尔控件触发事件的方式有多种,鼠标按下、经过、离开、进入等,这里我们选择“值改变”。

确定后,stop事件就被添加进去了,如下图,当我们运行程序后,点击前面板的stop按钮,触发事件使while循环停止而后程序也停止。

同一事件分支只能添加一种事件吗?当然不是!有的时候有很多不同操作却会执行相同代码,怎么编程才不会让代码冗余呢?看个例子,如下图2个按钮stop1,stop2点击后都可以让程序停止,我们怎么为其添加事件呢?我们先添加一个事件stop1的,方法上面已经描述了。

由于stop2的执行代码和stop1一样,我们在事件stop1上右键->弹出菜单->编辑本事件分支(Edit Event Handled by This Case)会弹出已添加事件stop1的编辑框,这是左侧有2个按钮如下截图我们点击Add Event左侧事件列表会出现如下变化选中这个后,右侧列表选中stop2的Value Change事件后,点击确定在看该事件分支如下,2个事件就添加在同一个分支当中了,运行程序后,点击stop1或stop2均可让程序停止。

超时超时是事件结构特有的,看名字就知道是怎么回事,即超过一定时间没有触发事件则执行超时事件。

如果超时时间设置<=-1,则永远也不执行超时事件,循环处于空闲等待状态。

相关文档
最新文档