LabVIEW程序设计模式(五)—生产者消费者模式(2)_VI的可重入性(Reentrant Execution)
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设计模式培训

精讲LabVIEW设计模式培训概述LabVIEW是一种图形化编程语言,用于数据采集、控制、仪器仪表通信、图像处理等领域。
设计模式是一种经过验证的最佳实践方法,用于解决特定问题。
本文将精讲LabVIEW设计模式培训,帮助读者了解LabVIEW设计模式的基本概念和应用。
设计模式的概念设计模式是在软件工程中,根据问题的特点和需求的约束,提供一套解决方案的模式。
它可以提高代码的可读性、可维护性和可扩展性。
设计模式分为三大类:创建型模式、结构型模式和行为型模式。
在LabVIEW中,常用的设计模式包括状态机模式、发布-订阅模式、命令模式等。
状态机模式状态机模式是一种通过定义对象的状态来解决特定问题的设计模式。
在LabVIEW中,状态机模式常被用于处理事件驱动的程序。
它通过不同的状态和状态之间的转换来实现特定功能。
例如,一个简单的状态机模式可以用于控制流程的顺序执行,通过定义不同的状态和状态之间的转换条件,实现不同的程序逻辑。
发布-订阅模式发布-订阅模式是一种实现对象间松耦合的设计模式。
在LabVIEW中,发布-订阅模式被广泛应用于多任务编程和消息传递。
它通过将消息的发布和订阅分离,实现不同模块之间的通信。
例如,一个发布-订阅模式可以用于实现观察者模式,让观察者模块监听某个对象的状态变化。
命令模式命令模式是一种将请求封装为对象,以此来参数化客户端的设计模式。
在LabVIEW中,命令模式常被用于实现撤销和重做功能。
它通过将动作封装成命令对象,实现对动作的参数化和执行。
例如,一个命令模式可以用于实现对仪器的控制,每个命令对象代表一个具体的操作,可以被撤销和重做。
实例讲解下面,我们将通过一个简单的实例来讲解LabVIEW设计模式的应用。
假设我们需要编写一个程序来控制一个自动化实验装置,包括采集数据、处理数据和输出结果。
我们可以使用状态机模式来实现流程的顺序控制,使用发布-订阅模式来实现模块间的通信,使用命令模式来实现对仪器的操作。
精通LabVIEW虚拟仪器程序设计

精通LabVIEW虚拟仪器程序设计LabVIEW是一种图形化编程语言,它广泛应用于虚拟仪器的设计和开发。
精通LabVIEW虚拟仪器程序设计,需要对LabVIEW的基本概念、编程环境、编程技巧以及高级功能有深入的理解和实践。
LabVIEW基础首先,了解LabVIEW的基本概念是至关重要的。
LabVIEW使用图形化编程,与传统的文本编程语言不同,它通过图形化的“块图”来表示程序的逻辑。
LabVIEW的编程元素包括函数、控件、指示器、数组、簇等。
编程环境LabVIEW的编程环境主要由前面板(Front Panel)和块图(Block Diagram)组成。
前面板用于设计用户界面,块图用于编写程序逻辑。
熟悉这些界面元素和环境设置是精通LabVIEW的第一步。
编程技巧1. 结构化编程:使用循环结构、条件结构和事件结构来组织代码,使程序更加模块化和易于维护。
2. 数据流编程:LabVIEW支持数据流编程,这意味着数据的流动决定了程序的执行顺序。
3. 数组和簇:掌握数组和簇的使用,可以有效地处理大量数据和复杂的数据结构。
4. 错误处理:学会使用错误处理结构来增强程序的健壮性。
高级功能1. 多线程:LabVIEW支持多线程编程,可以利用多核处理器的计算能力。
2. 动态调用:使用动态调用可以创建更灵活的程序,适应不同的运行时需求。
3. 信号处理:LabVIEW提供了丰富的信号处理工具,包括滤波器设计、频谱分析等。
4. 仪器控制:LabVIEW可以与多种仪器进行通信,实现自动化测试和数据采集。
实践应用精通LabVIEW不仅仅是理论知识的学习,更重要的是将这些知识应用到实践中。
以下是一些实践应用的建议:1. 项目实践:通过参与实际的LabVIEW项目,可以加深对LabVIEW编程的理解。
2. 案例学习:研究现有的LabVIEW程序,了解其设计思路和实现方法。
3. 社区交流:加入LabVIEW开发者社区,与其他开发者交流经验,获取新的思路和解决方案。
Labview程序设计模式

