当前位置:文档之家› labVIEW学习文件

labVIEW学习文件

labVIEW学习文件
labVIEW学习文件

程序框图对象

程序框图对象包括接线端和节点。将各个对象用连线连接便创建了程序框图。接线端的颜色和符号表示相应输入控件或显示控件的数据类型。常量是程序框图上向程序框图提供固定数据值的接线端。

程序框图接线端

前面板上的对象在程序框图中显示为接线端。双击程序框图上的一个接线端,则前面板上相应的输入控件或显示控件将高亮显示。

接线端是前面板和程序框图之间交换信息的输入输出端口。输入到前面板输入控件的数据值经由输入控件接线端进入程序框图。运行时,输出数据值经由显示控件接线端流出程序框图而重新进入前面板,最终在前面板显示控件中显示。

LabVIEW中使用的接线端包括输入控件和显示控件接线端、节点接线端、常量及用于各种结构的接线端。连线则把接线端连接起来,使数据在接线端间传递。右键单击一个程序框图对象,从快捷菜单中选择显示项?接线端可查看接线端。再次右键单击该对象,从快捷菜单中选择显示项?接线端可隐藏接线端。该快捷菜单项对于可扩展VI和函数不可用。

浮点数据的符号数值

如数据未定义或数据是非预期数据,会影响后续操作。浮点数据操作返回以下两种符号值用以表明错误的计算或无意义的结果:

?NaN(非法数字)表示无效操作所产生的浮点值,如对负数取平方根。

?Inf(无穷)表示超出某数据类型值域的浮点数值。

例如,1被0除时产生Inf。LabVIEW可返回+Inf或-Inf。

LabVIEW不检查整数的上溢或下溢条件。

浮点数的上溢和下溢符合IEEE 754浮点数算术标准。

浮点运算能可靠地传送NaN和Inf。而整数和定点数不支持符号数值。将+Inf转换为整数或定点数时,其值变为该数据类型的最大值。例如,将+Inf转换为16位有符号整数的结果为32,767(16位有符号整数能表示的最大值)。LabVIEW将-Inf转换为该数据类型的最小值。

将NaN显式或隐式转换为整数或定点数时,其值将变为目标数据类型的最大值。

在将数据转换为整数或定点数据类型前,可先用探针工具查看中间浮点数值是否有效。将比较函数非法数字/路径/句柄?连

接到有效性可疑的数据上,通过程序检查数据是否为NaN。也可使用判定围并强制转换函数将值保持在指定的围。

常量

常量是程序框图上向程序框图提供固定数据的接线端。通用常量即有固定值的常量,如pi(π)和Inf(∞)。用户定义常量是在VI运行前由用户定义和编辑的常量。

右键单击一个常量并从快捷菜单中选择显示项?标签可为该常量加标签。操作工具或标签工具可对通用常量的标签进行编辑,设置其预定义值。

常量一般位于所在选板的底部或顶部。

通用常量

通用常量可进行数学运算及对字符串或路径的格式化。LabVIEW有以下类型的通用常量:

?通用数值常量-高精度和常用数学及物理值的集合,如自然对数的底(e)和光速。通用数字常量位于数学与科学常量选板上。

?通用字符串常量-常用的无法显示字符的集合,如换行和回车。通用字符串常量位于字符串选板上。

?通用文件常量-常用文件路径值的集合,如非法路径、非法引用句柄和默认目录。通用文件常量位于文件常

量选板上。

用户定义常量

按类型排列常量的函数选板,包括布尔、数值、下拉列表、枚举型、颜色盒、字符串、数组、簇和路径等常量。

右键单击VI或函数的输入端,从快捷菜单中选择创建?常量可创建一个用户定义常量。

VI运行时不能修改用户定义的常量。

也可通过将一个前面板控件拖曳到程序框图的方式创建常量。将前面板控件拖放至程序框图时,LabVIEW将创建一个包含该控件值的常量。但前面板控件仍留在前面板上。改变该控件的值并不影响该常量的值,反之亦然。

用操作工具或标签工具单击常量可编辑常量的值。如自动选择工具已启用,则双击该常量可切换到标签工具,从而编辑常量菜单值。

常量折叠

LabVIEW通过常量折叠来提高VI的执行速度。启用常量折叠,LabVIEW将在第一次运行VI时计算常量的值,而不是每次运行时计算一次。

程序框图节点

节点是程序框图上的对象,带有输入输出端,在VI运行时进行运算。节点相当于文本编程语言中的语句、运算符、函数和子程序。LabVIEW有以下类型的节点:

?函数-置的执行元素,相当于操作符、函数或语句。

?子VI-用于另一个VI程序框图上的VI,相当于子程序。

?Express VI-用于常见测量任务的子VI,在配置对话框中配置Express VI。

