动态调用子VI中有一个重要方式就是异步调用,异步调用在工程实际中有非常重要的用途,下面进行详细讲解。

一 何为异步调用

有“异步”,就有“同步”,这是两个相对的概念。同步调用是指,主程序将子VI打开后,需要等待子VI运行结束,才能进行下一步操作。而异步调用则不需要等待,主程序打开子VI后,子VI运行的同时,主程序也继续执行后续代码。实现主程序和子VI的并行运行,子VI可以成为一个后台任务,默默执行且不打扰用户的其它操作。

二 应用场景举例

假设此时要完成一个项目,使用数据采集仪进行多通道数据采集,多个子VI分别对应一种具体的信号采集功能,例如电压、电流、电阻等,要求实现多通道并行采集。此时我们就可以采用异步调用子VI的方式,主程序异步调用起第一个采集电压信号的子VI后,这个子VI就在后台运行,进行采集任务。主程序不等待,立即异步调用第二个采集电流信号的子VI,两个子VI均被调起并行执行,同理,还可以调用第三个子VI……以此实现多通道并行采集信号的效果。

三 程序编写

 “开始异步调用”的函数位于“函数->应用程序控制”中。

LabVIEW中异步调用详解-LMLPHP

使用该函数时,需要配合“打开VI引用”和“关闭引用”两个函数一起使用,如图所示。

LabVIEW中异步调用详解-LMLPHP

可以看出,这样的调用方式十分简洁,这里有几点需要注意:

1.“打开VI引用”函数的“类型说明符VI引用句柄”端口,传入的必须是严格类型的VI引用;

2. “打开VI引用”函数的“选项”端口,需要传入“0x80”选项标签,表明将要开始的是异步调用;

3.此示例中 “关闭引用”执行后,被调用的子VI仍将运行到结束。

四 其他类型的异步调用

第三节讲述的只是异步调用的其中一种类型,通过改变选项标签可以满足不同的调用需求。

1.“0x80”选项标签

异步调用不收集结果,开始异步调用节点的目标是开始一个VI调用,但是不等待被调VI执行结束,自然也无法访问其输出。

2.“0x100”选项标签

异步调用收集结果,即等待异步调用结束,然后返回结果。使用“0x100”选项标签时,需要同时使用到如下两个函数,缺一不可。

LabVIEW中异步调用详解-LMLPHP

如下图所示,这里需要注意几点:

(1)开始异步调用节点将输入参数传递至目标VI,等待异步调用节点访问目标VI的输出,一个负责输入,一个负责输出;

(2)与“0x80”选项标签对应的关闭VI引用,目标VI仍运行到结束不同的是,“0x100”选项标签下,等待异步调用节点执行完成后,关闭VI引用,将中断所有当前运行的调用,并阻止串行调用开始执行。

LabVIEW中异步调用详解-LMLPHP

但是,等待异步调用的用途是十分有限的,因为如果要等待子VI执行完毕的话,异步调用和同步调用就十分相似了,那异步调用的优势就无法体现。

3.“0x40”选项标签

如需要多次使用“开始异步调用”节点调用可重入子VI的多个副本,并行运行,则可以设置此标签。注意:0x40选项标签调用的子VI 必须是可重入的,且共享同一个副本。

4.其它组合情况

0x40选项标签可以和0x80或0x100选项标签搭配使用,还有更多种组合情况,这里不再赘述。

以上就是LabVIEW中有关异步调用的一些知识点总结,若有不对之处,欢迎指正。

五 范例

NI自带多个异步调用的范例,可查看本文附带资源。也可自行搜索,我的电脑安装的LabVIEW是2021版本,可在以下路径中查看:C:\Program Files (x86)\National Instruments\LabVIEW 2021\examples\Application Control\VI Server\Asynchronous Call By Reference,包含了文中涉及到的各种调用情况,如下图所示。大家可对应自己的版本去查找。

LabVIEW中异步调用详解-LMLPHP

01-24 10:00