Labview的子VI

子VI与内存管理

1.1VI的四个内存单元
前面板对象、程序框图对象、程序代码、数据
当打开一个主VI时,它的所有的静态调用子VI代码和数据都会被调入内存。
优化Labview的内存使用:
(1)把一个复杂的VI模块化为多个子VI,可以省去重复的程序代码,节约内存
(2)避免设置子VI的重入属性,重入的VI可能会生成多个副本,消耗内存。
1.2多态VI
其实质是调用不同的VI,这些VI功能相同,但接口不同(面向对象编程),实现自动匹配并调用匹配数据类型的VI。
Labview的子VI_第1张图片
1.3子VI中的程序结构
子VI是包含事件结构的人机交互机制,要求实现子VI的前面板以对话框的形式弹出。
实现方法,通过VI菜单选项“文件-VI属性”,勾选窗口外观中的对话框即可。
Labview的子VI_第2张图片
当主VI的线程运行到子VI处时,将停滞在此,直到子VI运行结束后主VI才继续运行,若是需要子VI与主VI实时数据通讯,则需要主VI和子VI运行在各自的线程上。
1.4子VI运行模式
子VI运行模式:可重入、不可重入;可通过VI属性对话框里“执行”页设置,默认为不可重入。
Labview的子VI_第3张图片
何为“重入”:首先理解“VI实例”,一个VI里的一处调用称为该VI的一处实例。同一VI的多处实例指的是多处调用,也就是同一程序多次使用,不同的是相应存储空间的数据不一样,这也表述为VI的状态不同。不可重入指的是在同一时间内同一个VI只能有一个实例存在,相应的内存也只会分配一块空间,这样会降低程序效率,加大等待时间。相反,不可重入指的是同一VI的不同实例可以同时运行,可重入VI可以开辟多个副本来保证数据安全,高效利用多线程,但是额外开辟的副本将会增加内存消耗。
对于可重入VI内存的使用形式分为两种情况:实例间共享副本;为不同实例分配相应的副本。
实例间共享副本:子VI设置为“共享副本重入执行”,当第一次出现该子VI的实例时开辟副本1,在该子VI的实例再次出现时,判断上次实例是否结束,若结束则使用副本1,其中的数据也随之更改;若没结束,开辟副本2。
为每个实例预分配副本:子VI设置为“预分配副本重入执行”,每个被调用的实例都创建副本,提高了数据安全性,加大了内存消耗。
总结:可重入模式怎么选?根据实例运行后状态要求决定,要求高预分配,要求低就共享。
1.5共享副本与数据串改
实例间共享副本的情况,需要加适当的运行时间,可有效避免数据篡改。
1.6子VI加载的内存形式
静态调用:通过“函数选板-选择VI”或直接从硬盘拉入图标调用的方式。当主VI打开时,无论用了多少级子VI,所有与其相关联的静态调用子VI全部进入内存。当一个静态调用VI的全部调用方退出内存时,该VI才退出。
动态调用:只有调用时才加入内存的方式;需用到VI Sever技术。由于动态调用,使用时才加载,所以运行速度不如静态调用。实现其需要以下三个函数:打开VI引用、通过引用节点调用、关闭引用。它的好处是节省内存。
类型说明符VI引用句柄:在“打开VI引用”函数“类型说明符VI引用句柄”输入端上右击创建常量,再右击该常量选择“VI服务器——浏览”,选择要调用的VI即可。案例如下图。
Labview的子VI_第4张图片
1.7子VI &属性节点
通过子VI不仅可以传递数据,还可以修改主VI以及主VI内部控件的属性。主要工具在 “引用句柄-控件引用句柄”,选择需要控件类型拉入句柄。
程序面板“应用程序控制-属性节点”,将前面板的句柄与其相连,获得布尔属性节点(此部分用子VI控制主VI内部控件的属性)。
Labview的子VI_第5张图片
主VI调用时通常会用到VI服务器引用“应用程序控制-VI服务器引用”,先放置控件,点击函数“VI服务引用”选取控件,将其与句柄相连。

在这里插入图片描述

你可能感兴趣的:(Labview)