LabVIEW之生产者-消费者模式--队列操作

合集下载

LabVIEW程序设计模式(五)—生产者消费者模式(3)_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生产者消费者

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 生产者消费者

labview 生产者消费者

生产者消费者模型主要是处理数据产生快难于即时处理的情形,其流程为首先通过初始化队列,再创建两个循环,一个用于入队,另一个用于出队。

网上的生产者消费者都过于复杂,这里用一个简单的例子。

这里入队数据为每1s入队一个数,而出队为每3s出一个数,数据产生的快适用于生产者消费者模型。

在进行生产者消费者设计时需要注意:
1、由于队列的数据类型是变体,需要用变体至其他数据类型的转变。

2、使用局部变量同时结束两个while循环,注意布尔控件的机械转换方式为
switch型。

3、同时需要注意的是在释放队列引用需在出队后面进行,如果在入队循环中进行
会导致,出队时队列不存在导致错误。

状态机

状态机

上一页
返回
8.2 状 态 机
• 状态机是LabVIEW 中常用且用途广泛的一个设计模型。用状 态机设计模型可以实现任何用状态图或流程图明确描述的算法。状态 机通常用于实现较为复杂的判断算法, 如诊断程序或过程监控。
• 状态机(更确切地说是有限状态机) 包含一组状态和映射下一状态 的转移函数。有限状态机有多个变量。最常用的两种有限状态机是米 勒型状态机和摩尔型状态机。米勒型状态机对于每一个状态变化产生 一个响应; 而摩尔型状态机是对状态转移图中的每一个状态产生一 个响应。LabVIEW 中状态机设计模型模板可以实现任何由摩 尔型状态机描述的算法。
上一页 下一页 返回
8.1LabVIEW 程序设计模式
• 从软件的角度看, 生产者是数据的提供方, 消费者是数据的消费方 。生产者和消费者之间存在一个数据缓冲区, 大小一般是固定的。 当生产过剩而消费不足的情况下, 缓冲区的剩余空间不断减小直至 耗尽。当缓冲区无剩余空间时, 生产者必须停止生产, 一直等到缓 冲区出现剩余空间时再继续生产; 反之, 当消费能力大于生产的时 候, 缓冲区内的数据会逐渐减少, 直至缓冲区中再无数据可用。此 时, 消费者处于等待状态。如图8-3 所示, 生产者、消费者设计 模式常常是多个生产者提供数据, 一个消费者使用或者处理数据。 因为消费者使用数据的时候, 队列中的数据已经被取出, 所以在存 在多个消费者的情况下, 消费者所消费的将会是不同的数据。
上一页 下一页 返回
8.1LabVIEW 程序设计模式
• 队列消息处理器的最大优点是一次可以发送多条消息, 形成消息队 列。每次循环, 删除最先进入数组的元素即下消息, 同时取出被删 除的元素, 并执行相应的消息处理分支。队列消息处理器至少需要 两个分支, 即“无事件发生” 和“退出分支”。其中, “无事件发 生”必须是默认状态。当队列中无消息时, 取出的字符串为空, 执 行默认分支。

labview栈和队列——同步控制技术——栈与队列

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课件

LabVIEW中队列的使用教学PPT课件

错误输出包含错误信息。该输出提供标准
错误输出。
9
-
7 队列最前端插入元素
队列是队列引用。 通过获取队列引用函数 获取队列引用。
元素是要加入队列前部的元素。 数据类型 可匹配队列的子类型。
超时毫秒表明队列满时函数等待队列中可 用空间的时间,以毫秒为单位。 默认为– 1,即永不超时。 错误输入(无错误)表明节点运行前发生
队列的使用
1
-
一 队列操作函数介绍
队列操作函数用于创建在同一程序框图的不同部分间或不同 VI间进行数据通信的队列,队列操作函数可缓冲数据。
选板对象说明
队列最前端插入元素在队列前端添加元素。
获取队列引用返回队列的引用。
获取队列状态返回队列的当前状态信息(例如,当前队列中
2 的元素个数)。
-
4
-
2 元素入队列
在队列后端添加元素。
队列是队列引用。
元素是添加至队列末尾的元素。 数据类型 可匹配队列的子类型。
超时毫秒表明队列满时函数等待队列中可 用空间的时间,以毫秒为单位。 ,
超时?输出的值为TRUE。
错误输入(无错误)表明节点运行前发生 的错误。
队列输出是对未改动队列的引用。
超时?如函数超时并且队列中没有可用空 间或出现错误,则值为TRUE。
错误输出包含错误信息。该输出提供标准 错误输出。
8
-
6 有损耗元素入队列
在队列中添加元素。如队列已满,函数将通过删除队列前端的元素 使新元素入队。不同于元素入队列函数,该函数可立即执行元素入 队操作。通过获取队列函数可设置队列的最大尺寸。
队列是队列引用。
元素是添加至队列末尾的元素。 数据类型 可匹配队列的子类型。

labview生产者消费者

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主/从设计模式和生产者/消费者设计模式

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 结构用来确定是否向从循环发出通知。

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

LabVIEW之生产者/消费者模式--队列操作
本文章主要是对学习LabVIEW 之生产者/消费者模式的学习笔记,其
中涉及到同步控制技术-队列、事件、状态机、生产者-消费者模式,这几种技
术在在本章中都会有侧重点的进行介绍和总结!队列同步技术-操作函数同步控制技术可以实现在多个VI 之间或者同一VI 不同县城之间同步任务和交换数据;在LabVIEW 中提供了同步函数选板,包括通知器、队列、信号量、集
合点、事件、首次调用函数,本文主要关注同步控制技术之队列技术:
队列操作函数:
1 获取队列引用函数
2 “元素入队列”和元素出队列函数
函数作用:将元素入队列和出队列用(没什么好说的!)超时毫秒(-1)端子:如果未连接,默认输入值为-1,表示永不超时,如果队列满,则一直等待直到队列有空位为止;如果连接端子,则新元素等待设定时间后仍无法入队列,则结束本次等待!3 最前端插入元素和有损耗元素入队列函数
函数作用:将元素插入队列,不过插入队列方式有区别;元素入队列、最前端插入元素、有损耗元素入队列三者区别:元素入队列函数采用先入后出次序,而最前端插入元素函数则采用后入先出(FIFO)的原则,类似于堆栈,因此可以使用队列实现堆栈效果,相比数组实现有优势;元素入队列函数如果队列满,则线程等待,直到有空位为止;有损耗元素入队列在这种情况下则会自动删除队列前端元素,并在末端插入元素,可以用于实现缓冲区效果; 4 预览队列元素函数
预览队列元素和元素出队列区别:当返回队列前段的元素时,是否删除该元素!5 获取队列状态函数:主要用于判定队列引用是否有效!。

相关文档
最新文档