Labview程序设计模式LabVIEW程序设计模式,这个相对学术化的词语是对一系列用于LabVIEW程序设计结构的归纳和总结。
在建造房子时,需要针对房子的用途设计整个房屋的架构,确保房子在这个架构上的坚固性和可建造性。
写程序时同样如此,不同的应用需要使用不同的程序设计结构。
例如我们在LabVIEW中构建一个用户界面型程序时,往往首先在背面板中加入一个大的while循环以使程序持续运行。
如果需要响应用户界面事件则还需要加入一个Event事件结构。
那么我们是否曾经考虑过以下的这些问题:(1) 应用中是否存在并行响应的情况?如在持续的数据采集过程中,是否需要同时响应单击菜单的事件?(2) 底层获取的数据如何与上层的数据显示部分进行数据交互?(3) 上层的界面如何受底层程序的控制?(4) 同一个循环中采用哪种方式进行数据交换?是局域变量、全局变量、共享变量还是移位寄存器?(5) 程序是否具有可扩展性?(6) 如果程序运行过程中,发生系统错误或者硬件通讯错误,是否会停止运行?待错误排除后是否会继续运行?(7) 如何组织程序中的核心数据结构?是否需要采用面向对象程序设计?(8) 如何记录测试数据并生成报表?如何保存用户配置参数?(9) 如何处理程序运行中的断电情况?重新启动时的继续运行?数据的最低丢失?(10) 如何实现运行过程的采样触发和多点采样的同步?当然,也许只是使用LabVIEW临时地调试或开发某个小的应用,无需考虑上述的问题。
但是,如果使用LabVIEW开发一个典型应用的程序却无法回避这些问题。
因此,有必要对各种程序开发的应用进行归纳和总结,提取它们对应的LabVIEW程序结构中的共性。
此外,针对这些共性研究哪种结构更加适合于应用。
这些结论综合起来就形成了程序设计的模式。
对于初学者而言,理解和掌握程序设计模式往往能起到事半功倍的效果;而对高级用户而言,归纳各种程序设计模式又能够不断完善程序中遇到的问题,并衍生一套符合特定应用的特有的程序设计模式。
5_项目实战——【LabVIEW高级培训讲义】

程序性能分析
Q&A
• 生产者/消费者设计模式
是主从设计模式的一种,它将多个并行循环分为生产数据 和消费数据的两类循环,循环间采用队列方式进行通信,这样当 产生数据的速度比处理数据的速度快时,队列的缓冲作用保证数 据不会丢失。
这种模式对于处理需要较长时间才能完成的用户界面事件 非常有效。
• 队列消息处理器 所有消息或事件按顺序排列,编写相应的子程序框图或分
LabVIEW项目实战
• 程序的设计模式 • 程序的调试技巧 • 多线程程序 • 程序性能优化 • 程序性能分析
• 程序的设计模式 • 程序的调试技巧 • 多线程程序 • 程序性能优化 • 程序性能分析
• 标准状态机模式
构成:一个while循环、一个移位寄存器和一个条件结构。
系统在某一时刻只能处于一个状态,当收到一个输入条件 时,状态机产生一个输出,同时伴随状态的转移。
支代码,然后按排列的顺序处理队列中的消息或事件
构成:带移位寄存器的while循环和放置于循环内的条件结 构。
• 其它 后台程序模式 代理模式 启动界面模式
• 程序的设计模式 • 程序的调试技巧 • 多线程程序 • 程序性能优化 • 程序性能分析
程序的调试技巧
• 建立出错处理机制 • 检查数据的依从关系 • 检查部分代码段对程序的影响 • 子VI的挂起 • 检查端口连线是否正确 • 使用即时帮助窗口 • 检查函数端口的默认值 • 检查是否有没接线的子程序 • 检查未定义数据 • 检查数据溢出 • 检查簇成员的顺序
初始化状态、根据不同动作进入对应状态、最终状态(退 出)
• 主/从设计模式
多循环的模块式结构、适用于多任务的应用程序,更有效 地控制应用程序中各任务的同步执行。
如何使用VI的重入属性知识

