LabVIEW学习记录4-局部变量、全局变量、共享变量


【LabVIEW】局部变量、全局变量、共享变量

  • 一、变量定义
  • 二、内存分配
  • 三、竞争状态
  • 四、变量创建及简单使用示例
    • 4.1 局部变量
      • 4.1.1 局部变量的创建
      • 4.1.2 局部变量的编程实例
    • 4.2 全局变量
      • 4.2.1 创建
      • 4.2.2 调用
      • 4.2.3 编程实例
    • 4.3 共享变量

1

一、变量定义

  LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种用于工程应用的图形化编程语言。在LabVIEW中,变量是用于存储和传输数据的元素。下面是对局部变量、全局变量和共享变量的简要说明:

  1. 局部变量(Local Variables)
  • 局部变量只能在其所在的VI文件中使用,用于存储和传输该VI或图形化函数内部的数据。同样,它也具有可读和可写的属性,在局部变量的右键菜单中可更改其读写属性。实际上,使用局部变量可将前面板对象同时用作输入和输出。
  • 局部变量多用于程序复杂或者连线困难的场合
  • 在块图中,局部变量可以通过其名称或标签进行访问。
  1. 全局变量(Global Variables)
  • 全局变量用于在一个工程项目中的多个文件之间进行数据交互。
  • 全局变量保存在一个VI文件中,但这种类型的VI文件和普通的VI文件不一样,它只有前面板,而无程序框图,在前面板上可以放置多个控件,对应着多个全局变量,即在一个VI文件中可以存储多个全局变量。
    全局变量具有可读和可写的属性,在全局变量的右键菜单中可更改其读写属性。
  1. 共享变量(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中可以通过下面两种方式为某个控件创建局部变量:

  1. 在控件对象上面单击鼠标右键,选择“创建”–>“局部变量”;
  2. 在程序框图右键菜单的函数模板上创建,在函数模板中选择“编程”–>“结构”–>“局部变量”,将局部变量放到程序框图中后,鼠标左键单击该图标,选择该局部变量对应的前面板上的某个控件即可,如下图所示:
    1
    回到目录

4.1.2 局部变量的编程实例

  下面是一个简单的例子,该例计算两个数a和b的和,将结果在显示控件c上进行显示,要求程序开始运行时,控件a和控件b的初始值分别设为1和2,其前面板如下图所示:
2

4.2 全局变量

4.2.1 创建

  在LabVIEW中可以通过多种方式创建全局变量。

  1. 第一种:在LabVIEW编程环境中,选择菜单“文件”–>“新建……”,弹出新建文件对话框,如下图所示:

1
在上图中选择全局变量,即可打开一个全局变量的VI程序,当然这个VI程序只有前面板,在前面板上放置你需要的变量控件,每个变量控件即可代表一个全局变量,如下图所示:
2
2. 第二种:如果已经打开了一个普通的VI程序,可以在程序框图右键菜单的函数模板上创建,在函数模板中选择“编程”–>“结构”–>“全局变量”,如下图所示:
3
将全局变量放到程序框图中后,双击该图标,通过这种方法同样可打开一个只包含前面板的VI全局变量程序,后续操作同第一种方法相同。

回到目录

4.2.2 调用

  如果要在一个VI程序中使用全局变量,可通过下面三种方法将全局变量导入到当前VI的程序框图中:

  1. 由函数模板中的“选择VI…”子模板打开选择用户程序对话框,选择已经保存的全局变量VI程序,此时将在框图程序中显示全局变量的数据端口。
  2. 如果已经打开了全局变量的VI文件,可拖动该VI文件前面板右上角的全局变量图标到当前程序框图中,此时将在框图程序中显示全局变量的数据端口。
  3. 若未打开全局变量的VI文件,也可以在存储全局变量VI文件的目录中,拖动该文件到当前程序框图中,此时也会在框图程序中显示全局变量的数据端口。
  4. 如果在全局变量VI文件中建立了多个控件,可通过操作工具在全局变量的图标上单击,在列出的所有变量对象中选择所需的对象进行操作即可。

回到目录

4.2.3 编程实例

  使用上面已经创建的文件“MyGloableVar.vi”文件,在该文件中包含了两个全局变量,分别为“全局变量a”和“全局变量b”,下面写两个简单的VI程序,分别读取和写入这两个全局变量的值,以这种方式验证通过全局变量可以实现不同程序之间的数据交互。

  • 读取全局变量程序“ReadGloableVar.vi”的前面板和框图程序如下图所示:
    4
  • 写入全局变量程序“WriteGloableVar.vi”的前面板和框图程序如下图所示:
    6
      为演示方便,这两个程序中未添加任何控制程序运行的结构,所以可通过点击工具栏上的“连续运行”按钮,同时运行两个程序,修改“WriteGloableVar.vi”前面板上两个控件的值,可以在“ReadGloableVar.vi”的前面板上实时观察到这两个全局变量的值。从运行结果上可以说明,通过全局变量可以实现在不同程序之间实现数据的交互了。

回到目录

4.3 共享变量

参考链接:使用共享变量
回到目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3030356.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

三层交换机静态路由连通实验

静态路由是一种手动配置路由表的方式,网络管理员需要手动指定网络中的每一个路由器下一跳路由器的地址,以及到达目的网络的最短路径。静态路由的路由表不会自动更新,如果网络拓扑发生了变化,管理员需要手动更改路由表。 实验拓扑图…

如何使用Vite快速构建vue项目

1、在自己定义的目录下打开cmd命令窗口:如文件夹目录上面输入cmd回车就可以打开 2、检查 node环境:通过node --version看版本号表示安装好了 3、 使用Vite 快速构建Vue项目 npm init vitelatest qiuqiu.admin 注意:如何你电脑没有装vite首…

python 根据网址和关键词批量下载影像

最近用到了GLASS的LAI产品,但这个产品的文件夹分得很细,我需要的影像又有8个瓦片,一个一个点击很麻烦,于是探索了批量下载的方法 一、下载1幅 import requests import re import os import requests import re# 网页URLurl &…

数据挖掘(二)数据预处理

前言 基于国防科技大学 丁兆云老师的《数据挖掘》 数据挖掘 数据挖掘(一)数据类型与统计 2、数据预处理 2.1数据清理 缺失值处理: from sklearn.impute import SimpleImputer# 创建一个SimpleImputer对象,指定缺失值的处理策略…

螺栓扭矩如何设计?——SunTorque智能扭矩系统

螺栓扭矩设计的大小是一个涉及工程实践的重要问题,它直接关系到螺栓连接的紧固质量和安全性。螺栓扭矩是工程领域中常用的一个概念,用来描述螺栓在连接过程中所需的旋转力矩。正确的螺栓扭矩可以确保螺栓和螺母之间的紧密连接,避免由于松动而…

Java基于Spring Boot+Vue框架的大学生就业招聘系统(附源码,说明文档)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

crmeb的分销推广如何用

CRMBE分销推广说明 1、CRMEB分销模式 分销模式: 指定分销、人人分销、满额分销 指定分销: 用户默认无分销权限,需要后台开通分销权限后,才可以通过推广下级获得返佣; 人人分销: 用户在商城注册后自动获得分…

防雷防浪涌电路设计

通信线路或者电源线路通常会铺设到户外,一旦线路铺到户外后,就需要考虑防雷的问题了,那么怎么设计保护电路,能够防止雷电等浪涌对电路的破坏呢? 通信线路或者电源线路通常会铺设到户外,一旦线路铺到户外后&…

Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用

一、Istio 流量管理 Istio是一个开源的服务网格,它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全,并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理(Envoy&#x…

数据库入门(sql文档+命令行)

一.基础知识 1.SQL(Structured Query Language)结构化查询语言分类: DDL数据定义语言用来定义数据库对象:数据库、表、字段DML数据操作语言对数据库进行增删改查DQL数据查询语言查询数据库中表的信息DCL数据控制语言用来创建数据…

Yolov8目标检测——在Android上部署Yolov8 tflite模型

1. 简介 YOLOv8 是一种用于目标检测的深度学习模型,它是 YOLO(You Only Look Once)系列的最新版本之一。YOLO 系列因其高效和准确性而在计算机视觉领域非常受欢迎,特别是在需要实时目标检测的应用中,如视频监控、自动…

白银基础知识:现货白银的单位是什么?

近期现货白银行情暂停了上涨,进入了回调阶段,这反而让更多人寻求买入白银的机会。如果是我国的投资者,要购买现货白银、进行现货白银投资,有一些问题就要注意的。就计算单位来说,现货白银就和我国的不同。 在我国买白银…

CUDA C编程:第一个程序 向量相加点积

我的电脑没有装CUDA,所以使用租了带GPU的云服务器,然后使用vscode SSH远程连接云服务器。云GPU使用的是智星云,0.8元/h。 智星云 可以使用nvcc --version查看系统中安装的CUDA版本。 然后写第一个CUDA程序,两个向量相加结果给到…

Windows:管理用户账户,密码策略和安全配置

在Windows操作系统中,管理用户账户和密码策略是确保系统安全的关键步骤。本文将探讨如何通过PowerShell和其他Windows工具管理用户账户,包括查看和设置密码策略、检查用户状态,以及导出和导入安全策略。这些管理任务对于系统管理员尤其重要&a…

动态表名 的使用方法

动态表名插件的底层是 拦截器 1&#xff0c;创建一个拦截器 Configuration public class MybatisConfiguration {Beanpublic DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {// 准备一个Map&#xff0c;用于存储TableNameHandlerMap<String, Table…

centos7.9升级4.19内核

centos默认的内核版本是3.10 通过命令 uname -a 输出系统的详细信息 在部署k8s集群时使用默认的3.10版本的内核&#xff0c;容易出各种奇奇怪怪的问题、可以理解为docker和k8s与该内核版本不兼容&#xff0c;所以在部署k8s集群时&#xff0c;务必要升级内核&#xff0c;这里…

【用文本生成歌声】Learn2Sing 2.0——歌声转换算法及梅尔频谱详解

一. 频谱图与梅尔谱图的介绍 频谱图&#xff1a;频谱图可以理解为一堆垂直堆叠在一起的快速傅里叶变换结果。 1.1 信号 在进入频谱图模块之前&#xff0c;首先我们需要了解信号是什么。 信号就是某一特定量随时间变化&#xff0c;对于音频来说&#xff0c;这个特定的变化量就…

死锁的概念与处理策略

目录 一. 死锁的概念1.1 什么是死锁1.2 死锁、饥饿、死循环的区别1.3 死锁产生的条件*1.4 什么情况下会导致死锁 二. 死锁的处理策略- -预防死锁2.1 破坏互斥条件2.2 破坏不剥夺条件2.3 破坏 请求和保持条件2.4 破坏循环等待条件 三. 死锁的处理策略- -避免死锁(重要)3.1 什么是…

2024.05.10作业

TCP服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; …

求阶乘n!末尾0的个数溢出了怎么办

小林最近遇到一个问题&#xff1a;“对于任意给定的一个正整数n&#xff0c;统计其阶乘n&#xff01;的末尾中0的个数”&#xff0c;这个问题究竟该如何解决&#xff1f; 先用n5来解决这个问题。n的阶乘即n!5!5*4*3*2*1120&#xff0c;显然应该为2个数相乘等于10才能得到一个结…