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经典PPT课件

13
.
第3章 LabVIEW的程序运行结构
3.1 两种不同的循环结构 3.2 定时结构 3.3 独特的条件结构 3.4 不和谐的顺序结构 3.5 禁用部分程序框图结构 3.6 局部变量、内置全局变量和函数全局变量 3.7事件结构
14
.
3.1 两种不同的循环结构
3.1.1 For循环的组成和特点 3.1.2 For循环与数组 3.1.3 For循环与移位寄存器 3.1.4 For循环中的continue和break 3.1.5 While循环不仅仅是循环 3.1.6 While循环与定时 3.1.7 反馈节点
28
.
4.8 几种常用的内存分析工具和方法
4.8.1 内存的重要性 4.8.2 内存和性能查看工具 4.8.3 VI 使用的内存 4.8.4 优化内存的一般注意事项 4.8.5 数组处理与内存优化 4.8.6 避免循环中不必要的计算、读写控件或者变量
29
.
4.9 影响VI运行速度的因素
口 第九章:MathScript 第十章:基于组件的程序结
构 第十一章:人机交互与编程
风格
3
.
应用篇
第十二章:VI模板、设计模 式、状态图
第十三章:串并口通讯、网 络与DSC
第十四章:数据库、报表工 具
第十五章:LabVIEW与RT系 统
第十六章:LabVIEW与数据 采集
第十七章:FPGA工具包
44
.
5.2.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的智能家居报警系统

基于LabVIEW的智能家居报警系统昨天晚上,帮师弟用LabVIEW做了一个智能家居报警系统的上位机软件,挺好玩的,虽然功能不多、结构也简单,但是,所用到的技术对于学习LabVIEW的人来说很重要。
首先,贴出前面板的图片来。
单片机向上位机发送的帧格式为:0x0A+3字节的温度数据+0x0B+4字节的烟雾浓度数据+0x0C+1字节的开关门信号(总共11个字节),发送的波特率为9600,发送周期为200ms。
上位机采集软件每隔10ms(就是前面板上的队列循环周期)从串口缓存区里读取11个字节的数据,然后将其进行解析和显示。
图1 软件的前面板截图然后,再把程序框图一一给大家亮出来。
图2 串口配置和串口收/发的程序图如图2所示,VISA每隔10ms从串口缓存区读取11个字节的数据,然后将数据送入串口接收数据队列中。
这里采用的是生产者-消费者模型的循环结构,读串口采用的是生产者循环结构,解析数据采用的是消费者循环结构。
图3 数据解析和数据显示部分的程序图如图3所示,消费者循环用于解析数据,根据0x0A、0x0B、0x0C三个属性字节分别对温度值、烟雾浓度值以及开关门信号进行解析和显示,波形显示采用的是波形图表,温度值可通过温度计显示,烟雾浓度可通过指针式仪表盘显示,显示效果直观、大方。
图4 声音报警部分的程序图如图4所示是声音报警部分的程序图,上半部分是温度报警程序,报警声音持续时间为2秒钟,报警声频率为3KHz;下半部分是烟雾浓度报警程序,报警声音持续时间为1秒钟,报警声频率为1KHz。
由于声音报警持续的时间为1~2秒钟,如果将报警程序放在解析数据的那个大循环里,则会导致大循环的执行被延迟1~2秒钟,因此,必须将报警程序提出来单独写,从而使之变成了两个独立运行的线程。
labview 生产者消费者

生产者消费者模型主要是处理数据产生快难于即时处理的情形,其流程为首先通过初始化队列,再创建两个循环,一个用于入队,另一个用于出队。
网上的生产者消费者都过于复杂,这里用一个简单的例子。
这里入队数据为每1s入队一个数,而出队为每3s出一个数,数据产生的快适用于生产者消费者模型。
在进行生产者消费者设计时需要注意:
1、由于队列的数据类型是变体,需要用变体至其他数据类型的转变。
2、使用局部变量同时结束两个while循环,注意布尔控件的机械转换方式为
switch型。
3、同时需要注意的是在释放队列引用需在出队后面进行,如果在入队循环中进行
会导致,出队时队列不存在导致错误。
PV操作解决生产者——消费者问题