?结构-执行控制元素,如For循环、While循环、条件结构、平铺式和层叠式顺序结构、定时结构和事件结构。

?公式节点和表达式节点-公式节点是可以直接向程序框图输入方程的结构,其大小可以调节。表达式节点是用

于计算含有单变量表达式或方程的结构。

?属性节点和调用节点-属性节点是用于设置或寻找类的属性的结构。调用节点是设置对象执行方式的结构。

?通过引用调用节点-用于调用动态加载的VI的结构。

?调用库函数节点-调用大多数标准共享库或DLL的结构。

返回页首

多态VI和函数

多态VI和函数会根据输入数据类型的不同而自动调整数据类型。与某些VI和函数一样,绝大多数的LabVIEW结构为多态。

函数多态的程度各不相同:可以是全部或部分输入多态,也可以是完全没有多态输入。有的函数输入可接收数值或布尔值,有的函数输入可接收数值或字符串,一些函数的输入不仅接收标量数值,还接收数值数组、数值簇或数值簇数组等。还有一些函数输入仅接收一维数组,即使其数组元素可以是任意数据类型。另外,有的函数输入可接收所有数据类型,包括复数值。

数据基本类型

1数值型:数值型数据是一种标量值,包括浮点数、定点数、复数、整数等数值类型。不同数据类型的差别在于存储数据使用的位数和表示围。注意,定点型数据类型可以根据用户的需要自己制定围和精度以及是否带符号。

默认情况下创建的数值型变量的数据类型为双精度浮点数。

2布尔型:布尔型即逻辑值,其取值只能是真或假。要改变布尔型常亮的值可以直接单击对应的框图端子,即可以在真常量

和假常量之间互换。

3字符串型:支持对字符串数据的存储和修改功能。字符串的显示方式有

(1)‘\’代码显示:不可见字符换行、空格等将‘\n’‘\s’方式显示,常用于调试或发送通信命令时的显示。

(2)密码显示:所有字符均已‘*’显示。

(3)十六进制显示:以十六进制方式显示字符的ACSII码,用于仪器的调试与通信。

4文件路径型:是在字符串基础上的一种派生类型,专门用于存储和处理文件的路径。

复合数据类型

复合数据类型是在基本数据类型的基础上的进一步拓展,用于多个相同或不同的基本数据类型组成数组、簇、矩阵鞥复合结构。

1数组:支持一维或多维数组,统一数组中的所有元素必须隶属于同一基本数据类型。

2簇:簇的功能和C语言当中的struct结构体相似,可以将若干种不同数据类型的数据集合在一起,作为一个整体进行处理。以簇作为连接单元,可以使连线数量和子VI的接口数量大大减少。注意:簇作为一个整体,只能为输入控件和显示控件,所以变量被拖入簇中成为簇元素后,都统一变成的输如控件和显示控件。

程序流程控制

程序流程控制结构包括顺序结构、选择结构、循环结构、事件结构等。

1顺序结构:主要分为平铺式书序结构和层叠式顺序结构,都是用来强制程序流程一步步书序执行。顺序结构中含有一个或者多个帧,每一帧中的程序同时执行,自行完以后才进入下一帧继续执行。注意,顺序结构中的数据流只能是从前面的帧向后面的帧流动,反之则不行。对于平铺式顺序结构可以直接通过连线实现,而对于层叠式顺序结构则需要通过书序局部变量实现从前帧到后帧的数据传递。

2条件结构:相当于C语言中的if…else语句,可以根据不同的执行条件执行不同的程序块。条件结构可以由多个分支组成,对应于不同的条件。

3循环结构:循环结构主要分为for循环结构和while循环结构两种,分别和C语言中的for语句和do…while语句相似,都可以用来控制特定的程序块自动重复执行若干次。

(1)For循环有规定的循环次数,可连接至一个整数以指定循环次数,循环执行规定的次数以后推出循环。For循环具有条件连线的特性,右键单击for循环边框,从菜单中选择“条件接线端”就可以为for循环添加一个条件接线端,当满足改逻辑

条件时或者所有循环执行完毕时,都可以推出循环,这就为中途跳出for循环提供了方便,这就相当于C语言中的break语句。

(2)While循环没有规定的循环次数,却总有一个条件接线端。While循环运行时先重复循环中的容一次,达到条件接线端的条件推出循环,所以while循环总是至少执行一次,相当于C语言中的do…while循环语句。

(3)在循环结构中最重要的是移位寄存器,所谓的移位寄存器是用来存储和传递上一步或多不循环的数据。每一步循环结束以后右端子便将接收到的数据传给左端子,下一步循环时左端子给出的数据便是上一步循环中右端子接收的数据。

