labview事件结构浅析
第9章_labview的高级应用(事件结构编程技巧)
通过“坐标”获取鼠标的位置,并把该坐标值赋给“鼠标 按下”的控件,从而达到控件被鼠标拖动的视觉效果。
在“鼠标释放”的分支中,通过“非法引用句柄常量”取 消对“鼠标移动”事件的注册,从而实现在鼠标释放后, 控件的位置不再跟随鼠标发生变化。
• 动态注册:动态事件注册与VI服务器相结合,
允许在程序运行时使用控件、VI或应用程序 的引用来动态地指定和改变产生事件。动态 注册在控制LabVIEW产生何种事件和何时产 生事件等方面更为灵活。
用布尔控件制作 的自定义控件
为这个自定义控 件动态注册了 “鼠标按下”事
件
1:放置“注册事件”函数 2:在“注册事件”函数输入端上连接一个引用 3:在“注册事件”函数事件源,选择该引用所对应的事件
第九章
Labview 的高级应用 ——事件结构之谜
用户界面
事
件
外部I/O
程序的其它部分
超时节点
事件结构
事件选择器
动态事件注册
事件数据节点程序代码Step2:处理事件分支程序
事件结构在循环体外, 因此不再执行
Step1:值第一次被改变 Step3:值再次被改变
事件结构编写黄金法则1
将事件结构放入While循环中!
生产者消费者 循环
事件结构
• 通知事件:
如“鼠标移动”、“键按下”等
• 过滤事件:
如“鼠标移动?”、“键按下?”等
数字”0-9” “-“ ”Backspace“
事件过滤节点
事件结构注册模式
• 静态注册:事件结构的每个分支具体处理哪 些事件,一旦VI开始运行,LabVIEW将自动 注册这些事件,并且在VI运行的整个过程中 无法改变事件结构所处理的事件。
labview控制程序流程——labview事件结构
labview控制程序流程——labview事件结构1 事件结构及它的图形化表示法事件被用来通知用户有异步活动发生。
图形化语言的事件响应包括:用户界面事件、外部I/O 事件和程序其它部分的事件。
对事件的处理程序也被称为:事件驱动程序。
事件驱动程序可以分为若干个分支,每个分支处理不同的事件响应。
所以对事件的响应结果也可以控制程序的流程。
事件驱动机制来自于可视化的操系统,可视化操作系统对用户事件提供了简洁、有效的响应方式,最常见的事件来自于鼠标和键盘。
虚拟仪器借助于操作系统的事件处理机制实现了图形化语言的事件响应能力。
在没有引入事件结构之前,LabVIEW 是借助于轮询的方式来查询用户操作,由于轮询的方式会占用一定的CPU 资源,甚至可能遗漏事件,所以这种处理方式并非理想。
事件结构的出现避免了对CPU 资源的占用,同时也避免了事件的遗漏。
事件结构在函数选板》编程》结构子选板中可以找到,并可以将其直接拖拽到程序框图中,图形化表示的事件结构,参见下图。
图 1 图形化的事件结构与Case 结构和循环结构类似,事件结构也包含了一个主框架,这个框架内将用来放置事件处理的事件驱动程序代码。
如果事件处理任务众多,会有众多事件分支存在,在结构上类似Case 的多帧结构(选择器标签)。
当在程序框图上拖放一个事件结构时,我们只能看到上图所示的一帧已经预先注册的超时事件(Timeout),超时事件分支。
它具有定时延迟的基本功能(不包括While 循环),参见下图。
图 2 具有定时延迟的基本功能当然也可以采用另一种表示方法,参见下图。
图 3 利用事件结构内部节点获得中止时间通过这个例子也好理解内部节点中时间的含义(是事件响应的停止时间)。
超时事件超时事件是一种特殊的事件,当然也可以看成是默认的事件分支。
如果存在其它事件源时,超时事件完全可以被忽略或取消。
看下面一个例子。
图 4 仅有的两个事件之一超时事。
labview事件结构使用方法
labview事件结构使用方法在LabVIEW中,事件结构是一种可以按照事件的发生改变程序流程的数据结构,可以通过人机互动或者事件干预的方式产生事件驱动,在LabVIEW中是一种常用的数据结构,下面我就来讲解一下其具体的使用方法。
一、事件结构的使用目的在LabVIEW中一个重要的概念就是数据流,我们在编程的时候可以来设置某些事件来对数据流进行干预,比如说单击鼠标产生事件,按下键盘按键等,这些都可以被当作为事件结构的条件,进而实现对程序的控制。
二、事件结构的创建方法1.在程序窗口中的空白处单击鼠标右键,在弹出的函数选板中选择<结构>子选板,然后再选择<事件结构>并将其拖到程序框图中即可。
2.最基本的事件结构是由<程序框架>、<子框图标识符>和<事件数据节点>组成。
3.在刚创建事件结构时,会自动的创建一个<超时端口>,<超时端口>用于连接一个数值指定等待事件的毫秒数,如果超过设定的时间没有发生事件的话,程序就会产生一个超时事件。
4.<事件数据节点>用于访问事件的数据值,可以单击节点中的数据项,然后在弹出的菜单中,选择<选择项>,可以进行选择访问哪个事件数据的成员。
5.在事件结构的边框上单击鼠标右键,在弹出的菜单中选择<添加事件分支>,即可完成子框图的添加。
三、对事件进行编辑1.换到要进行编辑的子框图中,在边框上单击鼠标右键,在弹出的快捷菜单中选择<编辑本分支所处理的事件>选项,打开<编辑事件>对话框。
2.在<编辑事件>界面中可以对相应的事件源和事件进行定义,在左侧的<事件说明符>下面点击<添加事件>或者<删除>即可相应的改变事件数量。
在<事件源>和<事件>两个子窗口中分别选中相应的对象,左侧的<事件说明符>下面就会出现两者的组合,点击<确定>,此子事件框图就可以完成编辑。
LABVIEW 中的事件结构杂谈
LABVIEW中的事件结构杂谈刚开始接触事件结构时觉得它很好用,所以很喜欢用,但也引起了一些问题,就是前面板很容易就被挂起来了,就是所前面板没有响应了,很郁闷。
之后就不敢用了,很多可以用事件结构的地方都只用CASE结构麻烦的代替了~~今天被师兄那么一指点,觉得完全是委屈了事件结构啊,之前事件结构引起的问题可以很容易的解决。
方法就是设置“超时”(之前一直觉得这个东西没用的):一般情况下,事件结构是会和while循环套用的,通过不断的循环来执行不同事件源激发的事件,但如果不设置超时,也没有事件源发生,那么while循环将一直等待事件的发生而不进行循环,这样就会使得事件结构外的其他程序也不能执行,可能造成的结果就是前面板本该有反应的地方(比如变量值的变化)没有了反应。
而如果设置了超时,比如设置为100(ms),意思就是每隔100ms如果没有事件发生就超时,进行一次循环,那么事件结构外的其他程序也就得到了执行。
总结一下:如果事件结构在while循环中,而事件结构之外又有其他的程序需要执行(可能不依赖于事件的发生),那么就应该设置超时。
在事件处理过程内,如何响应前面板命令控件的命令? 我发现,在一个事件内的处理过程完成之前,系统不能响应前面板的其他命令。
系统是在事件完成之后的等待时期才响应其他前面板命令事件。
编辑事件结构对话框的下边有一个: 锁定前面板在事件分支执行完毕前。
你可这个默认选中的选项取消了,就可以实现你的“在一个事件过程处理中途响应前面板的其他命令"功能。
LabVIEW事件结构使用LabVIEW图形化语言开发的应用程序界面是图形化用户操作界面,也称为:GUI (graphical user interface),它的作用是与操作者实现人机对话形式的互动操作。
这种对界面操作的互动响应在LabVIEW 6.1发布之前,只能通过“轮询(polling)”的方式来实现。
轮询的方式的缺点是:需占用一定的CPU资源(在没有事件发生时)和灵活性不好。
LABVIEW深入探索之布尔控件与事件结构
LABVIEW的布尔控件是极富特色的,除了丰富的外观设计外,更为重要的是它的六种不同的机械动作,这是其它编程语言不存在的,对于我们正确使用布尔控件是非常重要的,它特别强调布尔值改变的时刻,这和物理世界的许多现象是相符的。
六种不同的机械动作分为上下两组,上面三种布尔控件的值改变时刻之与鼠标的按下和释放有关,也就是说改变的时刻完全是由鼠标决定的。
下面的一组则不同,改变的时刻是由鼠标和软件读取控件的时刻共同决定的。
上图中,m代表鼠标的动作,v代表值改变的时刻,RD代表软件读取的时刻,我们今天要讨论的布尔控件的机械动作和事件结构之间的关系,对于不同机械动作的含义不做详细分析。
一、单击时转换第一行左数第一个图标,单击时转化,每次单击的时刻,就是布尔状态的改变时刻,与鼠标何时释放和软件是否读取布尔控件没有关系,我们常用的灯开关就是这种方式。
事件结构中,对于鼠标动作,提供多种事件,比如鼠标进入、鼠标离开,这两个事件并不影响布尔控件的动作。
我们重点讨论鼠标按下、鼠标释放和值改变事件。
从图标可以推测出,次序应该是这样的,鼠标按下---》布尔值改变---》鼠标释放,我们可以验证一下,下面我们使用了NI公司最新的桌面跟踪工具包(Desktop Execution Trace Toolkit),通过这个工具包,很容易跟踪鼠标动作的次序。
上面的程序框图中,鼠标按下通知事件应该是最先发生的,通过通知事件可以决定鼠标消息是否需要进一步处理,看一下这几个事件的执行次序。
鼠标事件的相应次序是:鼠标按下--》值变化---》鼠标释放,使用单击时转换机械动作时,采用鼠标按下事件或者值变化事件处理布尔控件是最合适的,但是显然不应该使用鼠标释放事件来处理,因为鼠标释放的时刻由用户决定,与希望改变的时刻是不相符的。
二、释放时转换第一行第二个图标,这种机械模式与单击时转换不同,值改变的时刻由鼠标抬起的时刻决定。
事件的产生次序是:鼠标按下---》鼠标释放---》值改变,所以这种方式的事件处理应该放在在鼠标释放或者值改变事件中。
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_顺序结构分析
事件类型: 通知事件和过滤事件两种。分别用绿色与红色箭头进行区别。通知事件
用于通知某个事件的触发,过滤事件用来控制在执行某个动作后,系统尚未响应之 前进行提醒。当事件发生时,用户可以过滤掉甚至完全放弃事件所触发的活动。
4、应用举例:
⑴. 点击不同按钮,显示不同内容
前面板
后面板
作业
LabVIEW
顺序结构将按照既定的顺序依次执行,它可以包含 多个代码子框图,这些子框图看起来就像是多帧电影 一样,所以把每个子框图称为一帧。 顺序结构分为平铺式和层叠式两种,二者表现形式 不同,但其基本功能则完全相同。
2.所在位置
函数→编程→结构→平铺式\层叠式顺序结构
3.基本结构
①. 平铺式:按左右顺序依次排列
3、事件结构的建立
⑴.摆放框图(程序—结构—事件结构) ⑵.调出编辑事件对话框:右击边框—【编辑本分支所处理事件】 ⑶.构造事件:一般面对前面板对象构造事件 事件说明符:事件
编辑,进行事件的 增、删操作。 事件源:将列出前 事件:给出事件 面板所有对象,供 列表,供用户选 用户选择事件源。 择事件。
使用全局变量和局部变量的注意事项:
LabVIEW 语言编程是一种数据流,全局变量和局部变量 提供了一种违反严格数据流的程序设计方式。大家有必要 了解竞态条件的缺陷,当两个或两个以上的事件可以按任 何顺序发生时就产生了竞态条件。用户要想知道再多个并 行的程序中一个全局变量什么时候被访问是比较困难的。 特别是再多线程编程中,对这种共享数据变量的竞态条件 问题要求更加苛刻,使用全局变量会带来意想不到的错误。 如果用户的应用程序中有全局变量,那么就存在大量的 数据复制的危险,因为用户要想在不同的地方对数据进行 处理,最终就有许多的数据备份,造成内存的巨大开销和 系统资源的浪费,所以建议初学者尽量不要使用全局变量。 如果程序中使用了全局变量或者是局部变量,那么在程 序运行之前,必须首先要确定它的初始值是否满足执行要 求,如果不满足的话,就要对它们进行初始化
12.事件结构
事件结构阮奇桢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技巧系列(一)——事件结构
LabVIEW技巧系列(一)——事件结构
事件结构,是LV编程结构的精髓所在。
它类似于单片机的中断功能,优
点在于不占用CPU资源。
比如按键按下串口发送数据,以及设置键盘快捷键
等等功能,事件结构比查询结构要节省很多系统资源。
下面我介绍一下利用事件结构的关键点,基础的自己去看帮助吧。
1,关于事件结构超时连线的问题:事件结构有一个超时事件的输入,当不连接时代表永不超时。
这点要十分注意,因为有时候你的事件就够会和其他结构放在一个while循环里,比如下图:
我们理想的情况是,其他服务程序正常循环运行(小灯闪烁),而鼠标按下后,处理事件结构。
但是如果这样写的话,由于事件结构永不超时,while循
环只会运行一次,只有当鼠标按键按下后,才会开始第二次循环。
这个程序的运行结果是,按一下鼠标,小灯变化一次。
要解决这个问题有两个办法:一个是给事件结构的延时输入处添加延时时间,比如5ms,这样循环就会5ms运行一次,不会影响其他服务程序的正常运行。
二个就是把其他服务程序放到另外一个while循环中,事件结构单独一个循环。
个人建议选择第二个方法。
2,关于事件结构软触发的问题:前面板有一个按钮,按下后触发很简单,
也很常用。
不过有时候要涉及到软触发的问题,就是利用程序(而不是前面板的控件)去触发一个事件。
先看下面这个例子:
“服务程序”软件改变软触发的值,我们的理想目标是,每次改变服务程序的
值为真时,标志小灯会改变一次。
但是实际程序运行结果是,无论按多少次,小灯都不变。
因为直接赋值只能改变变量的值,而不能引起次变量的事件触发。
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实验报告(两篇)2024
引言概述:控制结构:1.顺序结构:介绍LabVIEW中的顺序结构,通过实例分析顺序执行程序的流程。
2.分支结构:详细阐述LabVIEW中的分支结构,包括条件、多分支和循环分支结构的使用方法和应用场景。
3.事件结构:介绍LabVIEW中的事件结构,如按钮点击事件和键盘输入事件,探讨事件结构的应用和事件处理方式。
4.并行结构:讨论LabVIEW中的并行结构,包括并行循环和并行结构的使用场景和开发技巧。
5.限定结构:详细介绍LabVIEW中的限定结构,如条件执行和迭代执行结构,探讨限定结构的作用和灵活运用的方法。
模块化编程:1.子VI的创建与调用:阐述如何创建和调用子VI,在程序设计中充分利用模块化编程的优势。
2.模块化设计原则:介绍模块化编程的设计原则,包括高内聚、低耦合、单一职责等,指导程序开发过程中模块的设计与实现。
3.面向对象编程:讨论LabVIEW中的面向对象编程,包括类的定义、继承、多态等概念及应用案例。
4.模块重用性:探讨如何提高模块的重用性,通过示例说明如何将已开发的模块应用于不同的项目中。
5.模块化测试与调试:阐述模块化编程带来的测试和调试的便利性,介绍常用的测试方法和调试工具。
用户界面设计:1.前端设计原则:介绍LabVIEW设计界面的原则,包括界面美观、用户友好和交互性等方面的考虑。
2.控件选择与布局:详细阐述LabVIEW中的各种控件的选择和布局,探讨控件的应用场景和交互方式。
3.图表绘制与图像处理:介绍LabVIEW中的图表绘制和图像处理功能,包括数据可视化和图像处理的方法和技巧。
4.用户输入与输出:讨论LabVIEW中用户输入和输出的方式,如文本框、按钮、图像显示等,详细阐述输入输出控件的配置和应用场景。
5.界面优化与体验改进:探讨如何优化用户界面,提高用户体验,包括响应速度、操作流畅性和界面布局的改进方法。
数据采集与处理:1.数据采集原理:介绍LabVIEW中的数据采集原理,包括模拟输入、数字化和数据存储的过程和相关技术。
labview的事件结构的用法
labview的事件结构的用法
LabVIEW的事件结构是一种特殊的程序结构,它可以让程序在等待用户输入或系统事件时暂停执行,直到事件发生后再继续执行。
事件可以是用户交互、数据输入、系统消息等,都可以被事件结构捕捉。
使用事件结构可以增强程序的交互性和灵活性,使程序能够更好地响应用户操作和外部事件。
事件结构包含一个或多个事件框,每个事件框都可以捕捉一个特定类型的事件。
当事件发生时,事件结构会自动跳转到相应的事件框,执行相应的代码,然后等待下一个事件的到来。
事件结构还可以设置超时时间,当等待事件的时间超过设定的超时时间时,事件结构会自动退出等待状态,进行下一步操作。
LabVIEW的事件结构还支持多个事件的并发处理,不同的事件框可以同时处于等待状态,当事件发生时,相应的事件框会立即响应,执行相应的代码,而不影响其他事件框的等待状态。
在LabVIEW中,事件结构可以用于各种应用场合,比如图形界面、数据采集、通信等。
通过事件结构,程序可以更好地与用户交互,响应外部事件,增强程序的实用性和可靠性。
- 1 -。
第五章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中的一种流程控制结构,它的主要功能是在某个事件发生时,执行相关的代码。
在实际应用中,事件结构通常用于响应用户的输入、硬件设备的触发等事件。
具体来说,事件结构可以分为两个主要部分:事件源和事件处理程序。
首先,需要明确的是,事件结构的建立需要先确定事件源,也称为该事件的产生者。
常见的事件源包括面板上的控件、VI的输入和输出、硬件设备和文件等。
选择合适的事件源很关键,因为它决定了事件结构的执行时机。
其次,需要编写相应的事件处理程序,即在事件发生时,要执行的程序段。
LabVIEW提供了许多已经编写好的事件处理程序,也可以根据需要编写自己的事件处理程序。
事件处理程序一般包括以下几个基本步骤:读取事件数据、执行相应的操作、更新界面或数据等。
不同类型的事件处理程序细节略有不同,但总体逻辑相似。
接下来,我们来看一下事件结构的具体用法。
1.使用事件结构实现面板控件的响应使用事件结构可以实现对面板控件的响应。
例如,我们要在按下按钮时执行某个操作,只需要在事件结构中选择该按钮控件作为事件源,然后编写相应的事件处理程序即可。
这样,只要用户按下该按钮,就会自动触发相应的事件处理程序。
2.使用事件结构实现VI的响应除了对面板控件进行响应外,事件结构还可以实现对整个VI的响应。
在新建事件结构时,可以选择VI作为事件源,然后编写响应程序。
这样,只要该VI被调用,就会自动触发相应的事件处理程序。
3.使用事件结构实现硬件设备的响应通过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的不同位置多次为 指示赋值;或多次从控制中取出数据;或者 为控制赋值,从指示中取出数据。
event提高:LabVIEW事件结构编程
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设计模式汇总本文归纳了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程序设计模式(四)—状态机和事件结构的结合
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代表的币值作为参数传递给函数。
LabVIEW事件结构
事件分支标签
事件数据节点
图 1 事件结构
事件过滤节点
用户界面事件分为消息事件和过滤事件两种。
1
LabVIEW
LabVIEW 中级教程
消息事件
消息事件指一个用户的行为已经发生,使用消息事件来反馈一个已经发生的事件,
并且 LabVIEW 已经对它迚行了处理。例如,“鼠标按下”就是一个消息事件,图
事
添加事件分支,事件源选择“本 VI”,事件选择“键按下”。
使用一个显示控件查看按下“↑、←、↓、 →”键所分别对应的扫描码。
添加条件结构,为“↑、←、↓、 →”添加不同的条件分支(扫描码作为判 据),设置不同的字符串作为“按键记录”的输出,并删除上个步骤中创建是显示 控件。
3、使用过滤事件,实现程序运行时,前面板一直保持打开的功能。
2 中的事件结构的分支程序实现了用户用鼠标点击停止按钮,按下后停止程序的功
能。这个事件是在用户释放鼠标以后 LabVIEW 迚行处理的。
件
结
构
编
程
图 2 消息事件
过滤事件
过滤事件在用户行为发生之后,LabVIEW 处理该事件之前先告知用户,由用户来 决定程序接下来如何处理事件,有可能处理的方式与默认的处理不同。过滤事件有 什么好处?使用过滤事件以后,用户可以随时按需要修改程序对事件的处理,甚至 可以完全放弃该事件,而对程序不产生影响。例如:“前面板关闭?”就是一个过 滤事件(过滤事件后面都有一个?)。图 3 中的事件结构实现放弃对“前面板关 闭?”这一事件的响应,从而将这一事件过滤。
5
结
“轮询”的方式来检测事件的发生,但这样会大大消耗 CPU 的使用时间,不利于
构
处理复杂、多线程的程序。因此,事件结构允许将 CPU 的使用降低到最小,但又
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后该分⽀⾃动赋真值给结束按钮。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/forum.php?mod=viewthread&tid=207837
使用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循环,无论有多少事件发生只能对第一个发生的事件进行处理,处理完后程序将退出事件结构。
菜单选项事件结构实例
2011-11-11 09:50 上传下载附件(8.79 KB) NI USB-9219是一款4通道通用C系列模块,专为多功能测试而设计。
USB-9219能够测量传感器中的多种信号,如压力计、RTD、热电偶、测压元件和其他需要供电的传感器。
由于通道接受单独选择,4条通道可以分别进行不同类型的测量。
测量范围随测量类型而异,包括±60 V最大电压范围和±25 mA最大电流范围。
第1步、创建一个项目:综合参数测量仪
按照我的设计习惯,首先在桌面上创建一个新的文件夹,命名为《综合参数测量仪》。
然后,打开、运行LabVIEW开发环境,并选择开发环境中的:新建》项目。
此后,在“项目浏览器”就可以看到一个新建的项目:"未命名项目1"。
单击项目浏览器:文件》保存,并将该项目命名为:“综合参数测量仪”后,存放到桌面上的《综合参数测量仪》文件夹中。
此时,项目创建完毕。
第2步、创建一个主vi:综合参数测量仪.vi
2011-11-11 09:41 上传下载附件(14.71 KB) 打开刚刚新建的“综合参数测量仪”项目,然后用鼠标右击该项目中的”我的电脑“选择:新建》VI,即创建了一个新的vi。
用鼠标点击新vi的:文件》保存(命名为:综合参数测量仪.vi)。
主vi即宣告创建完毕。
如例图所示。
第3步、设置“综合参数测量仪.vi”的属性
2011-11-11 09:41 上传下载附件(20.2 KB) 打开刚刚创建的“综合参数测量仪.vi”,用鼠标点击:文件》VI属性,该vi的属性对话框弹出,如例图所示。
也就是设置主vi的属性。
2011-11-11 09:41 上传下载附件(19.26 KB) 在“类别”窗口选择属“窗口外观”,设定:“窗口标题”和“自定义”选项,见例图。
2011-11-11 09:41 上传下载附件(28.61 KB) 用鼠标点击上图中的“自定义”按键,进入“自定义窗口外观“对话框。
按例所示的方式选择各单元参数设定后,连续点击”确定“按键后,退出”VI属性“设定对话框。
2011-11-11 09:41 上传下载附件(8.63 KB) “综合参数测量仪.vi“的属性基本设定完毕,在该vi的程序框图上,先创建一个While循环,并放置“停止”按键来控制这个While 循环。
然后,点击前面版上的运行按钮,程序开始运行,如例图所示。
此时看到“综合参数测量仪”的前面版的上部保留了一个菜单栏,但内容不是我们所期望的。
现在,按我们所要求的菜单栏来进行新的设计。
第4步、编辑设计菜单栏
2011-11-11 09:41 上传下载附件(17.75 KB) 在该vi的前面板选择:编辑》运行时菜单,此时系统弹出“菜单编辑器”对话框,选择“自定义”、“用户项”则可以进行自定义的菜单设计。
2011-11-11 09:41 上传下载附件(20.57 KB) 下面就来设计运行时菜单,首先在上图所示的“菜单项名称”一栏添入第一个菜单项目:“直流电压测量”,然后,点击“+”按键。
项目菜单创建完成,在预览栏目中显示出第一个菜单项“直流电压测量”。
2011-11-11 09:41 上传下载附件(25.15 KB) 下面添置该项目下的子菜单(如果没有子菜单,
那么重复上述步骤进入下一个项目菜单的设计)。
点击“右移”键,进入子菜单选项,在“菜单项名称”一栏添入:
“60V电压测量”,点击“+”
“15V电压测量”,点击“+”
“4V电压测量”,点击“+”
“1V电压测量”,点击“+”
“125mV电压测量”,点击“+”。
然后点击“左移”按键,准备下一个项目菜单的设计。
如例图所示。
2011-11-11 09:41 上传下载附件(29.3 KB) 在“菜单项名称”一栏添入:“直流电流测量”。
然后点击“+”键以及“右移”键,继续在“菜单项名称”一栏添入子菜单名:“25mA 电流测量”。
如图所示。
2011-11-11 09:41 上传下载附件(37.22 KB) 点击“+”键及“左移键”后,在“菜单项名称”一栏添入:“电阻测量”。
然后,点击“+”键及“左键”,在“菜单项名称”一栏添入子菜单名:
“两线电阻测量”
“四线电阻测量”两个子菜单。
同样,设定主菜单为:RTD温度测量,子菜单为:
三线RTD温度测量
四线RTD温度测量
同样,设定主菜单为:热电偶温度测量,子菜单为:
K型热电偶温度测量
J型热电偶温度测量
S型热电偶温度测量
同样,设定主菜单为:应变测量,子菜单为:
1/4桥应变测量
半桥应变测量
全桥应变测量
至此,菜单设计完成,见例图。
2011-11-11 09:41 上传下载附件(13.69 KB) 关闭“菜单编辑器”试运行一下程序,状态见例图。
第5步、结合事件结构设计菜单选项的程序
2011-11-11 09:41 上传下载附件(14.24 KB) 首先,在“综合参数测量仪”的程序框图中的While循环里,添加一个”事件“结构。
从图中可以看出,目前该事件结构只有一个事件源:”超时“。
用鼠标右键点击事件结构的边框,在弹出的快捷菜单上,选择:“添加事件分支…”,在编辑事件对话框中,事件源选择“控件、停止,鼠标按下事件”。
单击“确定”按键,这时就多了一个“停止”事件源。
此时,我们可以将“超时”事件删除。
并该程序进行修改,首先将“停止”按键的图标移动到While循环外,然后在该事件结构中放入一个“真”的布尔常量,连接到While 循环的停止端子上,如下图所示。
2011-11-11 09:41 上传下载附件(16.07 KB) 此时,在运行该程序后,用鼠标点击“停止”按钮,程序将会停止下来。
看来程序已经响应了这个停止运行的“事件”发生。
下面我们来设计有关”菜单事件“的程序单元。
2011-11-11 09:41 上传下载附件(26.6 KB) 用鼠标右键单击事件结构的边框,会弹出一个快捷菜单,选择:添加事件分支...后会弹出一个新的“事件编辑”对话框。
在此对话框中:
事件源选择:本VI;
事件选择:菜单选择(用户),则创建了用户菜单的事件分支。
在用户菜单的事件分支放置一个case结构,并将所有的子菜单名字写入case选择器标签中。
同时,将“分支选择器”与“项标识符”相连。
2011-11-11 09:41 上传下载附件(20.94 KB) 此后,只要在子菜单的相应分支中放置事件处理程序(动态调用相应的子vi)既可实现菜单的事件处理。
下面给出调用“60V电压测量“的简单例子。
这里动态调用的子vi,与上一节中介绍的动态调用子vi相同。
动态调用的过程也一致。
就不多谈了。
2011-11-11 09:41 上传下载附件(18.09 KB) 调用“60V电压测量“子vi。
该子vi的程序框图见例图(示意图,只有一个While循环和停止按键)。
所有这些项目和子项目vi,都应保存在项目的目录下。
结合应用项目的设计,运行时菜单事件设计方法已经基本示意完成了(包括子vi的动态调用),只是所有子菜单中的测量程序框图都没有给出,需要读者自行设计(如果有机会可能后边还会继续介绍)。
事件结构注意事项:
事件结构最适合人机对话界面的设计,不适合在事件处理过程中运行复杂的程序。
比如:我们通过事件结构来进行动态调用复杂的运行程序,此时主程序前面版被“关闭”,直到复杂应用程序运行完成后,返回到主程序才可以响应新的事件发生(事件响应和处理的“握手”关系,换句话说,程序处理时也同时屏蔽了其它菜单事件的响应)。
这样可以避免事件的“记忆”和“堆积”。
了解更多labview事件结构请进入:/topic-labviewevent.html
PCB打样找华强 样板2天出货。