LabVIEW重入:允许同时调用同一子VI

简介: LabVIEW重入:允许同时调用同一子VI

LabVIEW重入:允许同时调用同一子VI


默认情况下,LabVIEW配置VI用于不可重入执行。不可重入执行中,VI同时被其他VI调用作为子VI时,一次只可一个调用进入并执行子VI。LabVIEW确保非重入子VI的调用方轮流使用子VI。非重入VI只有单个数据空间存储调用方参数、执行中计算的任何临时值以及调用之间非重入VI保持的状态。但是,如果将VI配置为重入执行,LabVIEW可从所有调用方同时进入和执行重入VI。重入执行中,LabVIEW分配数据空间的多个实例或副本,使得调用方程序框图上每个调用点或子VI使用可并行同时执行,每个调用点使用一个单独的副本。


LabVIEW的重入VI类型如下:


非重入执行-LabVIEW为所有子VI实例分配一个数据空间。


共享副本重入执行-LabVIEW分配一个副本池在调用方之间共享,该副本池最初仅包含一个副本。调用方调用一个共享副本VI时,将从副本池取出一个副本并在调用结束执行后返回该副本。如调用方调用共享副本VI时副本池为空,LabVIEW将为调用新建一个副本,并在执行结束后将副本返回副本池,因此副本池不断增大。


预分配的副本重入执行-LabVIEW为每个子VI使用分配单独的、非共享副本。


关于VI重入设置的详细信息,请参考VI属性对话框的执行页。


选择使用的重入类型

image.png


异步调用重入VI的多个实例


关于异步调用重入VI的详细信息,请参考异步调用VI的多个实例实现并行执行。


查看重入VI实例的前面板


每个副本都有单独的前面板。如要在VI副本不运行时查看VI前面板,双击要查看的子VI。也可将重入VI设置为执行时打开前面板。子VI的标题栏包含(副本)表示该VI是副本,而不是原VI。如要从副本访问原VI,选择查看»浏览关系»可重入项。也可在子VI使用前面板:打开方法,通过程序在副本运行时打开各个副本的前面板。子VI标题栏包含(副本)表示当前VI为副本。


重入VI的前面板与非重入VI的前面板交互方式类似,尤其在以下方面:


配置事件结构处理前面板对象的事件


将前面板作为子面板使用


通过属性和方法配置控件


重入执行的范例


以下部分为重入VI进行等待和不共享数据的示例。


保证子VI实例的同步执行


下列程序框图是用来提醒用户午饭时间和休息时间已到。必须对Alarm Timer VI的重入属性进行设置才能保证有理想的结果。

542fdcc351228615bd2ca3662ad8f507.png

用户指定一个午饭时间和休息时间。假设午饭时间为12:00pm,休息时间为10:00am。


Alarm Timer VI等待指定时间。AlarmTimer VI的实例位于程序框图的并行部分,无法预测哪一个实例先执行。假设午饭时间定时器先运行。


如AlarmTimer VI被配置为不可重入执行,休息时间定时器无法在12:00pm之前开始运行,必须等到午饭时间定时器完成执行。这个延迟机制使休息时间定时器无法在10:00am触发一个提醒。为了保证各个子VI实例在合适的时间被触发,必须配置Alarm Timer VI为重入执行。


在调用子VI实例之间存储数据


如需保持特定调用点子VI调用之间的状态,必须使用预分配副本重入执行。例如,创建一个ExpAvg VI用于计算已传递至VI的最新四个数据点的指数平均。LabVIEW可将最新四个数据点作为状态,保存在单个迭代While循环未初始化的移位寄存器中。


另一个VI用ExpAvg子VI来计算两个数据采集通道的指数平均。这个VI监视采集过程中两个点的电压并将计算的结果显示在带状图表上。这个VI程序框图包括两个ExpAvg子VI的实例。两个调用轮流进行-一个分配给0通道,另一个给1通道。假设0通道先运行。如果ExpAvg不是可重入的,通道1调用时使用了通道0的计算结果,通道0调用时又使用了通道1的计算结果。如果ExpAvg是可重入的,每个调用就可以独立运行而不相互共享数据。


覆盖定时结构中重入设置


(Real-Time,Windows)可将LabVIEW配置为在定时循环或定时顺序结构中预分配或共享重入VI的副本。例如,如在定时循环或定时顺序结构中放置一个重入VI的共享副本,可将结构设置为预分配在结构中调用的重入VI的实例副本。在结构外调用的重入VI实例将继续共享副本。要在定时循环或定时顺序结构中设置VI的分配,右键单击结构选择共享副本分配,从下列选项中选择:


自动-LabVIEW根据结构所在的环境决定是否将结构设置为预分配或按需分配。LabVIEW将把文本添加至快捷菜单项,以表示LabVIEW选择的设置。例如,如LabVIEW选择预分配,菜单项变为自动(预分配)。


预分配-LabVIEW为每个从结构中调用的重入VI创建一个副本VI。定时循环或定时顺序结构将显示一个图标,表示LabVIEW为结构中的任何重入VI分配副本。


按需分配-只有从结构内调用重入VI时,LabVIEW才创建一个副本。定时循环和定时顺序结构将显示一个图标,表示LabVIEW在结构内共享任何重入VI的副本。


调试重入VI


如需调试某个重入VI,可选择文件»VI属性显示VI属性对话框,从下拉菜单中选择执行并勾选允许调试复选框。


如要调试某个预分配副本的实例,打开子VI的相关实例。无法编辑副本VI,但是可以查看VI程序框图。例如,设置断点、创建探针、启用高亮显示执行过程和单步执行。


要调试共享副本的VI实例,需在源VI中使用断点、探针和启用高亮显示执行过程。副本VI无法在调用之间保持上述设置。。


上文中提到的例子和资料,均在word中的附件里,可点击下载。


   需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目问题,可联系我们。

相关文章
|
5天前
|
存储 异构计算
LabVIEW FPGA中可重入和非可重入子VI的区别
LabVIEW FPGA中可重入和非可重入子VI的区别
12 0
|
5天前
LabVIEW使用VI脚本重新排列对象
LabVIEW使用VI脚本重新排列对象
|
5天前
LabVIEW 在运行时初始化数组并允许用户编辑值
LabVIEW 在运行时初始化数组并允许用户编辑值
11 0
|
5天前
LabVIEW使用调用节点与通过引用调用节点调用VI时的差别
LabVIEW使用调用节点与通过引用调用节点调用VI时的差别
|
5天前
LabVIEW主VI冻结挂起
LabVIEW主VI冻结挂起
10 1
|
5天前
LabVIEW使用VI服务器的调用节点将数据传递到另一个VI 使用调用节点(Invoke Node)与通过引用调用节点(Call by Reference)调用VI时有什么差别?
LabVIEW使用VI服务器的调用节点将数据传递到另一个VI 使用调用节点(Invoke Node)与通过引用调用节点(Call by Reference)调用VI时有什么差别?
|
5天前
|
存储
LabVIEW可重入VI,VI模板和动态VI之间的差异
LabVIEW可重入VI,VI模板和动态VI之间的差异
|
5天前
|
Java C#
C#学习相关系列之多线程(七)---Task的相关属性用法
C#学习相关系列之多线程(七)---Task的相关属性用法
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
2508 0
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
线程的创建等待及退出 代码源码举例
线程的创建等待及退出 代码源码举例
50 0