左端子的初始值可以在外部循环外连接,初始值的数据类型决定了移位寄存器中所存储数据的类型,不仅可以连接至数值型标量,也可以连接至数值型数组,或者是其他数据类型的标量或数组。循环结构外部的数据交换是可以通过两种方式进行:自动索引和直接通道。当循环结构的呢外部数据通过连线进行交换时,必会在循环边框中产生一个节点,分别对应于自动索引通道和直接通道。当数据从外部进入循环结构时使用自动索引可以是每一步循环中读取其中一个低一维的数据,即每次读取的数据比循环外部的输入数据类型维数少一维。输入数据若是标量则始终读入该标量值;若输入为数组,则从前至后一次读个元素。但是使用直接通道,表示整个数据直接进入循环,其值和维数不变。但数据从部六出循环结构时,使用自动索引可以使每步单步循环

中得到的数据自动排列成为一个数组,最后得到的数组比循环中数据类型的维数多一维。使用直接通道是表示数据直接从循环部传至外部,其值和维数不变。

4事件结构:用来响应各种用户信息、系统消息的处理结构。如果单独使用一个事件结构,则只能响应一次事件。为保证持续响应多次事件,常将事件结构嵌套在while循环中使用。

使用事件设置,可以达到用户在前面板的操作和程序始终处于查询状态。

使用事件结构编程的黄金原则:1、应该将事件结构放在while循环,不要将事件结构放在while循环之外;2、不要在事件结构部循环处理事件;3、记得为事件结构添加一个独立处理停止按钮的分支。

事件结构

其中左上角为事件超时连接器,用于连接已个数值指定的等待事件的毫秒数,默认值为-1,为无限等待。超过设定的等待时间没有发生事件,程序产生一个超时事件。

事件数据节点,用于访问事件的数据值。可以缩放事件数据节点显示哥事件数据项。

标签选择器,表明那些事件引起当前子程序框图的执行。

5用户自定义事件:用户事件允许应用程序的不同部分之间进行异步通信,用户自定义事件需要的函数如图所示

该函数集包括创建自定义事件、产生自定义事件、取消自定义事件、销毁自定义事件和注册自定义事件。

用户自定义事件程序框图

LabVIEW支持静态和动态的事件注册模式。其中动态事件不仅可以注册,还可以修改。只有用户事件界面才能进行静态事件注册,允许制定的VI则程序框图上的事件结构的没一个分支具体该处理该VI在前面板上的那些事件,但是首要的必须选择事件源,这个事件源可以是程序、VI或者是某个控件。下图为使用静态事件注册方式,在前面板上控制一个布尔型控件。

动态事件注册:动态时间注册通过将时间猪儿侧与VI服务器相结合,允许在程序运行时使用应用程序、VI和控件引用来制定希望产生事件的对象。动态事件可以让事件仅在应用程序中的某个部分发生,或是在应用程序运行时改变产生事件的VI或控件。处理动态事件的步骤主要有以下4个:

1、获取要处理事件的对象的VI服务器引用。

2、将VI服务器引用连接至“注册事件”函数以注册对象的事件。

3、将事件结构放在while循环中,等待处理对象事件至出现终止条件为止。

4、通过取消注册人事件函数停止事件的发生。

1.状态机

状态机具有三个基本要素:状态、事件、动作。状态机本身并不会改变状态,当前状态也并不会传递任何外部代码给状态机,而仅仅是传递发生的事件。

2.枚举

枚举型变量主要有控制型、显示型和常量型三种形式。通过在编辑项即可通过在“在后面添加项”、“在前面添加项”添加需要添加的枚举类型。枚举值实质上属于数值型,但是二者的显示方式和存储方式不同,并且可以相互转换。枚举值的类型转换类型主要分为隐式类型转换(强制转换类型)和显式类型转换。隐式类型转换类型是由系统自动完成的,可以将枚举类型空间直接和数值型控件相连,此时相当于完成了类型转换。显式类型转换需要添加相应的转换代码。

测试流程型状态机:是为了能过在程序运行中改变状态顺序执行的状态序列的执行顺序,采用移位寄存器代替循环索引控制状态机的执行。移位寄存器的高度灵活性可以使程序员可以按照实际情况设定状态序列的实际执行顺序。顺序型状态机有一个缺点就是不便于阅读

和修改程序,Case结构的子框图列表中显示的是数值,不具有任何实际意义。

a测试流程状态机计时—状态0

b测试流程状态机计时—状态1

c测试流程状态机计时—状态2

3.消息队列处理模式

3.1消息队列

