27.在LabVIEW中使用常量定义(精)
- 格式:doc
- 大小:17.50 KB
- 文档页数:4
LabVIEW编程基础:全局变量的创建及使用同C语言类似,LabVIEW中的变量根据作用域的不同也分为两种类型,即局部变量和全局变量,前者仅能在当前VI程序中使用,而后者可以在多个文件中使用。
本篇文章介绍全局变量的创建及使用方法。
什么是全局变量全局变量用于在一个工程项目中的多个文件之间进行数据交互。
全局变量保存在一个VI文件中,但这种类型的VI文件和普通的VI文件不一样,它只有前面板,而无程序框图,在前面板上可以放置多个控件,对应着多个全局变量,即在一个VI文件中可以存储多个全局变量。
全局变量具有可读和可写的属性,在全局变量的右键菜单中可更改其读写属性。
全局变量的创建在LabVIEW中可以通过多种方式创建全局变量。
( 1 ) 方法1在LabVIEW编程环境中,选择菜单“文件”-->“新建...”,弹出新建文件对话框,如下图所示:在上图中选择全局变量,即可打开一个全局变量的VI程序,当然这个VI程序只有前面板,在前面板上放置你需要的变量控件,每个变量控件即可代表一个全局变量,如下图所示:在上图中放了两个控件,分别为数值型和布尔型的控件,其名称分别为“全局变量a”和“全局变量b”,并将这个VI保存为“MyGloableVar.vi”文件。
( 2 ) 方法2如果已经打开了一个普通的VI程序,可以在程序框图右键菜单的函数模板上创建,在函数模板中选择“编程”-->“结构”-->“全局变量”,如下图所示:将全局变量放到程序框图中后,双击该图标,通过这种方法同样可打开一个只包含前面板的VI全局变量程序,后续操作同第一种方法相同。
全局变量调用方法如果要在一个VI程序中使用全局变量,可通过下面三种方法将全局变量导入到当前VI的程序框图中:1. 由函数模板中的“选择VI…”子模板打开选择用户程序对话框,选择已经保存的全局变量VI程序,此时将在框图程序中显示全局变量的数据端口。
2. 如果已经打开了全局变量的VI文件,可拖动该VI文件前面板右上角的全局变量图标到当前程序框图中,此时将在框图程序中显示全局变量的数据端口。
Labview之如何创建通用属性节点和调用节点第一篇:Labview之如何创建通用属性节点和调用节点LV Nugget之如何创建通用属性节点和调用节点2011-01-01 07:34我们必须注意,LV中的数据都是以输入控件、显示控件和常量的方式存在的,通用控件的引用本身也是一种特殊的控件,这导致了许多初学者在使用通用引用时出现了问题。
NI论坛上有几个帖子就出现了这样的问题,我简单了回答了一下,但是网友无法理解,发邮件希望我给解答一下,在这里我一并回答这个问题。
帖子地址为:对于前面板中的控件,可以直接通过控件的快捷菜单创建它的引用、属性节点、调用节点、常量、局部变量等等,以多列列表框为例,直接利用控件的快捷菜单。
在程序框图中的控件的接线端子中,同样可以利用接线端子的快捷菜单,创建指向控件的引用、属性节点等,与控件的快捷菜单功能是相同的。
我们知道,对于前面板中的控件,直接创建它的属性节点和调用节点时,是不需要连接引用的,这是因为我们通过快捷菜单创建时候,LV自然知道创建的属性节点和调用节点是指向这个特殊控件的。
实际上,我们也可以通过控件的引用,间接创建这个控件的属性节点和调用节点,在应用控制函数选板中提供了很多与引用有关的操作,包括属性节点和调用节点。
箭头所示的属性节点和调用节点在使用时候必须连接控件的引用,也就是说这里的属性节点和调用节点是通用的,不指向任何特定控件的,只有连接一个引用的时候,它才会指向一个特定的控件或者特定的控件类型,指向特定的控件如下图所示,指向特定的控件类型则是我们将要重点讨论的。
红色框中所示的就是利用控件的引用和通用属性节点和方法节点,实现的功能是和框图左侧部分相同的。
如上图所示,如果简单的要使用控件的属性节点和方法节点,那么利用通用属性和通用调用方法似乎是没有意义的。
的确是这样,通用属性节点和调用方法更为重要的意义在于它和通用控件引用相结合。
请参考上面的帖子,为什么网友会出现那样的问题?从上面的图中,我们可以看出,网友已经成功地床架的多列列表框控件的引用。
定义常量的方法
定义常量的方法有以下几种:
1. 在代码中直接使用字面值:将常量的值直接写在代码中,不使用变量来表示。
例如:const int a = 10;。
2. 使用宏定义:使用宏定义来定义常量,在代码中使用宏名称来表示常量的值。
例如:#define PI
3.14。
3. 使用枚举(enum):使用枚举类型来定义常量,枚举类型中的每个成员都代表一个常量。
例如:enum Colors {RED, GREEN, BLUE};。
4. 使用命名空间:将常量定义在命名空间中,通过命名空间来访问常量。
例如:namespace MathConstants {const float PI = 3.14;}。
无论使用哪种方法来定义常量,常量的值都不能在程序运行过程中改变,它在定义时就被确定下来了。
常量的作用是为了提高程序的可读性和可维护性,增加代码的可靠性和安全性。
LabVIEW是实验室虚拟仪器集成环境(Laboratory Virtual Instrument Engineering Workbench)的简称,是美国国家仪器公司(NATIONAL INSTRUMENTS,简称NI)的创新软件产品,也是目前应用最广、发展最快、功能最强的图形化软件集成开发环境。
LabVIEW是一种图形化编程语言,又称G语言。
其编写的程序称为虚拟仪器VI(Virtual Instrument),以.VI后缀。
LabVIEW模板:◆工具模板(Tools Palette)◆控件模板(Controls Palette)◆功能模板(Functions Palette)VI的组成:◆前面板(Panel)控制(Control),指示(Indicator),修饰(Decoration)。
将前面板中的控制和指示统称为前面板对象或控件。
◆框图程序(Diagram Programme)节点(Node),数据连线(Wire)节点有:功能函数(Functions),结构(Structures),代码接口节点(CIN),子VI(SubVI)。
数据端口有:控制端口和指示端口,节点端口。
LabVIEW编程又称为“数据流编程”。
◆图标/连接端口(Icon/Terminal)把VI作为一个SubVI在其它VI中调用。
常用术语:SubVI 子VI Chart 实时趋势图LLBs VI库Graph 事后记录图Objects 对象Functions 功能Panel 前面板Structures 结构Block Diagram 框图程序Cluster 簇Control 控制Bundle 打包Indicator 指示Unbundle 解包Control和Indicator 前面板对象或控件RefNum 枚举,标志号Palette 模板Local Variable 本地变量Functions Palette 功能模板Global Variable 全局变量Controls Palette 控件模板Constant 常量Tools Palette 工具模板Disable Indexing 无索引Terminal 端口Enable Indexing 有索引Wires 数据连线Read Local 本地读Bad Wires 错误数据连线Write Local 本地写Node 节点Read Global 全局读Attribute Node Write Global 全局写Property Node 属性节点Legend 图例Frame 框架Cursor 光标Channel 框架通道Bounds 边界范围Index 索引Data Acqisition(DAQ) 数据采集Shift Register 移位寄存器Label 标签运行VI1.运行VI(Run)2.连续运行VI(Run Continuously)3.停止运行VI(Abort Execution)4.暂停运行VI(Pause)调试VI1.单步执行单步(入),单步(跳),单步(出)2.设置端点3.设置探针4.显示数据流动画数据类型:基本数据类型:数字型(Numeric),布尔型(Boolean),字符串型(String)构造数据类型:数组(Array),簇(Cluster)其它数据类型:枚举(RefNum),空类型数组(Array):索引号从0开始一维数组(1D,列或向量),二维数组(2D,矩阵)组成:数据类型,数据索引(Index),数据创建:1.控制模板->Array & Cluster子模板2.根据需要将相应数据类型的前面板对象放入数组框架中使用:1.Array Size返回输入数组的长度2.Index Array返回输入数组由输入索引指定的元素3.Replace Array Element替换输入数组的一个元素4.Array Subset从输入数组取出指定的元素5.Reshape Array改变输入数组的维数6.Initialize Array初始化数组7.Build Array建立一个新数组8.Rotate 1D Array将输入数组的最后n个元素移至数组的最前面9.Sort 1D Array将数组按升序排列10.Reverse 1D Array将输入的1D数组前后颠倒,输入数组可以是任何类型的数组11.Transpose 2D Array转置输入的二维数组,也叫矩阵转置12.Search 1D Array搜索指定元素在一维数组中的位置13.Array Max & Min返回输入数组中的最大值和最小值14.Split 1D Array将输入的一维数组在指定的元素处截断,分成2个一维数组15.Interpolate 1D Array线性插值16.Threshold 1D Array一维数组阀值,是线性插值的逆过程17.Interleave 1D Arrays将从输入端口输入的一维数组插入到输出的一维数组中18.Decimate 1D Array将输入的一维数组分成数个一维数组,是Interleave 1D Arrays的逆过程簇(Cluster):类似于Pascal语言的record和C语言的struct组成:不同的数据类型创建:控制面板—>Array & Cluster子面板;向框架添加所需的元素;根据需要更改簇和簇中元素的名称使用:1.Unbundle解包。
01、什么是labviewLabview概述虚拟仪器(virtual instrumention)是基于计算机的仪器。
计算机和仪器的密切结合是目前仪器发展的一个重要方向。
粗略地说这种结合有两种方式,一种是将计算机装入仪器,其典型的例子就是所谓智能化的仪器。
随着计算机功能的日益强大以及其体积的日趋缩小,这类仪器功能也越来越强大,目前已经出现含嵌入式系统的仪器。
另一种方式是将仪器装入计算机。
以通用的计算机硬件及操作系统为依托,实现各种仪器功能。
虚拟仪器主要是指这种方式。
下面的框图反映了常见的虚拟仪器方案。
虚拟仪器的主要特点有:•尽可能采用了通用的硬件,各种仪器的差异主要是软件。
•可充分发挥计算机的能力,有强大的数据处理功能,可以创造出功能更强的仪器。
•用户可以根据自己的需要定义和制造各种仪器。
虚拟仪器实际上是一个按照仪器需求组织的数据采集系统。
虚拟仪器的研究中涉及的基础理论主要有计算机数据采集和数字信号处理。
目前在这一领域内,使用较为广泛的计算机语言是美国NI公司的LabVIEW。
虚拟仪器的起源可以追朔到20世纪70年代,那时计算机测控系统在国防、航天等领域已经有了相当的发展。
PC机出现以后,仪器级的计算机化成为可能,甚至在Microsoft 公司的Windows诞生之前,NI公司已经在Macintosh计算机上推出了LabVIEW2.0以前的版本。
对虚拟仪器和LabVIEW长期、系统、有效的研究开发使得该公司成为业界公认的权威。
普通的PC有一些不可避免的弱点。
用它构建的虚拟仪器或计算机测试系统性能不可能太高。
目前作为计算机化仪器的一个重要发展方向是制定了VXI标准,这是一种插卡式的仪器。
每一种仪器是一个插卡,为了保证仪器的性能,又采用了较多的硬件,但这些卡式仪器本身都没有面板,其面板仍然用虚拟的方式在计算机屏幕上出现。
这些卡插入标准的VXI机箱,再与计算机相连,就组成了一个测试系统。
VXI仪器价格昂贵,目前又推出了一种较为便宜的PXI标准仪器。
用到的Labview知识点:属性节点、引用句柄、子VI、枚举、条件结构、连线板
首先创建三态的子VI:
1.在前面板添加“枚举”控件以及Bool引用句柄,创建布尔引用句柄方法为:先添加“控件引用句柄”,然后右键→选择VI服务器类→通用→图形对象→控件→布尔,并勾选“包括数据类型”;
2.在程序框图添加“属性节点”,并和Bool引用句柄连线;
3.添加“条件结构”,并同“枚举”类型连接,其中“枚举”类型的“编辑项”属性中添加三态:default,run,fault;
4.在每态条件结构中分别定义“数组常量”,然后添加“簇常量”,并在“簇常量”中添加两个“颜色盒常量”,然后将这个“簇常量”整体放入前面定义的“数组常量”,并同“属性节点”连线;
5. 程序框图如下图所示:
6.在前面板中对子VI进行连接线定义:前面板中右键子VI图标,选择编辑图标,此处选取自己喜欢的子VI图标,并勾选显示接线端,退出编辑后,继续右键子VI图标,选择“显示连线板”,开始选取子VI的连线板,这里选择前面板中的“枚举”和“bool引用句柄”这两个输入,至此子VI建立完成,前面板如下图所示:
子VI建立好后,就可以设计一个指示灯,试验一下三态LED的运行情况了,我添加的一个简单VI如下图,这里注意的是要创建指示灯的一个bool引用:
程序建立完成后,就可以运行了,试验结果表明此VI能很好的实现三态LED显示。
一、数值型控件和常量1. 控件在LabVIEW的控件栏中有一栏是数值控件。
这一栏内的控件虽然在前面板上的外观各不相同,但是在框图中的端点都是数值类型的。
我们在使用这些数值控件时可以选择适合的界面所需的旋钮、仪表盘等。
还可以在数值型控件的属性对话框里设置它的数值类型、数值范围、格式和精度等,显示方法等等。
我们以最普通的数值控件为例,解释一下如何配置它的显示方式。
假如,我们的界面是 Windows 风格的,那么界面上所有的控件都应使用系统风格的控件,包括数值型控件。
如果这个控件用于表示时间,我们就需要对这个控件的显示方法进行高级的配置。
打开这个控件配置面板的格式与精度页,选择“Advanced editing mode”,就可以自己为控件设置显示方式了。
2. 常量如果是常量,在设置数值类型时通常会发现“Adapt to Source”(按照输入调整)项是被选中的,作为控件时这一项不能被选中。
此时如果在常量中输入一个正数,比如“34”,常量的类型会自动变为I32整型(蓝色),而输入“34.3”,常量的类型会自动变为DBL实数型。
如果一定要输入实数型34,可以输入34.0。
3. 不同表示法(Representation)的选择数值类型包括各种长度的整型、实数型和虚数型,其中I64和U64类型是LabVIEW 8.0新增加的。
选用短整型数值比选用长整型数值类型节约内存。
在大的数值数组中应尽量使用短类型数值以节约内存。
对于单个数值,它可以节约的内存十分有限,但是使用长整型数值可以避免数值越界引起的错误,所以还是应该使用长整型数值。
你可以自己做个试验:新建一个 VI,在 VI 上放置两个值为 300 的 I16 常量,然后相乘,看看他们的积是多少。
这种错误如果隐藏在一个大工程内,调试起来也是颇为费劲的。
程序框图对象程序框图对象包括接线端和节点。
将各个对象用连线连接便创建了程序框图。
接线端的颜色和符号表示相应输入控件或显示控件的数据类型。
常量是程序框图上向程序框图提供固定数据值的接线端。
程序框图接线端前面板上的对象在程序框图中显示为接线端。
双击程序框图上的一个接线端,则前面板上相应的输入控件或显示控件将高亮显示。
接线端是前面板和程序框图之间交换信息的输入输出端口。
输入到前面板输入控件的数据值经由输入控件接线端进入程序框图。
运行时,输出数据值经由显示控件接线端流出程序框图而重新进入前面板,最终在前面板显示控件中显示。
LabVIEW中使用的接线端包括输入控件和显示控件接线端、节点接线端、常量及用于各种结构的接线端。
连线则把接线端连接起来,使数据在接线端间传递。
右键单击一个程序框图对象,从快捷菜单中选择显示项»接线端可查看接线端。
再次右键单击该对象,从快捷菜单中选择显示项»接线端可隐藏接线端。
该快捷菜单项对于可扩展VI和函数不可用。
浮点数据的符号数值如数据未定义或数据是非预期数据,会影响后续操作。
浮点数据操作返回以下两种符号值用以表明错误的计算或无意义的结果:∙NaN(非法数字)表示无效操作所产生的浮点值,如对负数取平方根。
∙Inf(无穷)表示超出某数据类型值域的浮点数值。
例如,1被0除时产生Inf。
LabVIEW可返回+Inf或-Inf。
LabVIEW不检查整数的上溢或下溢条件。
浮点数的上溢和下溢符合IEEE 754浮点数算术标准。
浮点运算能可靠地传送NaN和Inf。
而整数和定点数不支持符号数值。
将+Inf转换为整数或定点数时,其值变为该数据类型的最大值。
例如,将+Inf转换为16位有符号整数的结果为32,767(16位有符号整数能表示的最大值)。
LabVIEW将-Inf转换为该数据类型的最小值。
将NaN显式或隐式转换为整数或定点数时,其值将变为目标数据类型的最大值。
在将数据转换为整数或定点数据类型前,可先用探针工具查看中间浮点数值是否有效。
本文为LabVIEW内部交流资料,来自网络,特此说明开发机上激活以后,如果开发机升级了或者换了或者增加新的配置了等等,难道要重新购买一套8.2吗?回答=更改了配置,那么lisence manager里的机器码肯定会变,所以需要重新向NI申请激活码激活.NI的IVI驱动的来源?回答=由于NI开发的IVI驱动程序库已经包含了仪器的Class Driver,因此,程序员只要按照IVI的规范开发自己仪器的Specific Driver,就可以实现仪器的互换性。
LV和CVI的专用驱动可以从NI的网站下载,源代码是用c编写的32位的DLL形式,这就保证驱动可以直接在你的开发环境中使用(LV,CVI,VC等)。
在运行过程中LabVIEW能否添加控件?回答=不能,只能在编辑状态是做。
不过可以事先多创建几个控件,然后隐藏。
再需要使用的时候使用属性节点来操作。
编写的LV的GPIB通讯程序,从示波器读取数据。
单独可以正常执行,但放置在一个事件结构的一个WHILE循环里时,运行程序后,程序会变得不相应,而且前面板不可控制。
回答=查看客户程序,GPIB程序并没什么问题,但是作为一个子程序放在事件结构里就会存在问题,而且子程序运行时,主界面默认的是不响应的。
如果要解决这个问题,需要选择事件结构编辑面板最下方有一个默认选项,用于设置是否在事件结构执行完成之前锁定前面板,默认为锁定,取消即可。
IVI的分类。
回答=因为所有的仪器不可能具有相同的功能,因此不可能建立一个单一的编程接口。
因此,IVI的驱动分为两类。
(1) 类驱动程序(Class Drive):它们是在特定类中编写仪器软件的标准接口。
这意味着软件开发者能重复使用他们的软件系统而不会由于低层硬件更改而被迫重新测试软件系统。
目前,IVI驱动程序库可用于下列几类仪器:示波器数字化仪表、开关多路复用器、数字万用表、任意波形发生器函数发生器等。
(2) 设备类驱动程序(Specific Drive):每种牌号和类型的仪器均有相应的专用驱动程序。
在 LabVIEW 中使用常量定义
如下图所示,在 C 语言里,使用 #define来定义一个常数是非常基本的用法。
直接使用数字, 时间一长,就不只到这个数字是哪来的了。
而且, 这种方法也便于修改在程序中多处使用的常量的值。
在 C++一般是用 const
来达到同样的目的。
图 1:C 语言中的常量定义
我以前在 LabVIEW 中编程,还从没注意过这个问题。
一般哪里要用一个常数,直接就放一个 constant 在那里。
如图 2。
图 2:在 LabVIEW 中使用常量的最普遍方法
以前编写的 LabVIEW 程序都比较小,一般是一个人开发的,所以这样写,也没有太大的麻烦。
现在编写的程序规模越来越大,最近做的一个项目, VI 数量已经上千了,有 4个人参与编程。
程序规模大了,不规范就很难维护。
所以开始考虑这个问题。
但是 LabVIEW 里面没有类似的功能,不知道为什么以前没人提意见?
下面提出几种不算太完美,但有所进步的解决方案。
一种简单的替代方法是使用 type define control, 自定义一个 Ring control。
关于Type Def 的详细信息, 可以参考《用户自定义控件中 Control, Type Def. 和 Strict Type Def. 的区别》。
把要使用的常数作为 Ring 的值,给他个有意义的文字标签。
在需要时用常数的地方,把这个带 type define 的 ring 常数放上去,而不是直接放数值常量。
这样就解决了上面提到的一个问题:可以有自带的文字说明。
如图 3所示。
图 3:利用 Type Def Ring 的解决方案
但是这样做还是有很多缺陷。
首先是统一修改数值的问题。
在自定义 Ring 中修改某一项的值, 相关的常量不会跟着一起更新; 还有一个缺陷是 Ring control 不支持多个标签是用同一数值;另外 Ring control 也没办法像 C 语言中一样使用表达式定义值。
一个改进版的解决方案是使用 Enum Type Def 把所有常量名字列出来,再写一个 VI 用于得到常量的真实值,如图 4所示。
这样解决了不同标签可以返回相同值的问题,也可以自动更新常量值,但是使用表达式还是不方便。
图 4:利用 Enum Type Def 和 subVI
我目前在程序中使用的方法是, 把所有要用到的常量, 全部做成全局变量。
全局变量可以用 Global ,但我喜欢用 VI 全局变量。
就是把变量记载 shift regisiter 中。
然后,用一个初始化的 VI 负责在程序运行开始时初始化所有的全局变量。
这样,以后如果需要更改某一常数值,就只需改这一个 VI 就可以了。
不过, 现在回想, 还是用 Global 好一些。
我以前测试过, Global 读写的速度比VI 要慢很多,所以我不喜欢 Global 。
但是,常量值在程序中用的并不频繁,所以速度不是个问题。
但是数量很多,用 VI 表示就不太合适了,每个常数都要创建一个 VI 非
常费事。
另一个缺点是如果在后面板换用一个常量,还要再拖另一个 VI 上来,很麻烦。
用 Global 会好一些,但还不是让我太满意。
要想有一个完美的解决办法,只能再造一个新东西了。
@#$%^&* (此处属公司机密, 删去 256字。