合肥学院计算机科学与技术系课程设计报告2009 ~2010 学年第1 学期课程名称操作系统原理课程设计名称PV操作解决生产者——消费者问题专业班级07级计科1班学生姓名马峻、宣磊、施红陵、王锐学生学号0704011015/25/30/41指导教师屠菁2009 年12 月1、实验目的进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。
我们把若干个进程都能进行访问和修改的那些变量称为公共变量。
由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。
为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。
一般说,同步机构是由若干条原语——同步原语——所组成。
本实习要求模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。
2、实验内容模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。
3、实验步骤(1)任务分析本实验要求利用PV操作实现解决生产者——消费者问题中的同步问题。
此问题描述的是一群生产者进程在生产产品并将这些产品提供给消费者进程去消费,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区,消费者进程可从缓冲区中取走产品去消费,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满且尚未取出的缓冲区中投放产品,并且生产者消费者互斥使用缓冲区。
本程序实现的功能是可以利用生产者进程进行生产,同时消费者进程也能进行消费,但是必须满足同步的条件才可以允许,否则将提示缓冲区满无法进行生产或者缓冲区空无法进行消费的错误,故程序应该具有判断的功能。
若结束当前的生产者——消费者进程,将会提示此次进程中生产消费者分别生产了和消费的产品数目,并统计缓冲区中剩余的产品数目,最后才结束。
labview的介绍

虚拟仪器系统及其开发程序LabVIEW介绍引言虚拟仪器是将仪器装入计算机,通过计算机的开发软件来实现仪器的功能的一种仪器测试测量系统。
目前开发虚拟仪器的软件程序为LabVIEW,用户只需通过软件技术和相应数值算法,就能实时、直接地对测试数据进行各种分析与处理,透明地操作仪器硬件,方便地构建出模块化仪器。
从目前虚拟仪器的发展方向和广泛应用来看,不久的将来,虚拟仪器将广泛应用在气象观测和气象科普中,因此有必要对该系统作一番介绍。
一、电子测量仪器的发展电子测量仪器发展至今,大体可分为四代:模拟仪器、数字化仪器、智能仪器和虚拟仪器。
第一代模拟仪器,如指针式万用表、晶体管电压表等。
第二代数字化仪器,这类仪器目前相当普及,如数字电压表、数字频率计等。
这类仪器将模拟信号的测量转化为数字信号测量,并以数字方式输出最终结果,适用于快速响应和较高准确度的测量。
第三代智能仪器,这类仪器内置微处理器,既能进行自动测试又具有一定的数据处理能力,可取代部分脑力劳动,习惯上称为智能仪器。
它的功能块全部都是以硬件(或固化的软件)的形式存在,相对虚拟仪器而言,无论是开发还是应用,都缺乏灵活性。
第四代虚拟仪器,它是现代计算机技术、通信技术和测量技术相结合的产物,是传统仪器观念的一次巨大变革,是将来仪器产业发展一个重要方向。
二、虚拟仪器概述及其特点虚拟仪器(virtual instrumention)是基于计算机的仪器,是美国国家仪器公司(National Instruments Corp. 简称NI)于1986年提出的。
计算机和仪器的密切结合是目前仪器发展的一个重要方向。
粗略地说这种结合有两种方式,一种是将计算机装入仪器,其典型的例子就是所谓智能化的仪器。
随着计算机功能的日益强大以及其体积的日趋缩小,这类仪器功能也越来越强大,目前已经出现含嵌入式系统的仪器。
另一种方式是将仪器装入计算机。
以通用的计算机硬件及操作系统为依托,实现各种仪器功能。
电子教案《基于LabVIEW的应用程序设计》(李晴 钱声强)ppt KC10142001-c11- 生产者消费者概念

