LabVIEW异步调用VI 点击:32 | 回复:0



fjczd

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:552帖 | 36回
  • 年度积分:703
  • 历史总积分:1294
  • 注册:2008年8月14日
发表于:2022-08-25 20:23:21
楼主
LabVIEW异步调用VI
如通过子VI节点或通过引用调用节点以标准调用方法调用一个VI,数据流在被调用节点处暂停直到子VI返回结果。然后数据流从节点的输出端继续。
与上述方式不同,异步调用VI时,子VI运行的同时数据流仍然在调用方VI中继续。如调用方VI不是立即需要子VI的执行结果,就可考虑异步调用子VI。在这些情况下,异步调用可使子VI和调用VI并行运行,明显优化调用方VI的执行时间。关于异步VI调用的优点,请参考下列编程情境范例:
将任务分配给子VI,主VI继续运行
将一个任务的工作量分散到同一个VI的各个实例,尤其是直到运行时才知道任务需要的VI实例的个数
打开复杂的用户界面,界面由若干个单独的VI组成。这些VI必须并行运行,同时收集结果
关于同步和异步调用的比较,请参考labview\examples\ApplicationControl\VI Server\Asynchronous Call By Reference目录下的Benchmarking AsynchronousCalls VI。
打开范例   查找相关范例
异步VI调用概述
在LabVIEW中,异步VI调用包括下列步骤。
准备异步调用的VI引用—使用打开VI引用函数获取VI引用,并通过异步选项标识(0x80, 0x100)作为选项输入的一部分。该步骤是让LabVIEW为异步调用分配资源。
开始异步VI调用—将VI引用连接至开始异步调用节点,开始调用子VI。当子VI运行时,数据流继续在调用方VI中执行。
(可选)获取异步VI调用的结果—如应用程序需要异步调用的子VI的输出结果,将VI引用连接至等待异步调用节点以收集结果。等待异步调用节点等待相关子VI执行完毕直到超时。
关闭VI引用—使用关闭引用函数告知LabVIEW使用VI引用已完毕。LabVIEW将释放相关资源。
异步VI调用的类型
要进行异步VI调用,必须根据使用场合决定使用哪种类型的调用方法。关于每种每种的实现,请参考下列主题:
仅调用—调用方VI开始调用子VI,但是不需要子VI的输出。
调用和收集—调用方VI开始调用子VI,稍后收集子VI的执行结果。
可使用上述类型异步开始对一个VI的多个调用,实现并行执行。
LabVIEW如何管理异步VI调用:异步调用池
使用异步调用VI方法并不需要了解LabVIEW在后台如何管理这些异步VI调用。但是,了解异步调用池有助于用户设计确定性应用程序和优化程序的性能。如将异步选项标识作为“打开VI引用”函数选项输入端的一部分,将VI引用所指的VI异步运行,LabVIEW将创建一个数据空间的池,跟踪对VI的各个调用。因为LabVIEW将一个数据空间池,而不是一个数据空间,与VI引用关联,必须通过一个VI引用开始多个异步调用。每次使用“开始异步调用”节点通过VI引用开始异步调用时,LabVIEW都会在池中预留一个数据空间。VI结束运行后,LabVIEW将把输出放在数据空间中,并将VI调用标识为结束。如“等待异步调用”节点等待被调VI的输出,LabVIEW将从数据空间中返回结果,将数据空间释放给同一VI的其他调用。
异步调用池对性能的影响
对于各个VI引用,LabVIEW在终端计算机CPU核的异步调用池中创建一个数据空间。如同时开始的VI调用超过了可用的数据空间,LabVIEW将分配更多的数据空间,以增加调用池的大小。因为分配数据空间的过程所需的时间是不确定的,调用方VI在“开始异步调用”节点触发空间分配时,会有一个不可预期的时间延迟。
在开始异步调用节点处避免不可预期的延迟
如VI必须在实时操作系统上运行,必须避免不可预期的延迟的话,在调用PopulateAsynchronous Call Pool方法开始任何同步之前,应对给定的VI引用预分配相应数量的数据空间。预分配数据空间使时间延迟在程序开始之前,而不是发生在“开始异步调用”节点的位置。
关于异步调用池影响VI执行速度的详细信息,请参考labview\examples\ApplicationControl\VI Server\Asynchronous Call By Reference目录下的Populatingthe Asynchronous Call Pool VI。
异步调用池对从同一VI的多个调用中收集输出的影响
如要收集异步VI调用的结果,必须将被调用VI的引用传递至“等待异步调用”节点。因为“等待异步调用”节点接收VI的引用,而不是特定数据空间的引用,节点无法收集特定VI调用的输出。如对特定VI的调用结束,节点返回结束的调用的输出。详细信息请参考下列程序框图。

添加图片注释,不超过 140 字(可选)

如标签所示,当多个“等待异步调用”节点使用同一个VI引用时,不能预测哪个节点将返回VI引用的某个调用的输出。在上面程序框图中,顶部的“等待异步调用”节点将返回开始异步调用2的输出,即使它被连线至开始异步调用1。如要对一个VI进行多个调用,还要保持“开始异步调用”节点与特定的“等待异步调用”节点相匹配,可使用下列方法:
为每个异步VI调用创建唯一的VI引用。如“等待异步调用”节点和“开始异步调用节点”共享一个VI引用,则两个节点就保证能指向同一个VI实例。该解决方案类似于从唯一的VI引用的调用中收集结果。
修改被调用VI,使其接收数字或字符串标识符作为输入,返回同样的标识符作为输出。异步调用VI时,将传递至“开始异步调用”节点的标识符与“等待异步调用”节点返回的标识符相比较。如二者一致,就可确定“等待异步调用”节点返回的是哪一个调用。
上文中提到的例子和资料,均在word中的附件里,可点击下载。
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目问题,可联系我们。




楼主最近还看过


热门招聘
相关主题

官方公众号

智造工程师