一、变量定义
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种用于工程应用的图形化编程语言。在LabVIEW中,变量是用于存储和传输数据的元素。下面是对局部变量、全局变量和共享变量的简要说明:
- 局部变量(Local Variables):
局部变量只能在其所在的VI文件中使用,用于存储和传输该VI或图形化函数内部的数据。
同样,它也具有可读和可写的属性,在局部变量的右键菜单中可更改其读写属性。实际上,使用局部变量可将前面板对象同时用作输入和输出。局部变量多用于程序复杂或者连线困难的场合
- 在块图中,局部变量可以通过其名称或标签进行访问。
- 全局变量(Global Variables):
全局变量用于在一个工程项目中的多个文件之间进行数据交互。
- 全局变量保存在一个VI文件中,但这种类型的VI文件和普通的VI文件不一样,它只有前面板,而无程序框图,在前面板上可以放置多个控件,对应着多个全局变量,即在一个VI文件中可以存储多个全局变量。
全局变量具有可读和可写的属性,在全局变量的右键菜单中可更改其读写属性。
- 共享变量(Shared Variables):
- 共享变量是LabVIEW提供的一种功能,
允许在多个VI或实时目标之间共享数据
。 - 共享变量是通过LabVIEW的“共享变量引擎”来管理的,该引擎提供了对网络变量、实时变量和I/O变量的支持。
- 共享变量可以在项目浏览器中进行定义和配置,包括其数据类型、访问权限和更新策略等。
- 在VI中,可以通过“共享变量”选板来访问和操作共享变量。
- 共享变量对于在分布式系统、实时系统或网络应用中实现数据共享和通信非常有用。
回到目录
二、内存分配
1. 局部变量
- 局部变量复制数据缓冲区的数据。从一个局部变量读取数据时,便为相关控件的数据创建了一个新的缓冲区。
- 局部变量的内存占用与其数据类型和大小直接相关。例如,一个存储大量数据的数组局部变量将占用更多的内存。
- 局部变量只在定义它们的VI或图形化函数的上下文中存在。当VI停止运行时,这些局部变量的内存会被自动释放。
2. 全局变量
- 从一个全局变量读取数据时,LabVIEW将创建一个数据的副本,保存于该全局变量中。
- 操作大型数组和字符串时,将占用相当多的时间和内存来操作全局变量。操作数组时使用全局变量尤为低效,原因在于即使只修改数组中的某个元素,LabVIEW仍对整个数组进行保存和修改。如一个应用程序中的不同位置同时读取某个全局变量,则将为该变量创建多个内存缓冲区,从而导致执行效率和性能降低。
3. 共享变量
- 共享变量的内存占用取决于其数据类型、大小和配置。共享变量引擎会管理这些变量的内存使用,并在需要时进行优化。
- 由于共享变量是在多个VI之间共享的,因此它们的内存占用可能会比局部变量更复杂。但是,LabVIEW的共享变量引擎通常能够高效地管理这些变量的内存使用。
在优化LabVIEW程序的内存使用时,以下几点是值得注意的:
- 尽量减少不必要的局部变量和全局变量的使用,以减少内存占用。
- 对于大数据集,考虑使用数据流编程方式或“生产者/消费者”模式来分块处理数据,以降低内存占用。
- 定期检查程序中的内存使用情况,并找出潜在的内存泄露问题。
- 使用适当的内存释放节点(如“释放内存”和“清空图例”等)来释放不再使用的内存。
- 对于自定义的VI,确保在VI结束时释放所有分配的内存。
回到目录
三、竞争状态
两段或更多代码并行执行并访问同一部分内存时会引发竞争状态。如果代码是相互独立的,就无法判断LabVIEW按照何种顺序访问共享资源。竞争状态会引起不可预期的结果。例如,两段独立的代码访问同一个队列,但是用户未控制LabVIEW访问队列的顺序,这种情况下会引发竞争状态。
竞争状态随着程序运行的时间因素而改变,因此具有一定的危险性。操作系统、LabVIEW版本和系统中其他软件的改变均会引起竞争状态。 如改动了VI的时间要素(例如,更新操作系统或LabVIEW版本),请检查访问同一部分数据的并行代码,并使用定时条件来控制哪一部分代码首先执行。
回到目录
四、变量创建及简单使用示例
4.1 局部变量
4.1.1 局部变量的创建
局部变量是依托于前面板上的某个控件存在的,在LabVIEW中可以通过下面两种方式为某个控件创建局部变量:
- 在控件对象上面单击鼠标右键,选择“创建”–>“局部变量”;
- 在程序框图右键菜单的函数模板上创建,在函数模板中选择“编程”–>“结构”–>“局部变量”,将局部变量放到程序框图中后,鼠标左键单击该图标,选择该局部变量对应的前面板上的某个控件即可,如下图所示:
回到目录
4.1.2 局部变量的编程实例
下面是一个简单的例子,该例计算两个数a和b的和,将结果在显示控件c上进行显示,要求程序开始运行时,控件a和控件b的初始值分别设为1和2,其前面板如下图所示:
4.2 全局变量
4.2.1 创建
在LabVIEW中可以通过多种方式创建全局变量。
- 第一种:在LabVIEW编程环境中,选择菜单“文件”–>“新建……”,弹出新建文件对话框,如下图所示:
在上图中选择全局变量,即可打开一个全局变量的VI程序,当然这个VI程序只有前面板,在前面板上放置你需要的变量控件,每个变量控件即可代表一个全局变量,如下图所示:
2. 第二种:如果已经打开了一个普通的VI程序,可以在程序框图右键菜单的函数模板上创建,在函数模板中选择“编程”–>“结构”–>“全局变量”,如下图所示:
将全局变量放到程序框图中后,双击该图标,通过这种方法同样可打开一个只包含前面板的VI全局变量程序,后续操作同第一种方法相同。
回到目录
4.2.2 调用
如果要在一个VI程序中使用全局变量,可通过下面三种方法将全局变量导入到当前VI的程序框图中:
- 由函数模板中的“选择VI…”子模板打开选择用户程序对话框,选择已经保存的全局变量VI程序,此时将在框图程序中显示全局变量的数据端口。
- 如果已经打开了全局变量的VI文件,可拖动该VI文件前面板右上角的全局变量图标到当前程序框图中,此时将在框图程序中显示全局变量的数据端口。
- 若未打开全局变量的VI文件,也可以在存储全局变量VI文件的目录中,拖动该文件到当前程序框图中,此时也会在框图程序中显示全局变量的数据端口。
- 如果在全局变量VI文件中建立了多个控件,可通过操作工具在全局变量的图标上单击,在列出的所有变量对象中选择所需的对象进行操作即可。
回到目录
4.2.3 编程实例
使用上面已经创建的文件“MyGloableVar.vi”文件,在该文件中包含了两个全局变量,分别为“全局变量a”和“全局变量b”,下面写两个简单的VI程序,分别读取和写入这两个全局变量的值,以这种方式验证通过全局变量可以实现不同程序之间的数据交互。
- 读取全局变量程序“ReadGloableVar.vi”的前面板和框图程序如下图所示:
- 写入全局变量程序“WriteGloableVar.vi”的前面板和框图程序如下图所示:
为演示方便,这两个程序中未添加任何控制程序运行的结构,所以可通过点击工具栏上的“连续运行”按钮,同时运行两个程序,修改“WriteGloableVar.vi”前面板上两个控件的值,可以在“ReadGloableVar.vi”的前面板上实时观察到这两个全局变量的值。从运行结果上可以说明,通过全局变量可以实现在不同程序之间实现数据的交互了。
回到目录
4.3 共享变量
参考链接:使用共享变量
回到目录