优势
9
生产者消费者优势
• 程序演示 • Demo1(静态单循环ห้องสมุดไป่ตู้式) • Demo2(动态单循环模式) • Demo3(并行多循环模式)
demo
10
谢谢关注!
学校地址:中国江苏常州科教城鸣新中路22号 邮编:213164 Copyright 2013 WXIT,All Rights Reserved 苏ICP备09025827号
• 生产者/消费者模式,还需要一个缓冲区。生产者把数据放入缓冲区,而消费 者从缓冲区取出数据。
5
生产者消费者循环的概念 概念
食客:消费者
概念
厨师:生产者
6
• .架构比较
生产者消费者优势
静态单循环-顺序结构
优势
7
• .架构比较
生产者消费者优势
动态单循环-状态机
优势
8
生产者消费者优势
• .架构比较
常州信息职业技术学院
物联网应用程序设计 (虚拟仪器应用技术)
1
常州信息职业技术学院
生产者-消费者循环
“我需要可以同时执行的两个过程,并且 需要保证它们不会互相影响执行速度。”
2
生产者-消费者
生产者消费者循环
• 生产者消费者循环的概念 • 生产者消费者循环的优势
*
4
生产者消费者循环的概念 概念
• 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,由 另一个模块负责处理数据。产生数据的模块,称为生产者;处理数据的模块, 称为消费者。
11
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
生产者/消费者模式(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本身就是一种多线程设计的语言。
那么当同一背面板中放置两个VI的实例时代码应该如何执行呢?在图29中,右侧是测试VI运行的时间,左侧是Wait.vi的具体实现代码,仅仅是等待一定的秒数。
那么在右侧的VI中,输出的Time是多少呢?是3秒还是2秒?图 29 Reentrant Execution打开VI的Highlight调试工具,可以看出两个Wait.vi实例的调用并不是同时执行的,而是依次按顺序执行的,至于哪一个实例先执行是不确定的。
这是由于LabVIEW本身是并行设计的,从理论上而言,两个VI的实例是同步执行的,但是如果两个Wait.vi实例同时执行必定会产生参数赋值紊乱,因为LabVIEW只允许内存中存在一个名称的VI。
因此,此时Time的输出结果是3秒。
如果在实际使用中需要这样的应用该如何解决呢?LabVIEW提供了VI的可重入技术,打开Wait.vi,单击<Ctrl+I>按键,选择图 30所示的Reentrant execution选项。
此时再次运行Time的输出结果是2秒。
从Highlight的运行过程来看,两个Wait.vi实例是同时执行的,因此总的运行时间就是1秒。
图 30 VI Properties事实上,LabVIEW的可重入技术相当于在原有VI的基础上产生了一个相同的副本,打开Wait.vi从标题栏可以看出VI的名称为Wait.vi:1(clone)。
同理这是由于LabVIEW中不允许内存中的VI存在同名,VI的可重入技术相当于产生了与原VI具有同样功能的新VI 并且修改了该VI的命名。
在实际应用中,需要根据情况决定是否设置VI的可重入属性,灵活使用。
并不是需要将所有的VI都设置为可重入,那将占据大量的内存资源。
生产者/消费者模式(3)_LabVIEW程序的动态调用statemice的LabVIEW程序设计模式(五)—生产者/消费者模式(3)_LabVIEW程序的动态调用简单而言,动态调用指的是通过程序控制另外一个程序的运行、停止、赋值和获取值等。
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】(Fibonacci数列)。
斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21……这个数列从第三项开始,每一项都等于前两项之和。
在数学上表述为:f(n)=f(n-1)+f(n-2),其中n>=3,f(1)=f(2)=1。
显然这是一个比较熟悉的递归调用,但是在LabVIEW中似乎很难实现。
由于LabVIEW不允许同名的VI同时在内存中,因此一个VI是无法VI调用本身的。
但是,通过VI的可重入技术和动态调用技术却可以实现VI的递归调用。
图 34所示为Fibonacci数列在LabVIEW中递归的实现方式。
case 结构有两个分支,当n<=2时直接输出f(n)=1;当n>=3时,输出f(n)=f(n-1)+f(n-2)。
此时需要把VI设置为可重入状态。
图 34 Fibonacci数列同理我们也可以使用这种递归的方式实现f(n)=n!的算法,从数学上可以写作f(n)=n*f(n-1),其中n>=1,f(0)=1。
具体的实例将不打开Highlight工具,在Call By Reference Node运行时,程序是处于等待状态的,只有被调用的VI运行完毕,主程序才会继续执行。
这似乎无法解决在本节开头提到的问题,那么是否存在一种动态调用方式使被调用的VI与主VI之间分别独立运行呢?答案是肯定的。
VI本身是有很多的属性和方法的,如图 35所示。
使用这些方法就可以动态控制VI的运行、停止和赋值,各个属性节点和方法的具体含义见LabVIEW的帮助文档。
使用这种方式动态调用VI时,并不需要知道VI的输入输出接口。
图 35 VI Method图 36是该使用“属性节点和方法”实现动态调用的一个实例。
在大多数应用程序启动时会显示一个启动画面用来显示版权、开发单位、软件版本等信息,等待2秒之后关闭启动界面并启动应用程序主界面。
图中使用了动态调用的方式启动主程序(Main.vi)并使主程序独立运行,首先运行程序后设置2秒钟的延时;其次,将启动画面的界面设置为“隐藏”(并没有退出内存,只是隐藏了前面板),并且使用Open VI Reference获取VI的句柄;然后使用FP.Open属性打开主程序的前面板(只是打开了前面板并没有运行);使用Run VI 方法运行主程序,将Wait Until Done设置为false,这样就可以保证被调用VI的独立运行;最后,关闭当前VI的前面板。
图 36 VI的动态调用通过Highlight工具看出该VI的运行是独立的,并没有等待Main.vi运行结束才继续执行。
生产者/消费者模式(4)_生产者/消费者循环statemice的LabVIEW程序设计模式(五)—生产者/消费者模式(4)_生产者/消费者循环本节将使用“多循环”来解决程序并行运行的问题,那么程序中的两个循环如何进行数据交互和共享呢?最普通的方式是采用全局变量或局域变量,但是当两个循环执行的速率不相等时,必然会造成数据的丢失或重复。
如前所述,LabVIEW提供了队列操作函数,允许数据的发送者和接受者之间建立一条缓冲通道,这样就避免了循环不同步带来的影响。
如图 37所示,将整个过程与供水系统进行类比,在数据产生/采集端(供水局)产生数据后,并不直接向终端用户供水,因为前者产生水的速率与后者消耗水的速率并不相同。
此时需要建造蓄水池将供水局产生的水放入到蓄水池中,同理获取的数据也放入该缓冲区中。
当终端用户需要用水时,直接从蓄水池中获取就可以了,同理在进行数据显示和分析时直接从数据缓冲区中获取就可以了。
图 37 生产者/消费者模型当然,上面的模型也会存在一个问题:数据缓冲区/蓄水池的容量?假定供水局不停地产生自来水,而终端用户却不消耗水,这样便会导致蓄水池装满而溢出。
反之当终端用户耗水量太大时,导致没有水可用。
LabVIEW中的队列函数提供了一种很好的方式规避了这个问题,由于队列中的元素是“先进先出”的,因此确保了接收到的数据是有序的。
在LabVIEW的队列操作中(入列和出列函数),提供了timeout选项以处理数据缓冲区的溢出或不足。
当数据溢出时,入列函数(数据进入队列)将停止发送数据(处于等待状态),直到缓冲区存在数据空间或者达到了timeout设置的时间;而当数据不足时,出列函数(数据流出队列)将停止接收数据(处于等到状态),直到缓冲区进入了新的数据或者达到了timeout设置的时间。
【应用6】点。
如图 38所示,生产者与消费者之间传递的数据是一个连续的sine波形,二者靠大小为20个点的缓冲区连接。
右下角是“停止”按钮,用户控制程序的停止执行。
例程提供了操作方式控件控制生产者和消费者的数据传递速率,包含五种状态:不生产,只消费、生成快于消费、生成速率等于消费速率、生成慢于消费、只生产,不消费。
图 38 生产者/消费者例程的前面板图 39所示为生产者/消费者例程的背面板,代码由3个循环组成,依上而下分别是生产者循环(产生sine数据)、消费者循环(获取sine数据)和状态循环(获得缓存区中数据的数据量)。