如何使用V I的重入属性知识Last revision date: 13 December 2020.2016年04月在 VI Properties -> Execution 中可以选择 VI 的Reentrant Execution属性(中文译为:可重入执行)。
我们在《LabVIEW 程序的内存优化》一文中讨论过,尽量不要把 VI 设置为重入属性,因为这样就多占用了内存,降低了运行效率。
此外,如果不加注意的话,还可能引发多线程不安全的问题。
尽管可重入 VI 在 LabVIEW 中不是必须的,但是在某些情况下使用可重入 VI 可以简化我们的程序。
那么在什么情况下可以使用 Reentrant VI 呢?首先看一下图 1 所示的程序,程序中调用的两个子 VI 是同一个 VI,并且不是可重入的 VI。
LabVIEW 是自动多线程的语言,那么图中的两个子VI会不会同时执行呢。
一定不会的。
如果程序中调用的是两个不同的子 VI,LabVIEW 有可能会同时在不同的线程执行它们,但对于两次调用相同的子 VI,LabVIEW 一定要等一个执行完,再执行另一个。
图1:并行的两个相同子 VI其原因是,LabVIEW 会为每个 VI 都开辟一块内存用于数据存储。
作为子 VI,每次被调用,它的局部变量的数据都是被存在同一地址的。
与 C 语言相对照,在默认情况下,VI 是不可重入的,VI 中所有的局部变量都是静态变量。
如果 LabVIEW 在不同的线程下执行同一 VI,那么两个线程就会同时对这一块数据地址进行读写,就会导致这一块地址内数据的混乱。
为避免此类不安全情况的出现,LabVIEW 必须等待一个子 VI 执行结束,再执行另一个子 VI。
如果需要图1 中的两个子 VI 同时运行,比如子 VI 所做的工作是读取文件这样一类耗时多、但CPU占用不大的操作,则并行执行可以大大提高效率。
这时,就需要把子 VI 设置为可重入了。
LabVIEW之生产者-消费者模式--队列操作

LabVIEW之生产者-消费者模式--队列操作
LabVIEW之生产者/消费者模式--队列操作
本文章主要是对学习LabVIEW 之生产者/消费者模式的学习笔记,其
中涉及到同步控制技术-队列、事件、状态机、生产者-消费者模式,这几种技
术在在本章中都会有侧重点的进行介绍和总结!队列同步技术-操作函数同步控制技术可以实现在多个VI 之间或者同一VI 不同县城之间同步任务和交换数据;在LabVIEW 中提供了同步函数选板,包括通知器、队列、信号量、集
合点、事件、首次调用函数,本文主要关注同步控制技术之队列技术:
队列操作函数:
1 获取队列引用函数
2 “元素入队列”和元素出队列函数
函数作用:将元素入队列和出队列用(没什么好说的!)超时毫秒(-1)端子:如果未连接,默认输入值为-1,表示永不超时,如果队列满,则一直等待直到队列有空位为止;如果连接端子,则新元素等待设定时间后仍无法入队列,则结束本次等待!3 最前端插入元素和有损耗元素入队列函数
函数作用:将元素插入队列,不过插入队列方式有区别;元素入队列、最前端插入元素、有损耗元素入队列三者区别:元素入队列函数采用先入后出次序,而最前端插入元素函数则采用后入先出(FIFO)的原则,类似于堆栈,因此可以使用队列实现堆栈效果,相比数组实现有优势;元素入队列函数如果队列满,则线程等待,直到有空位为止;有损耗元素入队列在这种情况下则会自动删除队列前端元素,并在末端插入元素,可以用于实现缓冲区效果; 4 预览队列元素函数预览队列元素和元素出队列区别:当返回队列前段的元素时,是否删除该元素!5 获取队列状态函数:主要用于判定队列引用是否有
效!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LabVIEW程序设计模式(五)—生产者/消费者模式(2)_VI的可重入性(Reentrant Execution)
LabVIEW程序设计2009-05-19 17:06:34 阅读698 评论0 字号:大中小订阅
在介绍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都设置为可重入,那将占据大量的内存资源。
评论这张
转发至微博
0人 | 分享到:
阅读(698)| 评论(0)| 引用(1) |举报。