消息队列可以看作是一段存储空间,是用来暂存各种消息。之所以称之为队列,是由其消息处理机制决定的,按照FIFO(First In First Out)的思想,需要使用消息队列处理各种消息。程序初始化时首先创建消息队列缓冲器,程序可以根据发生的事件将相应的消息投入到消息队列之中,消息处理机构会实时探测消息队列中的消息并按照消息处理机制进行处理,当消息被接收后程序执行相应的代码,并将该消息从消息队列中删除;当接收到消息Exit时,应用程序停止运行,并释放队列空间。必须注意的是,消息队列的销毁非常重要,因为他关系到整个应用程序的稳定性和高效性。而且消息源将消息投入到消息队列中和消息的探测是同时进行的,我们可以充分利用并行程序运行机制处理消息循环。

建立消息队列最常用的是使用队列函数和数组。在队列函数里面我们最常用的队列引用、元素如队列、元素出队列和释放队列应用,

分别用于产生队列、经元素加入队列、将元素一处队列以及释放队列空间。

在这里还有一些其他模式,前面介绍的模式都具有很强的扩展性,在流程设计中能够满足大多数应用的需要,还有一些模式,在这里简单的提一下,具体容有需要的可以自己学习。

(1)主从线程模式,通常应用于具有两个或多个同时发生的并具有不同运行速率的程序中。需要注意的是有人将两个动作放在同一个while循环中,这是可以的,可以完成程序并行运行的要求,但是无法满足时间的要求。所以在设计程序的时候建议可以在多个循环中放置不同的动作,这样二者互不影响数据通信采用全局变量或者共享变量的形式。

(2)生产消费者模式,所谓的生产消费者模式借助队列技术使用一部分顺冲区作为数据存储的中间部分,已解决在像主从模式的数据通信过程中利用全局变量、局部变量、或共享变量实现时变量会占据大量的空间的问题。这种模式仍然采用两个简单的while循环,但是数据通信采用队列结构,一方面将采集的数据传送给队列空间,另一方面从队列空间中速出数据,二者是相互独立而又密切联系的。同样生产消费模式不仅仅局限于while循环。

(3)后台服务模式,这种程序一般不需要用户的干涉而在计算机后台运行,即不需要显示应用程序显示前面板。主要是利用laVIEW 的VI属性和方法接口实现,通过这些接口可以很方便的控制VI的一些固有属性和运行状态。

除了上述的三种模式以外还有应用程序启动模式和代理模式等,这些模式同学们在学习过程中要是需要可以百度或是其他方面的资料进行了解和学习。

LabVIEW多线程

多线程的应用主要是为了让CPU得到充分的使用。这里有线程和进程两个基本的概念,简单的说,简称就是正在运行的应用程序,在计算机中处于运行状态的一个程序就是一个进程,抽象的讲,进程是一些所欲全的集合,这个进程当中包括地址空间和动态分配的存、文件、线程等其他模块。进程是表达程序对各种资源的所有权,线程才是程序的最小执行单位。所谓的线程就是程序执行的路径,是操作系统分配CPU时间的基本实体,说的通俗一点,就是每一个程

序执行时该从那条路进入CPU得到CPU的处理。一个进程中的多个线程共享进程的公共资源,同一进程所有的线程共享同样的虚拟资质空间、全局变量。

程序是指一个静态的指令序列;进程是值为执行程序指令的线程儿保留的一系列资源的集合;线程是操作系统用来调度执行的最小单位。

线程通信和同步:线程间通信一般是通过全局变量、全局数据、文件句柄或是通信参数等进程数据结构来完成。线程同步是为了避免同时运行的线程在共享资源的同时干扰对方的操作。线程的同步一般分为数据同步,设备同步和任务同步三种情况。

1局部变量

创建方式:a“函数—编程—结构—全局变量”路径创建,此时局部变量的图标会有一个问号,需要选择与之相关联的对象后方可使用。

b:选择目标对象以后右键快捷菜单中的创建—局部变量,放置到背面板的相应位置。

(2)局部变量状态

A:读状态,相当于控制对象,外观和控制对象的端子相似,是粗边框。

B:写状态,相当于显示对象,外观和显示对象相似,为细边框。

需要注意的是局部变量在使用是只能有一中状态,两者之间的相互转换可以使用快捷菜单中的转换为输入/输出功能。

(3)局部变量的使用情况

A:并行循环控制时主要用于用一个变量同时控制几个并行的while循环的情况。

B:变量数值的更新是指在程序运行时,同一个对象既可以作为输入给程序赋值,也可以作为输出显示当前状态。

局部变量会赋值数据到缓冲区,从一个局部变量读取数据时,便为相关控件数据创建了一个新的缓冲区。如果大量使用局部变量传递数据,会占用大量的存,导致执行虚度比使用连线传递数据,这一点洗完大家在使用的时候特别注意。

2全局变量

(1)创建方式;函数—编程—结构—全局变量路径创建,在程序框图会出现“?”端子,表示该变量尚未定义。

(2)使用情况,主要用于VI之间的数据传递和变量数据的定义。

相关主题
文本预览
相关文档 最新文档