LabVIEW之生产者-消费者模式--队列操作
LabVIEW程序设计模式(五)—生产者消费者模式(3)_LabVIEW程序的动态调用
LabVIEW程序设计模式(五)—生产者/消费者模式(3)_LabVIEW程序的动态调用LabVIEW程序设计2009-05-19 17:11:09 阅读696 评论0 字号:大中小订阅简单而言,动态调用指的是通过程序控制另外一个程序的运行、停止、赋值和获取值等。
LabVIEW提供了多种动态调用的方式,从底层而言是通过VI Server 技术实现的。
图31所示为LabVIEW中的Application Control选板,动态调用所使用的节点都位于这个选板。
当调用一个在硬盘、内存甚至是网络路径上的vi时,首先要使用Open VI Reference以将该VI载入内存并获取VI的“句柄(Reference)”;然后再使用该句柄进行其它的控制操作;最后再关闭该VI的句柄避免内存泄漏,这就完成了一次对VI的调用。
图31 Application Control选板图32是一个动态调用的具体实现代码,首先使用Open VI Reference获取被动态调用VI的Reference(例子中是C:\average.vi);再使用Call By Reference Node 节电动态运行该VI;最后关闭VI的Reference。
在使用Call By Reference Node 时需要事先指定被调用VI的输入输出接口,也就是说这种动态调用的前提是必须知道被调用VI的输入输出接口,否则无法进行动态调用。
图32 VI的动态调用Open VI Reference的路径输入是一个多态的输入口,也可以使用String输入,如图33所示。
此时被调用的VI必须在内存中,且输入的是被调用VI的文件名。
值得一提的是这种“文件名”调用方式在可执行程序中是无法被调用的,因此建议最好采用路径的调用方式。
图33 Open VI Reference的多态性【应用5】本例将使用LabVIEW的动态调用方式实现斐波那契数列(Fibonacci数列)。
labview生产者消费者
生产者/消费者模式(1)_前言statemice的LabVIEW程序设计模式(五)—生产者/消费者模式(1)_前言再次回顾“基本状态机模式”的6个缺点,只剩下第6个缺点无法在上述的“状态机和事件结构的结合模式”中被解决。
(1) 任何时刻只能有一个状态在运行这个问题也许有些多余,但是在实际的应用中往往又是最常见的。
大多数比较复杂的应用至少应该有“菜单”和“采集”两个状态,如果数据采集程序在运行时仍然希望系统能够处理菜单的事件,这是在传统的状态机或者事件结构中无法实现的。
因为无论是状态机结构还是事件结构,都是由一个循环组成的,不同的状态是无法同时被响应和处理的。
解决这个问题的方式也比较简单,LabVIEW本身就是一种多线程的程序设计语言,可以再加一个循环或者另外开一个程序独立运行。
但是这样也会带来一些新的问题,比如:(1) 两个循环(程序)之间如何交换和共享数据。
(2) 两个循环(程序)都有着独立的错误处理系统,它们之间是如何协调的。
(3) 两个循环如何分工呢?应该以哪种方式对状态进行分类以将不同的状态放置在不同的循环(程序)中?(4) 一个程序如何控制另一个程序的运行和停止。
在上面提出的4个问题中,对循环和程序这两个解决方案而言,第(1)~(3)个问题的解决方式是一样的。
只有第(4)个问题是专门针对两个程序而言的,在LabVIEW中这种不同程序之间的相互调用称为“程序的动态调用”。
生产者/消费者模式(2)_VI的可重入性(Reentrant Execution)statemice的LabVIEW程序设计模式(五)—生产者/消费者模式(2)_VI的可重入性(Reentrant Execution)在介绍VI的动态调用之前有必要对LabVIEW在执行VI过程中的规则有个大致的了解。
众所周知,LabVIEW是通过VI的文件名(VI Name)来表示独立的VI的,并不是VI的路径。
因此,LabVIEW不允许具有相同名字的VI同时载入内存中,即使这些VI存储在不同的路径中。
labview 生产者消费者
生产者消费者模型主要是处理数据产生快难于即时处理的情形,其流程为首先通过初始化队列,再创建两个循环,一个用于入队,另一个用于出队。
网上的生产者消费者都过于复杂,这里用一个简单的例子。
这里入队数据为每1s入队一个数,而出队为每3s出一个数,数据产生的快适用于生产者消费者模型。
在进行生产者消费者设计时需要注意:
1、由于队列的数据类型是变体,需要用变体至其他数据类型的转变。
2、使用局部变量同时结束两个while循环,注意布尔控件的机械转换方式为
switch型。
3、同时需要注意的是在释放队列引用需在出队后面进行,如果在入队循环中进行
会导致,出队时队列不存在导致错误。
状态机
上一页
返回
8.2 状 态 机
• 状态机是LabVIEW 中常用且用途广泛的一个设计模型。用状 态机设计模型可以实现任何用状态图或流程图明确描述的算法。状态 机通常用于实现较为复杂的判断算法, 如诊断程序或过程监控。
• 状态机(更确切地说是有限状态机) 包含一组状态和映射下一状态 的转移函数。有限状态机有多个变量。最常用的两种有限状态机是米 勒型状态机和摩尔型状态机。米勒型状态机对于每一个状态变化产生 一个响应; 而摩尔型状态机是对状态转移图中的每一个状态产生一 个响应。LabVIEW 中状态机设计模型模板可以实现任何由摩 尔型状态机描述的算法。
上一页 下一页 返回
8.1LabVIEW 程序设计模式
• 从软件的角度看, 生产者是数据的提供方, 消费者是数据的消费方 。生产者和消费者之间存在一个数据缓冲区, 大小一般是固定的。 当生产过剩而消费不足的情况下, 缓冲区的剩余空间不断减小直至 耗尽。当缓冲区无剩余空间时, 生产者必须停止生产, 一直等到缓 冲区出现剩余空间时再继续生产; 反之, 当消费能力大于生产的时 候, 缓冲区内的数据会逐渐减少, 直至缓冲区中再无数据可用。此 时, 消费者处于等待状态。如图8-3 所示, 生产者、消费者设计 模式常常是多个生产者提供数据, 一个消费者使用或者处理数据。 因为消费者使用数据的时候, 队列中的数据已经被取出, 所以在存 在多个消费者的情况下, 消费者所消费的将会是不同的数据。
上一页 下一页 返回
8.1LabVIEW 程序设计模式
• 队列消息处理器的最大优点是一次可以发送多条消息, 形成消息队 列。每次循环, 删除最先进入数组的元素即下消息, 同时取出被删 除的元素, 并执行相应的消息处理分支。队列消息处理器至少需要 两个分支, 即“无事件发生” 和“退出分支”。其中, “无事件发 生”必须是默认状态。当队列中无消息时, 取出的字符串为空, 执 行默认分支。
labview栈和队列——同步控制技术——栈与队列
labview 栈和队列——同步控制技术——栈与队列labview 栈和队列——同步控制技术——栈与队列在计算机编程中栈是一个很重要的概念,尤其在汇编语言中,需要不断进栈和出栈的操作.栈是限定在一个表的尾端进行插入(进堆栈)和删除(出堆栈)的线性表.是后进先出结构(LIFO).队列的定义和栈的定义是类似的,区别是数据是先进先出(FIFO)labview还有一个概念缓冲区BUFFER,典型的比如CHART,它默认保存数据长度是1024.BUFFER的概念和队列是非常相似的,都是一个先进先出的结构.如果我们设定队列的数据长度也是1024.比较一下他们的区别.区别一:未达到设定开始的时候,队列和缓冲区中都是没有数据的,当有数据进入的时候,队列和缓冲区中的数据在不断地增加,对于缓冲区,因为未达到它最大许可的长度 1024,因此数据是不断第增加的,队列则不同,它的数据是否增加取决于是否有读队列的过程,就是所说的出队,如果出队的速度大于入队的速度,队列中则根本不会有数据.如果没有出队的过程或者出队的速度小于入队的过程,队列中的数据也是不断地增加的.这是第一个区别.区别二:到达设定值当队列和BUFFER都达到了1024个数据后,这时再有新的数据要进来,队列和BUFFER的表现是不同的,对于BUFFER,它将自动挤出(形象的说法,当然也是编程实现的)最早进入BUFFER的数据,所谓先进先出.而队列则不同.要求进入队列的线程只能被动等待,一直到队列中有别的线程取出数据,队列中有空闲位置.所以队列有调节读写速度线程的能力.相同点一:数据进入都是在尾部,(队列插入如果在头部,就编程上面所说的栈了) 相同点二:对于中间数据都实现了有效的封装,你无法直接提取中间的某个数据,你可以读出中间的数据,但是不能改变当前BUFFER和队列的值.LABVIEW提供的队列的功能函数(包括栈),在逐点分析库提供了DBL型的BUFFER,在另外的文章中专门提到了,这里就不多说了.LV队列的函数是基本函数,无法进行深入跟踪,估计应该是采用C++的算法然后封装的,我实际测试过,它的运行效率远高于用数组的方式构成的队列,为了详细说明队列和栈的细节,我还是用数组的形式,然后在介绍LV的队列函数.首先看看如何用数组实现栈的功能:栈的操作是非常简单的,只有压栈和出栈两个操作(PUSH AND POP)我们用AE来实现它.分成三个action: Init,Push ,Pop首先严格自定义,,,,,表示三个动作(这样我们就完成了栈的AE的制作过程。
LabVIEW中队列的使用教学PPT课件
错误输出包含错误信息。该输出提供标准
错误输出。
9
-
7 队列最前端插入元素
队列是队列引用。 通过获取队列引用函数 获取队列引用。
元素是要加入队列前部的元素。 数据类型 可匹配队列的子类型。
超时毫秒表明队列满时函数等待队列中可 用空间的时间,以毫秒为单位。 默认为– 1,即永不超时。 错误输入(无错误)表明节点运行前发生
队列的使用
1
-
一 队列操作函数介绍
队列操作函数用于创建在同一程序框图的不同部分间或不同 VI间进行数据通信的队列,队列操作函数可缓冲数据。
选板对象说明
队列最前端插入元素在队列前端添加元素。
获取队列引用返回队列的引用。
获取队列状态返回队列的当前状态信息(例如,当前队列中
2 的元素个数)。
-
4
-
2 元素入队列
在队列后端添加元素。
队列是队列引用。
元素是添加至队列末尾的元素。 数据类型 可匹配队列的子类型。
超时毫秒表明队列满时函数等待队列中可 用空间的时间,以毫秒为单位。 ,
超时?输出的值为TRUE。
错误输入(无错误)表明节点运行前发生 的错误。
队列输出是对未改动队列的引用。
超时?如函数超时并且队列中没有可用空 间或出现错误,则值为TRUE。
错误输出包含错误信息。该输出提供标准 错误输出。
8
-
6 有损耗元素入队列
在队列中添加元素。如队列已满,函数将通过删除队列前端的元素 使新元素入队。不同于元素入队列函数,该函数可立即执行元素入 队操作。通过获取队列函数可设置队列的最大尺寸。
队列是队列引用。
元素是添加至队列末尾的元素。 数据类型 可匹配队列的子类型。
labview生产者消费者
生产者/消费者模式(1)_前言statemice的LabVIEW程序设计模式(五)—生产者/消费者模式(1)_前言再次回顾“基本状态机模式”的6个缺点,只剩下第6个缺点无法在上述的“状态机和事件结构的结合模式”中被解决。
(1) 任何时刻只能有一个状态在运行这个问题也许有些多余,但是在实际的应用中往往又是最常见的。
大多数比较复杂的应用至少应该有“菜单”和“采集”两个状态,如果数据采集程序在运行时仍然希望系统能够处理菜单的事件,这是在传统的状态机或者事件结构中无法实现的。
因为无论是状态机结构还是事件结构,都是由一个循环组成的,不同的状态是无法同时被响应和处理的。
解决这个问题的方式也比较简单,LabVIEW本身就是一种多线程的程序设计语言,可以再加一个循环或者另外开一个程序独立运行。
但是这样也会带来一些新的问题,比如:(1) 两个循环(程序)之间如何交换和共享数据。
(2) 两个循环(程序)都有着独立的错误处理系统,它们之间是如何协调的。
(3) 两个循环如何分工呢?应该以哪种方式对状态进行分类以将不同的状态放置在不同的循环(程序)中?(4) 一个程序如何控制另一个程序的运行和停止。
在上面提出的4个问题中,对循环和程序这两个解决方案而言,第(1)~(3)个问题的解决方式是一样的。
只有第(4)个问题是专门针对两个程序而言的,在LabVIEW中这种不同程序之间的相互调用称为“程序的动态调用”。
生产者/消费者模式(2)_VI的可重入性(Reentrant Execution)statemice的LabVIEW程序设计模式(五)—生产者/消费者模式(2)_VI的可重入性(Reentrant Execution)在介绍VI的动态调用之前有必要对LabVIEW在执行VI过程中的规则有个大致的了解。
众所周知,LabVIEW是通过VI的文件名(VI Name)来表示独立的VI的,并不是VI的路径。
因此,LabVIEW不允许具有相同名字的VI同时载入内存中,即使这些VI存储在不同的路径中。
labview主/从设计模式和生产者/消费者设计模式
5.2 LabVIEW设计模式——主/从设计模式和生产者/消费者设计模式在上一节中曾经谈到过,NI LabVIEW 中提供了六种最基本的设计模式。
本节首先介绍其中的两种:主/从设计模式与生产者/消费者设计模式(Master/Slave design pattern and Producer/Consumer design pattern)。
这是由于这两种设计模式在结构上极为相似(使用的内置函数不同),所以我们在这里将一起来讨论(基本结构参见图5.2-1、图5.2-2)。
图5.2-1 主/从设计模式图5.2-2 生产者/消费者设计模式5.2.1 主/从设计模式(Master/Slave design pattern)与主/从设计模式的相关内置函数(Notifier_通知)参见下图所示。
图5.2.1-1 主/从设计模式内置函数(通知)关于这些内置函数的定义和使用方法请参考LabVIEW Help文件,这里就不再进行讨论了。
对于绝大多数LabVIEW的学习者来讲,仅仅依据这些主/从操作提供的内置函数(通知),即便是借助于帮助文件也很难理解和设计出正确的应用程序代码或基本架构。
因为这些内置函数的内部程序代码是不对外开放的、不公开的,所以我们也就很难理解的更准确或更全面。
那么如何正确的使用它们呢?通常有两个最简单、最直接的方法可以解决这个问题:一是,查看NI给出的设计模式或例程;二是,查看其它使用者所提供的实用例程。
其实,这里也再次间接的告诉大家,更多查看和理解其它LabVIEW开好者所提供的实用例程是学习LabVIEW的最好方法之一。
通过图5.2-1,就可以初略地领会到NI 基于数据流的图形化代码主/从设计模式的表达形式或架构。
从图5.2-1中,可以看到主/从设计模式的基本构成是:包括了两个While循环(上面为主循环、下面的为从循环)和若干个“通知”内置函数(Notifier)构成。
主循环中的Case 结构用来确定是否向从循环发出通知。
LabVIEW程序设计模式(五)—生产者消费者模式(4)_生产者消费者循环
LabVIEW程序设计模式(五)—生产者/消费者模式(4)_生产者/消费者循环本节将使用“多循环”来解决程序并行运行的问题,那么程序中的两个循环如何进行数据交互和共享呢?最普通的方式是采用全局变量或局域变量,但是当两个循环执行的速率不相等时,必然会造成数据的丢失或重复。
如前所述,LabVIEW提供了队列操作函数,允许数据的发送者和接受者之间建立一条缓冲通道,这样就避免了循环不同步带来的影响。
如图37所示,将整个过程与供水系统进行类比,在数据产生/采集端(供水局)产生数据后,并不直接向终端用户供水,因为前者产生水的速率与后者消耗水的速率并不相同。
此时需要建造蓄水池将供水局产生的水放入到蓄水池中,同理获取的数据也放入该缓冲区中。
当终端用户需要用水时,直接从蓄水池中获取就可以了,同理在进行数据显示和分析时直接从数据缓冲区中获取就可以了。
图37 生产者/消费者模型当然,上面的模型也会存在一个问题:数据缓冲区/蓄水池的容量?假定供水局不停地产生自来水,而终端用户却不消耗水,这样便会导致蓄水池装满而溢出。
反之当终端用户耗水量太大时,导致没有水可用。
LabVIEW中的队列函数提供了一种很好的方式规避了这个问题,由于队列中的元素是“先进先出”的,因此确保了接收到的数据是有序的。
在LabVIEW的队列操作中(入列和出列函数),提供了timeout选项以处理数据缓冲区的溢出或不足。
当数据溢出时,入列函数(数据进入队列)将停止发送数据(处于等待状态),直到缓冲区存在数据空间或者达到了timeout设置的时间;而当数据不足时,出列函数(数据流出队列)将停止接收数据(处于等到状态),直到缓冲区进入了新的数据或者达到了timeout设置的时间。
【应用6】本例将演示生产者/消费者循环的一些基本特性和队列操作的特点。
如图38所示,生产者与消费者之间传递的数据是一个连续的sine波形,二者靠大小为20个点的缓冲区连接。
右下角是“停止”按钮,用户控制程序的停止执行。
LabVIEW学习日记
1.1 生产者/消费者设计模式概念生产者/消费者设计模式包括多个并行循环,每个循环以不同的速率执行任务。
一个循环作为生产数据的循环,其他循环作为消费数据的循环。
生产数据的循环控制所有消费数据的循环,并且使用通信技术与它们进行通信。
2011.9.171.生成EXE文件步骤:点击“工具”——>点击“通过VI生成应用程序(EXE)…”——>弹出下面对话框选择存放目录——>点击“继续”在该对话框中选中左面的“信息”点击右边的“目标目录”更改目录点击“当前目录”,该对话筐还有其他设置。
点击“生成”出现如下对话框,就可以在对应位置找到*.exe文件。
2.电压电流采集的实现前面板如下图:程序框图如下:主要用到了labview功能模块中的DAQmx-数据采集中的几个模块:1、DQAmx创建任务:这个函数用来创建一个DAQmx数据采集任务2、DAQmx创建通道(AI-电压-基本):这个函数是新建虚拟通道函数,对最大值、最小值、单位、通道等参数进行设置。
3、DAQmx创建通道(AI-电流-基本):同DAQmx创建通道(AI-电压-基本)4、DAQmx定时(采样时钟):主要是对采样频率进行设置。
连续采样时的缓冲区大小。
5、DAQmx读取(模拟2D DBL N通道N采样):是一个读数据函数,用来从指定的通道或任务读取数据的数据。
这里用到循环结构实现连续采集。
6、DAQmx清除任务:VI将终止该任务,并且不能使用该任务的资源。
注:1、一个任务可以有多个通道如可以同时采集电压和电流等,但不能选择不同类型如模拟输入、数值输入。
2、注意电压电流的最大值和最小值范围。
电压:-10v~10v,电流:-0.01A~0.01A。
绘制VI曲线程序框图:在前面程序框图基础上的DAQmx读取函数的数据输出端,将二维数据(行代表通道这里就是电压,电流)拆分为两个一维,绘制成VI 曲线。
1、调用索引数组函数行数,提取电压和电流数据。
labview生产者消费者基础知识
燕山大学课程设计说明书题目:LABVIEW程序设计模式——生产者/消费者学院(系):电气工程学院年级专业:生物医学工程 1班学号: ************学生姓名:***指导教师:**燕山大学课程设计(论文)任务书院(系):电气工程学院基层教学单位:生物医学工程系说明:此表一式四份,学生、指导教师、基层教学单位、系部各一份目录第一章同步VI和函数 (1)1.1队列 (1)1.2通知器 (2)1.3集合点 (4)1.4信号量 (6)1.5事件发生 (8)第二章生产者消费者 (10)2.1状态机 (10)2.2事件结构 (11)2.3生产者消费者 (12)2.3.1组成与结构 (12)2.3.2分类 (12)2.3.3举例说明 (14)第三章并行编程 (18)3.1任务化并行 (18)3.2数据并行化 (18)3.3流水线 (21)设计小结 (24)参考文献: (25)第一章同步VI和函数1.1队列概念:队列操作函数用于创建在同一程序框图的不同部分间或不同VI间进行数据通信的队列。
队列操作函数可缓冲数据。
应用举例:队列基础VI前面板注释:上面的波形是随机产生的数据波形,“入队列速度”可以调节随机数产生的速度;下面的波形是通过队列读取随机波形的数据而生成的波形,“出队列速度”可以调节其读取队列中数据的速度。
“队列中元素”是下面波形未来得及读的数据,“队列大小”可以调节队列的容量。
程序框图注释:1)创建Data队列,设置数据类型和大小。
2)左上方循环-生成并传递数据至“元素入队列”函数。
通过“等待(ms)”函数控制循环速度,选择等待100ms或500ms。
“释放队列引用”执行时停止循环。
此时队列已不存在,进行元素出队列操作将产生错误。
3)下方循环-返回队列中元素的个数,并通过属性节点将数据传递至波形图表。
如按下停止按钮或“获取队列引用”函数发生错误,循环将停止。
循环停止时,将调用“释放队列引用”函数,终止其它两个循环,同时报告“获取队列引用”函数可能发生的错误。
LabVIEW中队列的使用教学课件
02
创建队列
创建队列的方式
使用LabVIEW的函 数面板中的“队列操 作”子面板创建队列 。
在程序运行时,通过 调用队列的构造函数 来创建队列。
使用“创建队列”函 数创建一个新的队列 。
队列的属性设置
队列名称
为队列指定一个唯一的名称,以 便在程序中引用。
队列大小
设置队列的最大容量,以防止队列 溢出。
LabVIEW中队列的使用教 学课件
• LabVIEW与队列简介 • 创建队列 • 队列操作 • 队列的应用实例 • 常见问题与解决方案 • 总结与展望
01
LabVIEW与队列简介
LabVIEW概述
01
02
03
图形化编程语言
LabVIEW使用图形化编程 语言G,通过拖拽图标和 连线来编写程序。
数据缓冲是一种常见的队列应用场景,用于在数据处 理过程中进行数据存储和传输。在LabVIEW中,可 以使用队列来实现数据缓冲。
在LabVIEW中,可以使用`Queue`函数来创建队列, 并使用`Write Queue`和`Read Queue`函数来向队列 中写入和读取数据。
任务调度
任务调度是一种常见的队列应用场景, 用于管理多个任务之间的执行顺序和优 先级。在LabVIEW中,可以使用队列
异步通信
队列常用于异步通信,不同线程或进 程之间通过队列传递数据。
LabVIEW中队列的用途
数据传输
队列用于在不同VI(虚拟 仪器)之间传输数据,实 现数据流的同步和异步处 理。
事件驱动
队列可以用于事件驱动编 程,根据队列中的事件触 发相应的操作或处理流程。
多线程处理
通过队列可以实现多线程 之间的通信和同步,提高 程序的并行处理能力。
LabVIEW 编程模式
LabVIEW 软件工程方法一、LabVIEW 编程模式编程模式,是指一些固定有用的程序结构模式,是编程经验的总结和提炼,并经过了多次成功验证。
使用被广泛接受的编程模式设计出的应用程序,很容易被其他开发人员读懂或修改,也是软件重用的重要基础。
常见的LabVIEW编程模式主要有状态机模式(Staste Machine)、队列消息模式(QueuedMessage Handler)、用户界面事件模式(UI Event Loop)、主/ 从结构模式(Master/Slave)和生产者/ 消费者模式(Producer/Consumer)等。
这5 种模式应用的非常普遍,并且在LabVIEW中,也可以较为方便地实现这5 种编程模式。
状态机模式是LabVIEW 程序设计中最常用的设计模式之一。
它可以用来清晰地实现任何以状态图描述的算法,它的每一种状态对应一种相应的操作。
状态机常用在决策算法中。
例如诊断、监测和控制等。
图1 所示为LabVIEW状态机程序框图的主框架。
由图1 可知,LabVIEW 标准状态机主要由一个While 循环和一个Case 结构构成,并利用移位寄存器来实现状态的跳转。
为了方便编程,可采用Typedef 来实现状态枚举值,这样当需要修改程序状态时,只需要改变Typedef 就可以改变所有的枚举变量。
图1 标准状态机程序框图队列消息模式同状态机模式有些类似,这种模式通常被用于需要特定处理顺序的场合。
用户界面事件模式采用事件结构来响应用户的操作,这种交互方式可以处理诸如鼠标移动、键盘操作、值改变等事件。
由于事件捕获的方式是采用中断方式实现的,因而避免了轮询导致的CPU 资源的浪费,而且会自动产生事件队列,避免了事件的丢失。
但由于它必须执行完前一个事件后才能执行下一个事件,因此任何一个事件结构的执行时间必须尽量地短,以避免用户的误操作。
主/ 从结构模式通常应用于同时有两个或多个以不同频率运行的循环并且循环之间存在有信息交换时的场合。
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中队列的使用教学课件
3
2021/5/27
二 队列操作函数细部说明
1 获取队列引用
队列最大值是队列要保持的元素的最 大数量。 名称包含要获取或创建的队列的名称。 元素数据类型是需要队列包含的数据 类型。 该输入端可连线任意数据类型。 如未找到是否创建?指定名称指定的 队列不存在时,是否创建新的队列。 错误输入(无错误)表明节点运行前 发生的错误。 队列输出是对已有队列或函数创建的 新队列的引用。 新建?函数创建新的队列时,值为 TRUE。 错误输出包含错误信息。
2
2021/5/27
清空队列清除队列中的所有元素并通过数组返回元素。 释放队列引用释放队列引用。
有损耗元素入队列在队列中添加元素。如队列已满, 函数将通过删除队列前端的元素使新元素入队。不同 于元素入队列函数,该函数可立即执行元素入队操作。 通过获取队列函数可设置队列的最大尺寸。
预览队列元素返回队列前端的元素且不删除该元素。 元素出队列将元素从队列前端删除并返回该元素。 元素入队列在队列后端添加元素。
错误输入(无错误)表明节点运行前发生的错误。
队列最大值是队列能包含的队列名称是队列的名 称。 队列输出是对未改动队列的引用。
待处理删除数量是“元素出队列”或“预览队列 元素”函数当前等待从队列中删除的元素。
待处理插入数量是当前等待将元素插入队列的函 数的数目。 错误输出包含错误信息。
队列中元素数量返回当前队列中元素的数目。
错误输出包含错误信息。该输出提供标准
错误输出。
9
2021/5/27
7 队列最前端插入元素
队列是队列引用。 通过获取队列引用函数 获取队列引用。
元素是要加入队列前部的元素。 数据类型 可匹配队列的子类型。
超时毫秒表明队列满时函数等待队列中可
LabVIEW之生产者-消费者模式--队列操作
LabVIEW之生产者/消费者模式--队列操作本文章主要是对学习LabVIEW 之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列、事件、状态机、生产者-消费者模式,这几种技术在在本章中都会有侧重点的进行介绍和总结!队列同步技术-操作函数同步控制技术可以实现在多个VI 之间或者同一VI 不同县城之间同步任务和交换数据;在LabVIEW 中提供了同步函数选板,包括通知器、队列、信号量、集合点、事件、首次调用函数,本文主要关注同步控制技术之队列技术:队列操作函数:1 获取队列引用函数2 “元素入队列”和元素出队列函数函数作用:将元素入队列和出队列用(没什么好说的!)超时毫秒(-1)端子:如果未连接,默认输入值为-1,表示永不超时,如果队列满,则一直等待直到队列有空位为止;如果连接端子,则新元素等待设定时间后仍无法入队列,则结束本次等待!3 最前端插入元素和有损耗元素入队列函数函数作用:将元素插入队列,不过插入队列方式有区别;元素入队列、最前端插入元素、有损耗元素入队列三者区别:元素入队列函数采用先入后出次序,而最前端插入元素函数则采用后入先出(FIFO)的原则,类似于堆栈,因此可以使用队列实现堆栈效果,相比数组实现有优势;元素入队列函数如果队列满,则线程等待,直到有空位为止;有损耗元素入队列在这种情况下则会自动删除队列前端元素,并在末端插入元素,可以用于实现缓冲区效果; 4 预览队列元素函数预览队列元素和元素出队列区别:当返回队列前段的元素时,是否删除该元素!5 获取队列状态函数:主要用于判定队列引用是否有效!6 清空队列和释放队列引用函数清空队列函数:清楚队列所有元素,并以数组形式返回元素,用于一次全部读取队列元素;队列课后练习 1 基于队列的数据采集系统在此程序设计中学习到的知识:1 数据类型和采用显示控件的关系:此队列的数据类型为一维数组,所以在元素出队列时的元素也为一维数组,因此要采用波形图空间;2 子程序VI 中设置了等待函数,但是没有while 循环,将子VI 放入while 循环中,相当于在while 循环中添加了等待函数,其实对其的理解可以从c 语言中加深理解;3 while 循环中停止条件的处理:对于入队列循环,停止只意味着本循环停止,但并不意味着整个程序停止运行了,因为还有两个循环在运行;对于元素出队列循环,当元素空的时候会发生超时错误,进而停止本循环;在元素出队列循环停止后会销毁队列引用,从而导致获取队列状态循环出错,进而停止循环。
精讲LabVIEW设计模式(XXXX)
– 当面板上事件发生时才被唤醒 – 自动执行相应事件框图内的事件代码 – 当处理完成相应事件后便结束,并不一直循环等
待
天津大学精仪学院
31
为什么要使用事件结构 ?
• 用更简单的事件处理替代原来的查询循环 • 最小化 CPU 的使用 • 不会遗漏用户界面交互事件 • 可检测更多的交互事件 • 编程生成您自己的事件
天津大学精仪学院
13
在LabVIEW下实现状态机结构
• While循环+Case结构 • 每一Case即为一个状态 • 当前状态中需有决定下一状态的判定代码 • 使用枚举常量通过移位寄存器传递至下一状态
天津大学精仪学院
14
工作流程
Case结构对每一状态都配备 一个分支
移位寄存器用于传递状态
初始状态
19
测试流程型状态机
DEMO3
1、解决顺序型状态机不便阅读和修 改的问题,采用枚举型常量。
2、采用自定义型控件,方便修改。
over
天津大学精仪学院
20
消息队列模式
“我需要执行一系列的事件步骤,但是步骤顺序可通过 编程决定的。”
步骤是由用户界面事件决定的,如某个应用程序共要处 理4个状态,分别是A,B,C和D,前面板有3个按钮分别 控制3种运行时的状态序列ABCD、DCAB和BDCA。
动态事件注册:何时产生何种事件
天津大学精仪学院
36
静态事件注册demo
天津大学精仪学院
37
动态事件注册4个步骤
1、获取要处理事件对象的VI服务器引用; 2、将VI服务器引用连接至“注册事件”函数; 3、将事件结构放在While循环中,等待处理 对象事件直到终止条件出现; 4、通过取消注册时间函数停止事件发生。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LabVIEW之生产者/消费者模式--队列操作
本文章主要是对学习LabVIEW 之生产者/消费者模式的学习笔记,其
中涉及到同步控制技术-队列、事件、状态机、生产者-消费者模式,这几种技
术在在本章中都会有侧重点的进行介绍和总结!队列同步技术-操作函数同步控制技术可以实现在多个VI 之间或者同一VI 不同县城之间同步任务和交换数据;在LabVIEW 中提供了同步函数选板,包括通知器、队列、信号量、集
合点、事件、首次调用函数,本文主要关注同步控制技术之队列技术:
队列操作函数:
1 获取队列引用函数
2 “元素入队列”和元素出队列函数
函数作用:将元素入队列和出队列用(没什么好说的!)超时毫秒(-1)端子:如果未连接,默认输入值为-1,表示永不超时,如果队列满,则一直等待直到队列有空位为止;如果连接端子,则新元素等待设定时间后仍无法入队列,则结束本次等待!3 最前端插入元素和有损耗元素入队列函数
函数作用:将元素插入队列,不过插入队列方式有区别;元素入队列、最前端插入元素、有损耗元素入队列三者区别:元素入队列函数采用先入后出次序,而最前端插入元素函数则采用后入先出(FIFO)的原则,类似于堆栈,因此可以使用队列实现堆栈效果,相比数组实现有优势;元素入队列函数如果队列满,则线程等待,直到有空位为止;有损耗元素入队列在这种情况下则会自动删除队列前端元素,并在末端插入元素,可以用于实现缓冲区效果; 4 预览队列元素函数
预览队列元素和元素出队列区别:当返回队列前段的元素时,是否删除该元素!5 获取队列状态函数:主要用于判定队列引用是否有效!。