LabVIEW动态加载VI到子面板速度优化
用WLAN的工具包编写测试项VI,然后需要将这些测试项VI动态加载到主VI的子面板(Subpanel)上,当采用open vi reference的方式进行动态加载,随着加载的测试项VI增多,加载时间高达90s,怎么样能把这个加载的时间缩短呢?
解答:
有些功能VI其调用的子VI很多,那么实际打开这个功能VI时或者动态加载这个功能VI时,就会看到LabVIEW要确认所调用到的子VI的路径并进行加载,这个加载的过程是比较耗时间的。然而,当打开这个功能VI或者动态加载这个功能VI时,为了避免每次都要将加载子VI加载一遍,就必须将其调用的所有子VI进行编译,并将编译信息进行保存,如图2所示。只有将编译信息保存了,LabVIEW才可以知道各个子VI的路径信息,那么下次打开这个功能VI时或者动态加载这个功能VI时,其调用的子VI就不需要重新加载了。因此,要优化VI动态加载到子面板的速度,就必须注意对功能VI中子VI的编译信息进行保存。
编辑
添加图片注释,不超过 140 字(可选)
图1 子VI加载耗时
编辑
添加图片注释,不超过 140 字(可选)
图2 编译子VI
下面实际做一个验证,由于平时编写的VI层次结构并不复杂,所以无法看出VI编译对于加载时间的影响,所以用一个复杂一些程序来说明这个问题。如图3所示,该VI调用到了较多的子VI,因此当在没有保存编译信息的情况,由于要加载所调用到的子VI,所以打开该VI的时间就会比较长,自然要把该VI动态加载到子面板上的时间也会比较长。
编辑
添加图片注释,不超过 140 字(可选)
图3 调用了较多子VI的功能VI
如图4所示,在该功能VI没有被保存编译信息的情况下,将其加载到子面板的时间约为1.6s。
编辑
添加图片注释,不超过 140 字(可选)
图4 动态加载一个未被编译的功能VI耗时约1.6s
如图5所示,当加载10个这种没有被保存编译信息的VI时,可以看到在程序框图中虽然是并行加载的代码,但是时间却是12.3s,相当于10个VI加载时间的和。之所以会出现这样的情况,就是因为每一个功能VI的动态加载都需要将其调用的子VI重新加载一遍,所以在此就根本没有体现出LV编程天然并行执行的这样一个思想。
编辑
添加图片注释,不超过 140 字(可选)
图5 动态加载10个未被编译的功能VI耗时约12.3s
找到了VI动态加载到子面板耗时的原因是因为编译信息没有被保存,所以每次打开VI或者动态加载VI都需要重新加载程序中调用的子VI。那么LV是如何保存编译信息的呢?经验证的方法有三种,按照操作的简洁程度依次进行介绍。第一种就是将该功能VI进行保存,如图6所示,当关闭这个功能VI时,虽然没有对功能代码和界面做任何更改,但是依旧会提示保存该VI,这时候保存的就是编译信息。
编辑
添加图片注释,不超过 140 字(可选)
图6 提示保存功能VI
编辑
添加图片注释,不超过 140 字(可选)
图7 动态加载一个已经编译过的子VI的功能VI的时间为0.2s
编辑
添加图片注释,不超过 140 字(可选)
图8 动态加载10个已经编译过的子VI的功能VI的时间为0.8s
编辑
添加图片注释,不超过 140 字(可选)
图9 将主VI和子VI批量编译
第三种方法就是将调用的子VI手动保存,具体操作就是将子VI的前面板打开,然后保存即可,这个过程就是子VI编译信息的保存。
结论:综上论述,当动态加载调用子VI较多,层次结构复杂的功能VI时,对于子VI编译信息的保存是不能忽视的,其严重影响VI动态加载的速度。
LabVIEW、LabVIEW开发、LabVIEW编程、LabVIEW程序
上文中提到的例子和资料,均在word中的附件里,可点击下载。进一步了解,可联系们。