LabVIEW 教学教程

unclem

贡献于2014-06-11

字数:27134 关键词: 嵌入式开发 教学

LabVIEW实践教程 测控工程实践 LabVIEW教学教程 黑龙江科技学院 电气与信息工程学院 测控技术与仪器教研室 测控技术与仪器教研室 /87 LabVIEW实践教程 第一讲 LabVIEW概述 第一节 虚拟仪器(VI)的概念 使用LabVIEW开发平台编制的程序称为虚拟仪器程序,简称为VI。LabVIEW(Laboratory Virtual instrument Engineering Workbench)是一种图形化的编程语言,它广泛地被工业界、学术界和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。LabVIEW集成了与满足GPIB、VXI、RS-232和RS-485协议的硬件及数据采集卡通讯的全部功能。它还内置了便于应用TCP/IP、ActiveX等软件标准的库函数。这是一个功能强大且灵活的软件。利用它可以方便地建立自己的虚拟仪器,其图形化的界面使得编程及使用过程都生动有趣。 图形化的程序语言,又称为“G”语言。使用这种语言编程时,基本上不写程序代码,取而代之的是流程图或流程图。它尽可能利用了技术人员、科学家、工程师所熟悉的术语、图标和概念,因此,LabVIEW是一个面向最终用户的工具。它可以增强你构建自己的科学和工程系统的能力,提供了实现仪器编程和数据采集系统的便捷途径。使用它进行原理研究、设计、测试并实现仪器系统时,可以大大提高工作效率。 利用LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位编译器。像许多重要的软件一样,LabVIEW提供了Windows、UNIX、Linux、Macintosh的多种版本。 所有的LabVIEW应用程序,即虚拟仪器(VI),它包括前面板(front panel)、程序框图(block diagram)以及图标/连结器(icon/connector)三部分。 控制对象(输入) 显示对象 (输出) 图1随机信号发生器前面板 前面板是图形用户界面,也就是VI的虚拟仪器面板,这一界面上有用户输入和显示输出两类对象,具体表现有开关、旋钮、图形以及其他控制(control)和显示对象(indicator)。图1所示是一个随机信号发生和显示的简单VI是它的前面板,上面有一个显示对象,以曲线的方式显示了所产生的一系列随机数。还有一个控制对象——开关,可以启动和停止工作。显然,并非简单地画两个控件就可以运行,在前面板后还有一个与之配套的程序框图。 程序框图提供VI的图形化源程序。在程序框图中对VI编程,以控制和操纵定义在前面板上的输入和输出功能。 测控技术与仪器教研室 /97 LabVIEW实践教程 程序框图中包括前面板上的控件的连线端子,还有一些前面板上没有,但编程必须有的东西,例如函数、结构和连线等。图2是与图1对应的程序框图。我们可以看到程序框图中包括了前面板上的开关和随机数显示器的连线端子,还有一个随机数发生器的函数及程序的循环结构。随机数发生器通过连线将产生的随机信号送到显示控件,为了使它持续工作下去,设置了一个While Loop循环,由开关控制这一循环的结束。 函数:随机数发生器 结构:循环 与前面板控件对应的连线端子 与前面板控件对应的连线端子 图2随机信号发生器程序框图 如果将VI与标准仪器相比较,那么前面板上的东西就是仪器面板上的东西,而程序框图上的东西相当于仪器箱内的东西。在许多情况下,使用VI可以仿真标准仪器,不仅在屏幕上出现一个惟妙惟肖的标准仪器面板,而且其功能也与标准仪器相差无几。 图标/连接器 VI具有层次化和结构化的特征。一个VI可以作为子程序,这里称为子VI(subVI), 被其他VI调用。图标与连接器在这里相当于图形化的参数,详细情况稍后介绍。 第二节 LabVIEW8.2开发环境 启动LabVIEW8.2程序初始化界面如下图所示: 测控技术与仪器教研室 /97 LabVIEW实践教程 点击新建VI,即可打开一个新的Labview程序 前面板: 测控技术与仪器教研室 /97 LabVIEW实践教程 ①:工具条 ②:标签 ③:数值控件 ④:标尺 ⑤:图标 ⑥:旋钮 ⑦:图例 ⑧:XY图 前面板工具条: :运行按钮 :连续运行按钮 :中断运行按钮。当编码出错使VI不能编译或运行时,中断运行按钮将替换运行按钮 :异常终止执行按钮 :暂停/继续按钮 :对齐对象按钮。用于将变量对象设置成较好的对齐方式 :分布对象按钮。用于对两个及其以上的对象设置最佳分布方式 :调整对象大小按钮。用于将若干个前面板对象调整到同一大小 程序框图 测控技术与仪器教研室 /97 LabVIEW实践教程 ①:数值输入控件 ②:旋钮控件 ③:数值常量 ④:乘 ⑤:For循环结构 ⑥:数据连线 ⑦:捆绑函数 ⑧:XY图控件 ⑨:子VI程序 框图工具条: :加亮执行按钮。当程序执行时,在框图代码上能够看都数据流,这对于调试和校验程序的正确运行是非常有用的。在加亮执行模式下,按钮转变成一个点亮的灯泡: :保存连线值按钮。 :单步进入按钮。允许进入节点,一旦进入节点,就可在节点内部单步执行。 :单步跳过按钮。单步跳过节点,但不执行时不进入节点内部但有效地执行节点。 :单步跳出按钮。允许跳出节点,通过跳出节点可完成该节点的单步执行并跳转到下一个节点。 :文本设置按钮。 :层叠顺序。 下拉菜单: 由于Labview8.2采用了中文的界面,每个下拉菜单的功能根据字面意思就很容易理解。 选项板 l 工具选项板: 测控技术与仪器教研室 /97 LabVIEW实践教程 上图所示便是工具选项板,各按钮的功能如下: :自动选择工具 :操作工具 :定位/调整大小/选择工具 :编辑文本工具 :连线工具 :对象快捷菜单工具 :滚动窗口 :设置/清除断点工具 :探针工具 :颜色复制工具 :着色工具 l 控件选项板: 和下拉菜单一样,Labview8.2采用了中文的界面,各个控件的功能一目了然,某些常用的控件的功能我们会在下面的章节中做详细的介绍。 测控技术与仪器教研室 /97 LabVIEW实践教程 l 功能选项板 和下拉菜单一样,Labview8.2采用了中文的界面,各个控件的功能一目了然,某些常用的控件的功能我们会在下面的章节中做详细的介绍 测控技术与仪器教研室 /97 LabVIEW实践教程 第三节 LabVIEW的操作模板 LabVIEW具有多个图形化的操作模板,用于创建和运行程序。这些操作模板可以随意在屏幕上移动,并可以放置在屏幕的任意位置。操纵模板共有三类,为工具(Tools)模板、控制(Controls)模板和功能(Functions)模板。 工具模板(Tools Palette) 工具模板为编程者提供了各种用于创建、修改和调试VI程序的工具。如果该模板没有出现,则可以在Windows菜单下选择Show Tools Palette命令以显示该模板。当从模板内选择了任一种工具后,鼠标箭头就会变成该工具相应的形状。当从Windows菜单下选择了Show Help Window功能后,把工具模板内选定的任一种工具光标放在框图程序的子程序(Sub VI)或图标上,就会显示相应的帮助信息。工具图标有如下几种: 操作工具:使用该工具来操作前面板的控制和显示。使用它向数字或字符串控制中键入值时,工具会变成标签工具的形状。 选择工具:用于选择、移动或改变对象的大小。当它用于改变对象的连框大小时,会变成相应形状。 标签工具:用于输入标签文本或者创建自由标签。当创建自由标签时它会变成相应形状。 连线工具:用于在框图程序上连接对象。如果联机帮助的窗口被打开时,把该工具放在任一条连线上,就会显示相应的数据类型。 对象弹出菜单工具:用左鼠标键可以弹出对象的弹出式菜单。 漫游工具:使用该工具就可以不需要使用滚动条而在窗口中漫游。 断点工具:使用该工具在VI的框图对象上设置断点。 探针工具:可以在框图程序内的数据流线上设置探针。程序调试员可以通过控针窗口来观察该数据流线上的数据变化状况。 颜色提取工具:使用该工具来提取颜色用于编辑其他的对象。 颜色工具:用来给对象定义颜色。它也显示出对象的前景色和背景色。 与上述工具模板不同,控制和功能模板只显示顶层子模板的图标。在这些顶层子模板中包含许多不同的控制或功能子模板。通过这些控制或功能子模板可以找到创建程序所需的面板对象和框图对象。用鼠标点击顶层子模板图标就可以展开对应的控制或功能子模板,只需按下控制或功能子模板左上角的大头针就可以把对这个子模板变成浮动板留在屏幕上。 测控技术与仪器教研室 /97 LabVIEW实践教程 控制模板(Controls Palette) 用控制模板可以给前面板添加输入控制和输出显示。每个图标代表一个子模板。如果控制模板不显示,可以用Windows菜单的Show Controls Palette功能打开它,也可以在前面板的空白处,点击鼠标右键,以弹出控制模板。 注:只有当打开前面板窗口时才能调用控制模板。 控制模板如左图所示,它包括如图所示的几个子模板。 数值子模板:包含数值的控制和显示。 布尔值子模块:逻辑数值的控制和显示。 字符串子模板:字符串和表格的控制和显示。 列表和环(Ring)子模板:菜单环和列表栏的控制和显示。 数组和群子模板:复合型数据类型的控制和显示。 图形子模板:显示数据结果的趋势图和曲线图。 路径和参考名(Refnum)子模板:文件路径和各种标识的控制和显示。 控件容器库子模板:用于操作OLE、ActiveX等功能。 对话框子模板:用于输入对话框的显示控制。 修饰子模板:用于给前面板进行装饰的各种图形对象。 用户自定义的控制和显示。 调用存储在文件中的控制和显示的接口。 测控技术与仪器教研室 /97 LabVIEW实践教程 功能模板(Functions Palette) 功能模板是创建程序框图的工具。该模板上的每一个顶层图标都表示一个子模板。若功能模板不出现,则可以用窗口菜单下的显示程序框图功能打开它,也可以在程序框图窗口的空白处点击鼠标右键以弹出功能模板。 注:只有打开了程序框图窗口,才能出现功能模板。 功能模板如下图所示。 结构子模板:包括程序控制结构命令,例如循环控制等,以及全局变量和局部变量。 数值运算子模板:包括各种常用的数值运算符,如+、-等;以及各种常见的数值运算式,如+1运算;还包括数制转换、三角函数、对数、复数等运算,以及各种数值常数。 布尔逻辑子模板:包括各种逻辑运算符以及布尔常数。 字符串运算子模板:包含各种字符串操作函数、数值与字符串之间的转换函数,以及字符(串)常数等。 数组子模板:包括数组运算函数、数组转换函数,以及常数数组等。 群子模板。包括群的处理函数,以及群常数等。这里的群相当于C语言中的结构。 比较子模板:包括各种比较运算函数,如大于、小于、等于。 时间和对话框子模板:包括对话框窗口、时间和出错处理函数等。 文件输入/输出子模板:包括处理文件输入/输出的程序和函数。 仪器控制子模板:包括GPIB(488、488.2)、串行、VXI仪器控制的程序和函数,以及VISA的操作功能函数。 测控技术与仪器教研室 /97 LabVIEW实践教程 仪器驱动程序库:用于装入各种仪器驱动程序。 数据采集子模板:包括数据采集硬件的驱动程序,以及信号调理所需的各种功能模块。 信号处理子模板:包括信号发生、时域及频域分析功能模块。 数学模型子模块:包括统计、曲线拟合、公式框节点等功能模块,以及数值微分、积分等数值计算工具模块。 图形与声音子模块:包括3D、OpenGL、声音播放等功能模块。 通讯子模板:包括TCP、DDE、ActiveX和OLE等功能的处理模块。 应用程序控制子模块:包括动态调用VI、标准可执行程序的功能函数。 底层接口子模块:包括调用动态连接库和CIN节点等功能的处理模块。 文档生成子模板。 示教课程子模板:包括LabVIEW示教程序。 用户自定义的子VI模板。 “选择…VI子程序”子模板:包括一个对话框,可以选择一个VI程序作为子程序(SUB VI)插入当前程序中。 第二讲 创建VI程序 请记住,VI程序具有三个要素:前面板、程序框图和图标/连接器。 一、前面板 使用输入控制和输出显示来构成前面板。控制是用户输入数据到程序的接口,而显示是输出程序产生的数据接口。控制和显示有许多种类,可以从控制模板的各个子模板中选取。 测控技术与仪器教研室 /97 LabVIEW实践教程 位于前面板控件选板上的输入控件和显示控件可用于创建前面板。控件的种类有:数值控件(如滑动杆和旋钮)、图形、图表、布尔控件(如按钮和开关)、字符串、路径、数组、簇、列表框、树形控件、表格、下拉列表控件、枚举控件和容器控件等等。 控件样式:前面板控件有新式、经典和系统三种样式。 1.1 数值显示框、滑动杆、滚动条、旋钮 位于数值和经典数值选板上的数值对象可用于创建滑动杆、滚动条、旋钮、转盘和数值显示框。该选板上还有颜色盒和颜色梯度,用于设置颜色值;以及时间标识,用于设置时间和日期值。数值对象用于输入和显示数值。 对于数值对象,可设置表示法、数据范围和格式与精度。数值对象只接收特定的数值字符。 1、数值型控件 数值控件是输入和显示数值数据的最简单方式。这些前面板对象可在水平方向上调整大小,以显示更多位数。使用下列方法改变数值控件的值: · 用操作工具或标签工具单击数字显示框,然后通过键盘输入数字。 · 用操作工具单击数值控件的递增或递减箭头。 · 使用操作工具或标签工具将光标放置于需改变的数字右边,然后在键盘上按向上或向下箭头键。 两种最常用的前面板对象是数字控制和数字显示。若想要在数字控制中输入或修改数值,你只需要用操作工具(见工具模板)点击控制部件和增减按钮,或者用操作工具或标签工具双击数值栏进行输入数值修改。 从控件模板中找到数值型控件子模板(控件→数值),用鼠标单击模板中相应的控件放置在前面板上,这时控件的标签处于编辑状态,可以修改标签的名字,同时在后面板上已经自动放置了和前面板上相对应的图标当前面板上放置了很多对象时,可以通过双击该对象找到和它对应的在后面板上的图标,或者在控件上单击右键,选择“查找接线端”。 2、滑动杆控件 滑动杆控件是带有刻度的数值对象。滑动杆控件包括垂直和水平滑动杆、液罐和温度计。可使用下列方法改变滑动杆控件的值: · 使用操作工具单击或拖曳滑块至新的位置。 · 与数值控件中的操作类似,在数字显示框中输入新数据。 测控技术与仪器教研室 /97 LabVIEW实践教程 3、滚动条控件 与滑动杆控件相似,滚动条控件是用于滚动数据的数值对象。滚动条控件有水平和垂直滚动条两种。使用操作工具单击或拖曳滑块至一个新的位置,单击递增和递减箭头,或单击滑块和箭头之间的空间都可以改变滚动条的值。 4、旋转型控件 旋转型控件包括旋钮、转盘、量表和仪表。旋转型对象的操作与滑动杆控件相似,都是带有刻度的数值对象。可使用下列方法改变旋转型控件的值: · 用操作工具单击或拖曳指针至一个新的位置。 · 与数值控件中的操作类似,在数字显示框中输入新数据。 图1 数值型控件前面板 1.2图形型控件 在Labview中图形控件主要用于图形对象的显示,这些控件可以用来显示曲线、曲面以及波形等对外。Labview中提供了丰富的图形控件,如波形表、波形图、XY图、Express XY图、密度图、强度图、三维曲面图等等。图形控件的操作方式和数值控件相似,从控件模板中选取相应控件放置在前面板上适当的位置即可。这时在后面板上已经出现了其对应的图标,将要显示的、产生相应图形的数据按照一定的格式和图标相连接就可以显示图形了。 测控技术与仪器教研室 /97 LabVIEW实践教程 图2 图形型控件前面板 1.3 Express VIs Express Vis将一些常用的功能封装、集成,使得用户使用起来非常方便。如Expressge表格、Express XY图等等。 1.4对象的属性及操作 放置于前面板上的每一个控件都有很多属性,其中一些属性与控件的显示方式及显示效果有关,可以通过在控件上单击鼠标右键更改其属性。不同的控件有一些共同的属性,每种控件根据其类型与功能也有其特有的属性, 这些都要在使用中慢慢地熟悉。 前面板上有以下几种常见的属性: 标签:标识了对象的类型,是前面板和程序框图对象的标识。 标题:前面板对象也可以有标题,默认为对象的标签。标题可代替标签为VI添加中文描述,而且不影响VI。标题与标签不同之处在于标题不会影响对象的名称,还可作为进一步描述对象的标签。标题仅在前面板上出现。 二、程序框图 程序框图是由节点、端点、图框和连线四种元素构成的。 测控技术与仪器教研室 /97 LabVIEW实践教程 图3 数值型控件程序框图 图2 图形型控件程序框图 节点类似于文本语言程序的语句、函数或者子程序。LabVIEW有二种节点类型----函数节点和子VI节点。两者的区别在于:函数节点是LabVIEW以编译好了的机器代码供用户使用的,而子VI节点是以图形语言形式提供给用户的。用户可以访问和修改任一子VI节点的代码,但无法对函数节点进行修改。上面的框图程序所示的VI程序有两个功能函数节点,一个函数使两个数值相加,另一个函数使两数相减。 测控技术与仪器教研室 /97 LabVIEW实践教程 端点是只有一路输入/输出,且方向固定的节点。LabVIEW有三类端点----前面板对象端点、全局与局部变量端点和常量端点。对象端点是数据在框图程序部分和前面板之间传输的接口。一般来说,一个VI的前面板上的对象(控制或显示)都在框图中有一个对象端点与之一一对应。当在前面板创建或删除面板对象时,可以自动创建或删除相应的对象端点。控制对象对应的端点在框图中是用粗框框住的,如例子中的A和B端点。它们只能在VI程序框图中作为数据流源点。显示对象对应的端点在框图中是用细框框住的。如例子中的A+B和A-B端点。它们只能在VI程序框图中作为数据流终点。常量端点永远只能在VI程序框图中作为数据流源点。 图框是LabVIEW实现程序结构控制命令的图形表示。如循环控制、条件分支控制和顺序控制等,编程人员可以使用它们控制VI程序的执行方式。代码接口节点(CIN)是框图程序与用户提供的C语言文本程序的接口。 连线是端口间的数据通道。它们类似于普通程序中的变量。数据是单向流动的,从源端口向一个或多个目的端口流动。不同的线型代表不同的数据类型。在彩显上,每种数据类型还以不同的颜色予以强调。 下面是一些常用数据类型所对应的线型和颜色: 整 形 数兰色 浮点数 橙色 逻辑量 绿色 字符串 粉色 文件路径 青色 当需要连接两个端点时,在第一个端点上点击连线工具(从工具模板栏调用),然后移动到另一个端点,再点击第二个端点。端点的先后次序不影响数据流动的方向。 快速提示: 接线头是为了帮助正确连接端口的连线。当把连线工具放到端口上,接线头就会弹出。接线头还有一个黄色小标识框,显示该端口的名字。 当把连线工具放在端点上时,该端点区域将会闪烁,表示连线将会接通该端点。当把连线工具从一个端口接到另一个端口时,不需要按住鼠标键。当需要连线转弯时,点击一次鼠标键,即可以正交垂直方向地弯曲连线,按空格键可以改变转角的方向。 创建第一个VI: 本节将创建的第一个VI来完成下列功能: 测控技术与仪器教研室 /97 LabVIEW实践教程 1. 将两个输入数字相加并显示结果 2. 将同样的两个输入数字相乘并显示结果 3. 比较两个输入数字,如果数字相等,则LED指示灯变亮 步骤: 1. 从“文件”菜单中选择“新建”VI打开新的前面板 2. 创建数字控件和指示器。使用两个前面板控件输入数字,使用两个指示器输入数字加和乘的结果。 a. 从控件选项板的数值子选项板中选择数值输入控件 b. 单击数值输入控件,然后拖拽控件到所希望的位置,然后单击鼠标将控件放下,如图: c.在标签框(在控件上方)内键如字母,按前面板工具条上的Enter按钮。如果在继续编程操作(诸如将其他控件放置在前面板上)之前不键入标签内容,标签框将保留默认标签内容“数值”。如果控件或指示器没有标签,可用右键单击控件,在控件上弹出快捷菜单,从显示项菜单中选择标签,标签框就会出现,然后可使用标签工具编辑文本。 d.重复以上过程创建第二个数字控件和第二个数字指示器。可选择按任意方式排列控件和指示器,不过排列得整齐而有规律会更好些。 测控技术与仪器教研室 /97 LabVIEW实践教程 3.创建布尔LED。如果两个输入数字是相同的,那么指示灯打开;如果不是,则保持关闭状态。 a. 从控件选项板的布尔子选项板中选择圆形知识灯。将该指示器放置到前面版上并拖拽到所希望的位置,然后单击鼠标按钮。 b. 在标签框内键入“Round LED”,键入完毕,单击标签框外边的任何地方,或单击Enter按钮。如图: 4. 从窗口下拉菜单中选择显示程序框图,切换到程序框图。 5. 先在在框图上放置“加”和“乘”函数。可从框图选项板,编程选项板的数值子选项板中选择“加”函数。按照同样的步骤,将“乘”函数放置到框图上并显示标签。 6. 从框图选项板,编程选项板的子选项板中选择“等于?”函数,并放到框图上,如果他们相等,返回“真”,如果不相等,则返回“假”。 测控技术与仪器教研室 /97 LabVIEW实践教程 7. 连线,在工具选项板中选择连线工具,当把鼠标移到各个控件的上方时,能够参与连线的节点便会自动闪烁,提示用户,此处可以连线。连线完成后如图: 8. 连线完成后,单击运行按钮,便可在前面板上看到运行的结果。 测控技术与仪器教研室 /97 LabVIEW实践教程 三、子VI 子VI是供其他VI使用的VI,与子程序类似。子VI是层次化和模块化VI的关键组件,它能使VI易于调试和维护。使用子VI是一种有效的编程技术,因为它允许在不同的场合重复使用相同的代码。G编程语言的分层特性就是在一个子VI中能够调用到另一个子VI。下面可用一个表格表明子VI的作用: 程序代码 调用子程序 function average (in1,in2,out) { out=(in1+in2)/2.0; } main { average (point1,point2,pointavg); } 子VI框图 调用子VI框图 编辑图标和连接器: 1.图标:每个VI都有一个默认的图标,显示在前面板和框图窗口的右上角。默认图标是一个Labview徽标和一个数字构成的图片,该数字指出自从Labview启动后已打开新VI的数量。使用“编辑图标”可以定制该图标。如图:选择编辑图标后,便可打开图标编辑器。 编辑器如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 各个控件的作用如图: 一个像素一个像素地绘制和擦除 绘制直线。使用限制绘制水平,垂直和对角线 从图标象素选取前景色 用前景色填充封闭区域 使用前景色绘制矩形框。双击该工具,可以用前景色给图标加边框 使用前景色绘制框并用背景色填充。双击该工具,可以用前景色给图标加边框并用背景色填充。 选择图标区域,用于移动,复制,删除,或执行其他操作。双击次此工具并在键盘上按键将立刻删除整个图标。 在图标中输入文本。双击该工具可以选择不同字体。在图标中通常采用小字体。 显示当前前景色和背景色。分别单击前景和背景将进入彩色选项板,从中可以选择新的颜色。 编辑好图标以后,就可以看到自己编辑的图标,如图: 2.连接器:连接器是与VI控件和指示器对应的一组端子。连接器是为了VI建立的输入和输出口,这样VI就可以作为子VI使用。连接器从输入端子接受数据,并在VI执行完成是将数据传送到输出端子。在前面板上,每一个端子都与一个具体的控件或指示器相对应。连接器端子的作用与函数调用时子程序参数列表中的参数类似。 注意:只能从前面板查看和编辑连接器窗格。 在右上角图标上单击右键,选择显示连线板,即可看到连接器。默认情况下,Labview根据前面板上控件和指示器的数目显示端子模板。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 也可在模式选项中选择更多的连接器类型,如图: 注意:子VI最多可用的端子数是28。 创建子VI 方法一:把前面板和程序框图编辑妥当以后,按照上面的步骤编辑子VI的图标(编辑图标可跳过),然后打开连接器,给控件和指示器指定端子,在工具选项板上选择连线工具,然后把控件和指示器上的对应位置相连接。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 连接正确后,在指示器上的相应位置颜色就会发生改变,表明该处已连接上 全部正确连接后如图: 保存,更改名称为“求平均值”,退出,即可在其他程序中调用这个子VI了。 打开一个新的VI,在前面板上放置两个数值输入控件和一个数值显示控件,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 打开程序框图,选择“选择VI” 在弹出的对话框中选择“求平均值”,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 放置到程序框图中,如图: 然后连线,运行,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 方法二: Labview可以在程序框图中直接将选定的部分创建为子VI,如图: 这是一个将摄氏温度转化为华氏温度的程序,中间的运算可整个设置为一个子VI,步骤如下: 1. 把要设置为子VI的部分进行选择,如图: 2. 点击编辑,然后点击“创建子VI”,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 创建完成后,如图: 双击子VI图标,便可对他进行编辑,如图: 建议:建议将所创建的子VI保存在目录下而不是保存在库文件中。尽管在称为VI库的单个文件中能够保存多个VI,但我们不希望这样做。将VI保存为单个文件是最有效的存储方式。因为这样在复制,重新命名和删除文件时比使用VI库时要容易些。 与其他目录一样,VI库文件可以装入,保存和打开,但不是分层的。不能在VI库内创建另一个VI库,也不能在VI库内创建新目录。VI库文件创建后,当其出现在文件对话框中时,其图标将与VI文件图标略有不同。 第三讲 程序调试技术 一、 运行VI 运行VI将执行为该VI所设计的操作。工具栏上的运行按钮为白色实心箭头时表示VI可以运行。如下图所示: 测控技术与仪器教研室 /97 LabVIEW实践教程 白色实心箭头也表示为该VI创建连线板后可将其作为子VI使用。 单击运行或连续运行按钮或程序框图工具栏上的单步执行按钮,VI便开始运行。VI运行时,运行按钮变为黑色箭头,表明该VI正在运行。如下图所示。 VI在运行时无法对其进行编辑。 单击运行按钮,VI只运行一次,并在完成其数据流后停止。单击连续运行按钮,VI将连续运行直到手动停止VI的运行为止。如下图所示。 单击单步执行按钮,VI将以步进方式运行。 中止运行按钮令VI在当前循环完成前立即停止运行。 二、找出语法错误 如果一个VI程序存在语法错误,则在面板工具条上的运行按钮将会变成一个折断的箭头,表示VI程序不能被执行。这时这个按钮被称作错误列表。 创建或编辑VI时,如VI存在错误,运行按钮显示为断开。如下图所示。 如已完成程序框图的连线而该按钮仍显示为断开,则表示VI是断开的且不能运行。 查找VI断开的原因 警告并不妨碍VI运行。警告仅帮助用户避免VI中的潜在问题。而错误会使VI断开。VI在运行前须排除任何错误。 单击断开的运行按钮或选择查看>>错误列表可查找VI断开的原因。错误列表列出了所有的错误。错误项列出了内存中所有含有错误的项的名称,如VI和项目库。如两个或多个项具有相同的名称,则错误项部分会显示每一项的特定应用程序实例。错误和警告列出了在错误项中选中的VI错误和警告信息。详细信息描述了错误信息,有时还会建议如何纠正错误。单击帮助按钮,可显示LabVIEW帮助中对错误的详细描述和纠正错误步骤的相关主题。 单击显示错误按钮或双击错误描述,可高亮显示程序框图或前面板中包含错误的区域。 如VI中含有警告且错误列表窗口中的显示警告复选框被选中,工具栏将包含警告按钮。如下图所示。 测控技术与仪器教研室 /97 LabVIEW实践教程 选择工具>>选项,然后从类别列表中选择调试,再选中默认在错误列表对话框中显示警告复选框,可将LabVIEW配置成总是在错误列表窗口中显示警告。在错误列表窗口打开时也可进行上述修改,并可立即查看修改结果。 VI断开的常见原因 下表列出了编辑VI时导致VI断开的常见原因: · 数据类型不匹配或存在未连接的接线端,会导致程序框图含有断线。 · 必需连接的程序框图接线端没有连线。 · 子VI处于断开状态或在程序框图上放置子VI图标后编辑了该子VI的连线板。 三、设置程序高亮执行 在LabVIEW的工具条上有一个画着灯泡的按钮,这个按钮叫做“高亮执行”按钮。点击这个按钮使该按钮图标变成高亮形式,再点击运行按钮,VI程序就以较慢的速度运行,没有被执行的代码灰色显示,执行后的代码高亮显示,并显示数据流线上的数据值。这样,你就可以在根据数据的流动状态跟踪程序的执行。 单击高亮显示执行过程按钮可查看程序框图的动态执行过程。如下图所示。 高亮显示执行过程通过沿连线移动的圆点显示数据在程序框图上从一个节点移动到另一个节点的过程。使用高亮显示执行的同时,结合单步执行,可查看VI中的数据从一个节点移动到另一个节点的全过程。 注:高亮显示执行过程会导致VI的运行速度大幅降低。 如错误输出簇报告错误,则在错误输出输出端旁将出现错误值,且错误值外围有一个红色边框。如没有错误发生,则错误输出输出端旁将出现确定按钮,其边框为绿色。 四、断点与单步执行 为了查找程序中的逻辑错误,你也许希望程序框图一个节点一个节点地执行。使用断点工具可以在程序的某一地点中止程序执行,用探针或者单步方式查看数据。使用断点工具时,点击你希望设置或者清除断点的地方。断点的显示对于节点或者图框表示为红框,对于连线表示为红点。当VI程序运行到断点被设置处,程序被暂停在将要执行的节点,以闪烁表示。按下单步执行按钮,闪烁的节点被执行,下一个将要执行的节点变为闪烁,指示它将被执行。你也可以点击暂停按钮,这样程序将连续执行直到下一个断点。 测控技术与仪器教研室 /97 LabVIEW实践教程 断点: 断点工具可在程序框图上的VI、节点或连线上放置一个断点,程序运行到该处时暂停执行。如下图所示。 在连线上设置断点后,数据流经该连线后程序将暂停执行。在程序框图上放置一个断点,使程序框图在所有节点执行后暂停执行。 VI暂停于某个断点时,程序框图将出现在最前方,同时一个选取框将高亮显示含有断点的节点或连线。光标移动到断点上时,“断点”工具光标的黑色区域变为白色。 程序执行到一个断点时,VI将暂停执行,同时暂停按钮显示为红色。可采取以下措施: · 用单步执行按钮单步执行程序。 · 在连线上添加探针查看中间数据。 · 改变前面板控件的值。 · 单击暂停按钮可继续运行到下一个断点处或直到VI运行结束。 LabVIEW将断点与VI一起保存,但断点只在VI运行时有效。选择操作>>断点然后单击查找按钮可查看所有断点。 可逐个或在VI层次结构中删除断点。 单步执行 单步执行VI可查看VI运行时程序框图上VI的每个执行步骤。单步执行按钮仅在单步执行模式下影响VI或子VI的运行。如下图所示。 单击程序框图工具栏上的单步步过或单步步入按钮可进入单步执行模式。将鼠标移动到单步步过、单步步入或单步步出按钮上可看到一个提示框,该提示框描述了单击该按钮后的下一步执行情况。可单步执行子VI,也可正常运行子VI。 如单步执行VI同时高亮显示执行过程,则执行符号将出现在当前运行的子VI的图标上。如下图所示。 测控技术与仪器教研室 /97 LabVIEW实践教程 五、探针 你可以用探针工具来查看当框图程序流经某一根连接线时的数据值。从Tools工具模板选择探针工具,再用鼠标左建点击你希望放置探针的连接线。这时显示器上会出现一个探针显示窗口。该窗口总是被显示在前面板窗口或框图窗口的上面。在框图中使用选择工具或连线工具,在连线上点击鼠标右键,在连线的弹出式菜单中选择“探针”命令,同样可以为该连线加上一个探针。 探针工具 探针工具用于检查VI运行时连线上的值。如下图所示。 如果程序框图较复杂且包含一系列每步执行都可能返回错误值的操作,则可使用探针工具。利用探针并结合高亮显示执行过程、单步执行和断点,可确认数据是否有误并找出错误数据。如数据存在,则探针会在单步执行期间或在断点暂停时立即更新。当执行过程由于单步执行或断点而在某一节点处暂停,可用探针探测刚才执行的连线,查看流经该连线的数值。 练习3-1 目的:创建一个VI程序,练习前面板和程序框图中的各种编辑技术。 1.创建:在上一章中我们介绍了最常用的创建方法,就是用鼠标选择,然后放置到框图或前面板中,在这里我们为大家介绍另外一种常用的方法。如图:放置一个随机数函数到程序框图,位于函数—编程-数值-随机数。 然后在上面单击右键,选择创建-显示控件,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 则可看到有一数值控件与其相连,前面版上也出现了一个数值控件。如图: 2.选择对象:在前面板和程序框图中,使用定位工具来选择对象,它也可以用来移动和调整对象的大小,如图: 当对象被选中时,就会出现环绕的虚线轮廓当要选择多个对象时,按住键并同时单击鼠标即可,如图: 或者在空白处单击鼠标,并拖拽光标直到全部希望的对象均出现在矩形框来选择多个对象。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 3.移动对象:选定对象后,用鼠标拖拽,便可移动对象到指定位置。如图: 4.删除和复制对象:显然,选中所要进行操作的控件后,单击主菜单中的编辑,然后选择删除或者复制,粘贴是完全可以实现各项操作的。下面我向大家介绍几种用键盘来实现这些操作的方法。 删除:选中控件后,按下“退格”键或即可 复制:选中控件后,按,然后即可,或者按下,然后拖拽所需要复制的控件到其他地方即可,如图: 5.调整对象大小:当工具选项板上选定定位工具时,把鼠标挪到各个控件的角上时,就会大小调节的句柄,直接拖拽,然后释放,便可改变控件的大小,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 注意:某些控件横向的大小,不能改变纵向的大小,比如数字控件! 6.标签对象:标签分为两种-自由标签和固有标签。固有标签是用户在添加控件时系统自动添加上的,不能删除和复制,只能隐藏。如图,单击右键,把标签一栏取消即可。 自由标签不附加与任何对象,可独立的创建,移动或处理。使用即可实现自由创建和编辑。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 输入完后,在空白处单击鼠标即可。 7.改变字体,字形和文本大小:使用工具条上的文本设置工具,可以方便地更改标签,控件或指示器中显示的任何文本的字体,字形,大小和对齐方式。如图: 选中控件后,更改大小为36 测控技术与仪器教研室 /97 LabVIEW实践教程 具体每一项下拉菜单的功能,大家根据字面的意思即可理解,这里不再赘述。 8.编辑连线:如图: 当连线发生错误时,就会出现断线,在有断线的时候,程序也就不能运行,运行按钮也会发生改变,如图: 此时选中断线,然后按即可删除,或者按清除所有断线。 测控技术与仪器教研室 /97 LabVIEW实践教程 9.对象的对齐,分布和大小调节: 对齐-先选中所需要对齐的控件,然后选择不同的对齐方式即可 对齐后的效果如图: 控件之间的间距也可进行调整,如图,先选中他们,然后然后选择调整间距。 测控技术与仪器教研室 /97 LabVIEW实践教程 排列后的效果如图: 三个控件已呈等垂直间距排列 调试技术 1.发现错误:当编程错误使VI不能编译或运行时,工具条上的运行按钮便会变为不能运行,如图: 单击,便会弹出程序错误列表,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 单击显示错误,便可在程序框图中找到出错的地方,如图: 2.加亮执行:单击加亮执行按钮,可在程序框图中观察到数据流的流动状态,但程序的执行时间会明显增加。如图: 3.单步通过VI:为了调试程序,你可以一个节点一个节点地执行框图,在运行程序的时候,不要点击运行按钮,直接点击单步运行按钮,运行一步后,程序自动暂停下来,等待用户的下一个命令,再执行下一步。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 两个单步按钮均可,只是暂停的位置略有区别。 4.断点与探针:要更为详细的知道程序在运行时的各个参数,可以在各条连线上设置断点,然后用探针查看断电上的数据,然后按继续按钮让程序继续运行。如图: 程序运行到断电处便会自动暂停,然后单击继续,便可继续运行。如图: 快捷键: 测控技术与仪器教研室 /97 LabVIEW实践教程 键盘上的按键组合 功能 Ctrl+S 保存VI Ctrl+R 运行VI Ctrl+E 在前面板和程序框图间切换 Ctrl+H 打开或关闭帮助窗口 Ctrl+B 消除所有无效连线 Ctrl+W 关闭活动的窗口 Ctrl+F 查找对象和VI 练习:编写并调试“数字滤波器”程序 将两个频率分别为1Hz和30Hz,幅值为1V的正弦波叠加,在波形图1中显示,对此叠加波形进行低通滤波,滤波后的信号在波形图2中显示。 第四讲 程序结构---循环结构 4.1 While 循环 While循环是一种结构,它重复执行代码片段直到满足某种条件为止。它可比作传统语言中的Do Loop或Repeat-Until循环。它位于编程→结构→While循环。每个While循环都有一个条件端子和一个重复端子。如图: 重复端子用于记录和输出已执行的循环的次数,条件端子输入的是一个布尔变量:真或假,While循环将一直执行到连接条件端子上的布尔值变成真或假为止,取决于条件端子设置为“真(T)时停止”还是“真(T)时继续”。在条件端子上单击右键即可进行更改。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 该循环有如下特点: l 计数从0开始(i=0)。 l 先执行循环体,而后i+1,如果循环只执行一次,那么循环输出值i=0。 l 循环至少要运行一次。 下面举个简单的例子:利用While循环产生随机数,当产生的随机数大于0.8时,循环停止。 步骤如下: 1. 打开前面板,新建两个数值显示控件,一个为循环次数,一个显示最后产生的那个大于0.8的随机数。如图: 2. 切换到程序框图,放置一个While循环,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 3. 放置随机数函数到While循环内,并连线,如图: 4. 放置比较函数,将循环次数与重复端子连线,如图: 5. 运行,即可在前面板上看到结果,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 在程序框图中,在数值显示控件上单击右键,可更改数值的类型,如图: 各种数值的类型都可以看见,我就不再赘述。 在While循环的边框上单击右键,可添加位移寄存器,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 有关位移寄存器的用法,我们将会在下面讲到,这里暂不做介绍。 注意:While循环的条件端子一定要有连线,否则程序无法运行!如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 4.2 For循环 For循环用于将某段程序执行指定次数。 For循环位于函数→编程→结构→For循环,如图: 从图中可以看到,For循环有两个端子: 计数端子:要执行循环的次数,可用于For循环内部的循环计数 重复端子:已执行循环的次数,可用于For循环内部的重复计数 应用举例:产生10个随机数,并把最后一个显示出来。 步骤如下: 1. 放置一个数值显示控件到前面板,并改名为随机数。 2. 放置For循环到程序框图,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 3.放置随机数函数到程序框图,并连线 4.计数端子上单击右键,选择创建常量,并输入10,如图: 5.运行程序,便可在前面板上看到结果。 6.因为程序的运行的速度非常快,我们无法一个一个地看清所产生的10个随机数,我们可以在程序框图中添加时间延迟控件。它位于函数→编程→定时→时间延迟,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 7. 放置它到程序框图上,选择延迟的时间,即两次循环之间的时间间隔。如图: 8. 将时间设置为1.000,点击确定即可,再运行程序就可从前面板上看到所产生的随机数了。 4.3 移位寄存器 移位寄存器用于For循环或While循环中从一个迭代传输数据到下一个迭代,它由循环垂直边框上一对反向相反的端子组成,在边框上单击右键,选择添加移位寄存器,就可进行添加。如图: 右端子(带向上箭头的矩形)在每完成一次迭代后存储数据,移位寄存器将上次迭代的存储数据在下一次迭代开始时移动到左端子(具有向下箭头的矩形)上。移位寄存器可存储任何数据类型,包括数字,布尔,字符串和数组,但连接到同一个寄存器端子上的数据必须是同一类型。移位寄存器的类型与第一个连接到其端子之一的对象数据类型相同。 测控技术与仪器教研室 /97 LabVIEW实践教程 下面是1+2+3+4+…+100的程序,如图: 说明:进行第一次运算的是0+0,For循环中的重复端子是从0开始计数,移位即寄存器在没有初始化的情况下,默认的数值是0,所以第一次运算的是0+0,第二次运算的是寄存器的0与重复端子的1相加,所以循环要进行101次。而计数端子输出的数据始终是101。 移位寄存器的初始化:移位寄存器的初始化是非常必要的,因为只要用户不退出VI,移位寄存器便可记录上次运算完时的结果,所以上面的程序在第二次执行时输出的结果不是5050,而是10100!添加初始化即可,如图: 下面在举几个复杂一点的例子: 例一:计算一组随机数的最大值和最小值 1. 新建一个VI,在前面板上放置一个波形图标,它位于新式→图形→波形图表,用它来记录产生的随机数。同时在前面板上放置两个数值显示控件“最大值”和“最小值”,用来显示随机数中的最大值和最小值。 2. 在程序框图中,放置一个For循环,设置循环次数为50次。单击边框选择添加两个移位寄存器,分别初始化为0和1。 3. 放置随机数函数和最大最小值函数与程序框图中,其中最大最小值函数位于编程→比较→最大值与最小值。然后连线。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 运行,便可在前面板上看到结果,如图: 例二:计算 1. 在前面板上放置一个数值输入控件“阶次n”和一个数值显示控件“求和结果” 2. 在程序框图上放置两个For循环嵌套结构,外层循环的计数端口与“阶次n”连接,输出是各个数的阶乘所组成的一个数组。它的重复端子加1作为内层循环的循环次数,内层循环利用一个移位寄存器实现阶乘运算,移位寄存器的初始值设为1。 3. 同样在程序框图的右边在放置一个For循环结构,它的计数端子没有任何连接数据,使用的是自动索引功能。这个循环的作用是对由阶乘所组成的一个数组进行索引,对索引出的各个元素进行求和计算,最后将计算结果输出给“求和结果”。 4. 完成连线,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 运行结果如图: 例三:计算自然对数中底数e的近似值。 算法: 步骤: 1. 新建一个VI,打开前面板,添加两个数字显示控件,分别表示”近似值e”和“临界阶次N”。 2. 切换到程序框图,放置一个While循环,将条件端子的条件改为“真时停止”。在它内部再放置一个For循环,计数端子与While循环结构的重复端子加1后连接。右击For循环边框,添加移位寄存器,并初始化为1,For循环结构的功能是计算各个数的阶乘。 3. 计算各个数阶乘的倒数,添加倒数函数,它位于函数→编程→数值→倒数。 4. 添加比较函数,将它的阶乘的倒数与10^-5比较,比较结果连接到While循环结构的条件端子上,如果小于则返回“真”,停止循环,否则返回“假”继续循环。 5. 由于While循环默认的是不能够自动索引功能,而程序中需要累加保存每次计算的阶乘,这就需要在输出通道上选择“启用索引”,实现自动索引,将各个元素累加成为一维数组。 6. 在程序框图右边再添加一个For循环,它的功能是进行自动索引求和,需要主机的是它的移位寄存器被初始化为1,这是由近似算法所决定的。将输出结果送给“近似值e”。 7. 完成连线,并运行程序。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 运行结果,如图: 例四:实现对随机数进行平滑滤波。通过对4个连续的随机数求其平均值来实现。 1.新建一个VI,在前面板上放置两个波形图表,一个为“原始波形”,一个为“滤波后波形”。 2.在程序框图上放置一个While循环,在边框添加一个移位寄存器,然后在左边的寄存器上单击右键,选择“添加元素”,一共添加3个。如图: 3.添加随机数产生函数,并添加符合运算,将连续产生的4个随机数相加,相加的结果除以4。 4.放置循环定时函数,定义循环时间为100ms。 5. 完成连线,在While循环的条件端子处添加输入控件。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 运行结果: 第五讲 程序结构---循环结构 5.1 条件分支结构:Case Case结构含有两个或者更多的子程序(Case),执行哪一个取决于与选择端子或者选择对象的外部接口相连接的某个整数、布尔数、字符串或者标识的值。必须选择一个默认的Case以处理超出范围的数值,或者直接列出所有可能的输入数值。Case结构见下图,各个子程序占有各自的流程框,在其上沿中央有相应的子程序标识:Ture、False或1、2、3…。按钮用来改变当前显示的子程序(各子程序是重叠放在屏幕同一位置上的)。 子程序标识 按钮 条件端子 条件结构是执行条件语句的一种方法。这类似于文本编辑语言中常见的If…Then…Else语句。它位于程序框图中,函数→编程→结构→条件结构。如图所示: 测控技术与仪器教研室 /97 LabVIEW实践教程 条件结构包含有两个或者更多的子框图,每一个子框图包含一段程序代码,由此对应一个程序分支。多个子框图就像一摞卡片重叠在一起,任何时候只有一个是可见的,执行哪一个取决于于选择端子外部接口相连的某个整数,布尔数,字符串或者枚举指,用户也可以直接输入所有可能出现的值。 1. 选择端口的输入值 条件结构选择端口的输入值是由与它相连的输入控件对象决定的,数据类型可以是布尔量,整形,字符串型或者枚举型。条件结构顶部中间是各分支的选择标识,它自动调整为输入的数据类型,可以在工具模板上使用标签工具直接键入单个数值或某个数据范围。数值之间用逗号来分开,例如:“..0,2,4..10”表示选择条件为:≤0,2,4,5,6,7,8,9,10。 对于字符型和枚举型数值在条件标识上会自动加上双引号,当键入的选择器标识值与连接选择端口的数值类型不同时,选择器标识变为红色标识有错误。如图: 设置默认分支的方法是,选择一个分支结构,在快捷菜单中执行“本分支设置为默认分支”,它的作用是当选择端口的值与选择器标识值没有一个匹配时,就执行默认分支。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 2.条件结构的数据通道 条件结构的数据通道就是数据的输入和输出端口。将结构内外的端子相连后,边框上就会出现一个小矩形框,这就是数据通道,用于传输数据。向条件结构的一个分支提供数据时,这个数据对于所有的分支都是有效的,也就是其他分支都可以使用这个输入数据。条件结构的输出通道有些不同,当在一个分支中创建输出通道后,所有分支的同一位置都会出现一个白色小方框,它要求每一个分支都必须为这个通道予以连接,通道变为实心后程序才可以运行。也可以在通道的快捷菜单中选定“未连线时使用默认”为没有连接的分支定义一个默认输出值,这时输出通道变为灰色。如图: 条件结构应用举例 例一: 该例的目的是检查一个数是不是正数,如果是就计算该数的平方根值,如果不是则发出警告。 1. 新建一个VI,在前面板上放置一个数值输入控件和一个数字显示控件。 2. 在程序框图上放置一个条件结构,调整边框为合适大小。 3. 在比较运算子模板中选取“大于等于0?”函数,如果数字大于或者等于0则返回真,否则返回假。它的输出连接条件接口的选择端口。 4. 在数值数字运算子模板中选取“平方根”函数,放置在条件结构的“真”子代码框。 测控技术与仪器教研室 /97 LabVIEW实践教程 5. 选择一个发声函数,放到条件结构的“假”子代码框。它位于函数→编程→图形与声音→蜂鸣声。如图: 6. 在条件结构的假代码框的输出通道上选取创建常量,创建常数-999,表示当数值输入为负数时输出-999,同时蜂鸣器发出警告。 7. 完成连线,如图: 运行结果如图: 例二: 该例的目的是首先要判断液面的高度是否超过零界面,如果超过零界面则执行后续操作(循环判断液面是否超位),否则停止执行程序。 测控技术与仪器教研室 /97 LabVIEW实践教程 因为Labview语言的While循环是先执行,然后再判断条件。而在实际应用中,经常是要求先进行判断条件,只有当条件满足时才执行,否则不执行。可以在While循环中加入条件结构来实现此功能 1. 新建一个VI,在前面板上放置一个数值输入控件,模拟容器“液面高度”同时放置一个“液面报警”指示灯,当液面超过零界面时点亮。 2. 在程序框图上放置一个While循环结构并在它内部放置一个条件结构,调整结构边框位合适的大小。 3. 在比较运算子模板中选取“大于0?”函数,如果数字大于0返回真,否则返回假。它的输出连接条件的选择端口,并且连接到While循环结构的循环条件端子,表示输入数字量大于0则继续循环,并且执行真分支。 4. 在真分支代码框中,放置“大于?”函数,将“液面高度”与上限值“5”进行比较,输出送给“液面报警”指示灯。 5. 完成连线,并运行程序。程序及运行结果如图: 5.2 顺序结构(Sequence Structure) 在代码式的传统编程语言中,默认的情况是,程序语句按照排列顺序执行,但LabVIEW中不同,它是一种图形化的数据流式编程语言。在图5-1左图中,假设有A、B、C、D4个节点,其数据流向如右图所示。按照数据流式语言的约定,任何一个节点只有在所有的输入数据有效时才会执行,所以图中,当且仅当 测控技术与仪器教研室 /97 LabVIEW实践教程 A、B、C3个节点执行完,使得D节点的3个输入数据都到达D节点后,D节点才执行。但是你要注意,这里并没有规定A、B、C3个节点的执行顺序。在LabVIEW中这种情况下,A、B、C的执行顺序是不确定的,如果你需要对它们规定一个确定的顺序,那就需要使用本节介绍的“顺序结构”。 图5-1中的右边是顺序结构的图标,它看上去像是电影胶片。它可以按一定顺序执行多个子程序。首先执行0帧中的程序,然后执行1帧中的程序,逐个执行下去。与Case结构类似,这多帧程序在流程图中占有同一个位置。 图5-1 顺序结构的说明 顺序框图位于函数→编程→结构→平铺式顺序结构,层叠式顺序结构。 顺序结构依次执行程序,它可以包含多个代码子框图,这些代码子框图看起来就像是多帧电影胶片一样,所以把每个子框图称为帧。右击顺序结构的框架,将弹出如图所示的快捷菜单。 其中添加顺序局部变量是为了在各个帧之间传递数据。 顺序结构的一个典型应用就是计算程序运行的时间,将通过这个例子来说明顺序结构的用法。 1. 新建一个VI,在前面板上放置一个数值输入控件“给定数据”和两个数值显示控件“执行次数”,“所需时间”。 2. 在程序框图上放置一个层叠式顺序结构,右击结构边框,在弹出的快捷菜单中执行两次“在后面添加帧”,创建帧1和帧2。 测控技术与仪器教研室 /97 LabVIEW实践教程 3. 选取第0帧,记录程序运行初始时间。 右击顺序结构框图的边框,在弹出的快捷菜单中执行“添加顺序局部变量”,这时在第0帧的下边框出现一个黄色小方框,这就是顺序局部变量,它可以在同一个顺序结构中的各帧之间传递数据。 放置一个时间计数器到顺序结构内,它位于函数→编程→定时→时间计数器。返回毫秒定时器的值,用与计算占用的时间。用连线工具将它与顺序局部变量相连,这时黄色小方框里会出现一个指向顺序结构外部的箭头,数值可用后续帧使用,如图: 4. 选取第1帧,实现等于给定值的匹配运算。程序如图: 5. 选取第2帧,同样放置一个时间计数器函数用于返回当前时间,将它减去顺序局部变量传递过来的第一帧初始时间后就可以得到花费的时间,如图: 运行,结果如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 注意:Labview编程的主要特点是数据流形式,这便于VI大量的按照并行方式运行,优化了程序的计算性能。而顺序结构却趋向于中断数据流编程,禁止程序并行操作,顺序结构还掩盖了部分代码,所以用户在编程时应尽量不用或少用顺序结构。 在实际应用中,经常用人为的数据依从关系来确定程序先后执行的顺序,在前面簇的章节中,我们就提到过Error簇可以控制程序执行的先后顺序,但并不是每一个控件都有Error簇的输入和输出端口,这时还有另一种方法能实现顺序执行的功能。如图: 从第一个While循环结构中的布尔开关上连了一根线到第二个While循环结构的边框上,可以看到,第二个While循环结构中没有一个对象需要这个数据,只是起到顺序执行程序的目的。 公式节点 用户可以在程序框图的两个位置找到公式节点结构,一个位于函数→Express→算术与比较→公式;另一个位于函数→编程→结构→公式节点。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 第一种公式节点的使用比较方便,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 当把第一种公式节点放置到程序框图上时,系统便会自动弹出如上图所示的对话框,它的操作比较简单,当上述对话框右上方的方块显示为绿色时,则表明系统识别输入的函数,当出现非法函数时,则表明系统不识别。如图: 它的使用虽然方便,但消耗的系统资源较多,下面我们将重点介绍第二种公式节点的使用方法。 如图:创建一个公式节点到程序框图,在边框上单击右键 选择添加,然后即可在节点框中输入变量名称,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 公式节点中的函数和操作符与C语言中的基本相符,遇到特殊函数时查表即可。 应用举例: 例一:该例的目的是联系使用条件表达式来执行不同条件时的数据传输。 下面的代码表示:如果X为非负数,Y等于X的平方根;如果X为负数,Y等于-999。 if(x>=0)then y=sqrt(x) else y=-999 end if 对这段代码可以用公式节点来计算,需要注意大小写,如图所示: 运行结果如图: 例二:该例的目的是联系使用公式节点来计算两个输出x1和x2,并在同一图表中显示。 x1=t^3-10*t+1 x2=a*t+b 其中:t共取10个点,范围是从0~9 1. 新建一个VI,在前面板上放置一个波形图,用于同时显示输出的两个波形。同时放置两个数值输入控件,它们分别表示x2函数的斜率和截距。 2. 在程序框图上放置一个For循环,计数端子设为10,计算自变量t分别等于0到9。 3. 在For循环中添加一个公式节点,为它添加三个输入端口,分别与重复端口i,斜率a和截距b相连,并添加两个输入端口,分别表示输出x1和x2。再用文本标签工具再公式节点里添加代码。 测控技术与仪器教研室 /97 LabVIEW实践教程 4. 在数组函数子模板中选取“创建数组“函数将x1和x2合并为一个二维数组,并在波形图中同时显示。 5. 完成连线,如图: 运行结果如图: 5.4全局变量和局部变量 全局变量和局部变量是LabVIEW用来传递数据的工具。LabVIEW编程是一种数据流编程,它是通过连线来传递数据的。但是如果一个程序太复杂的话,有时连线会很困难甚至无法连接,这时就需要用到局部变量,就如同Protel软件画电路原理图一样,给相同的连线添加网络标号,标识它们是相通的。另外用户也许会经常碰到这样一种情况,既能够对程序中一个控件对象写入数据,又要能够读出它的数据,这在数据流编程中是无法实现的,这也需要用到局部变量或者全局变量,全局变量主要是针对不同VI程序之间的通信。 局部变量: 谈到局部变量,其实早在介绍顺序结构时就已经接触过了,当时是添加顺序局部变量来传递程序初始时间,以便计算程序所执行的时间。目的是在不同选择分支中都能够对指示器进行赋值。 测控技术与仪器教研室 /97 LabVIEW实践教程 建立局部变量:建立局部变量的方法有两种:一种是在程序框图中直接添加,如图: 另一种方法是右击控件对象,在弹出的快捷菜单中执行“创建/局部变量”如图: 局部变量的应用 该例的目的在于使用局部变量向它联系的前面板上的电流控件写数据,也可以从电流控件读取数据。程序框图如图所示: 测控技术与仪器教研室 /97 LabVIEW实践教程 程序的目的是检验电流量,如果电流大于5A时,则限定电流量为上限5A,这时电流局部变量时写入状态,可以向它写入数据5A,尽管电流控件是控制器;如果电流小于5A时,则将电流通过一个“电流显示器”来显示,这时就需要将电流局部变量改变为读取状态,方法是在快捷菜单上执行“转化为读取”命令。 全局变量: 全局变量与局部变量不同,它是在不同的程序之间进行通信。LabVIEW的全局变量是一个独立的VI,它是一种特殊的程序,没有程序框图只有前面板,功能是保存一个或多个全局变量,所以也把全局变量程序称为“容器”。 建立全局变量:它的建立和局部变量类似,将全局变量拖拽到程序框图中,在它的快捷菜单中执行“打开前面板”,或双击全局变量图标,打开全局变量程序前面板,然后在前面板中添加所需要的全局变量控件,如图,添加了3个全局变量,并保存VI。 测控技术与仪器教研室 /97 LabVIEW实践教程 建立了全局变量以后就可以在其他程序里面调用它,方法是在程序框图上选中“选择VI...”,如图: 在打开的对话框窗体中为程序选择想要放置的全局变量。如果最先放置的不是想要的全局变量,可以像对局部变量那样操作,在快捷菜单上选取“选择项”子选项,在列出的所有变量对象中进行选择,或者用操作工具来选择。 使用全局变量时必须特别小心,因为它对所有的LabVIEW程序都是通用的,稍有不慎就可能互相干扰,用户必须清楚的知道全局变量的读写位置。用户编辑时既可以向全局变量输入数据,也可以从它读取数据,这一点与局部变量是完全像同的。 全局变量的应用较少,这里就不再举例 使用全局变量和局部变量的注意事项: LabVIEW语言编程是一种数据流,全局变量和局部变量提供了一种违反严格数据流的程序设计方式。大家有必要了解竞态条件的缺陷,当两个或两个以上的事件可以按任何顺序发生时就产生了竞态条件。用户要想知道再多个并行的程序中一个全局变量什么时候被访问是比较困难的。特别是再多线程编程中,对这种共享数据变量的竞态条件问题要求更加苛刻,使用全局变量会带来意想不到的错误。 测控技术与仪器教研室 /97 LabVIEW实践教程 如果用户的应用程序中有全局变量,那么就存在大量的数据复制的危险,因为用户要想在不同的地方对数据进行处理,最终就有许多的数据备份,造成内存的巨大开销和系统资源的浪费,所以建议初学者尽量不要使用全局变量。 如果程序中使用了全局变量或者是局部变量,那么在程序运行之前,必须首先要确定它的初始值是否满足执行要求,如果不满足的话,就要对它们进行初始化。 练习5.2 使用顺序结构 目的:创建一个 VI,计算生成等于某个给定值的随机数所需要的时间。 前面板 1. 打开一个新的前面板,并按照下图所示创建对象。 图2-8 练习2-5的前面板 我们约定数据是0到100范围的整数。当前值用于显示当前产生的随机数。“执行次数”用于显示达到指定值循环执行的次数。匹配时间用来显示达到指定值所用的时间。 流程图 测控技术与仪器教研室 /97 LabVIEW实践教程  练习5.2的程序框图(共3帧) 1. 在程序框图中放置顺序结构(Functions»Structures)。 2. 用鼠标右键单击帧的边框,在快捷菜单中选择Add Frame After,创建一个新帧。重复这个步骤,再创建一个帧。共3桢。 3. 选中第0桢,设置读取初始时间(子)程序 4. 第0帧的下边框上含有一个小方框,其中有一个箭头。这个方框叫做顺序局部变量,可以在同一个顺序结构中的各个帧之间传递数据。用鼠标右键单击第0帧的底部边框,选择Add Sequence Local,创建顺序局部变量。顺序局部变量显示为一个空的方块。当您将某个功能函数与顺序局部变量相连时,方块中的箭头就会自动显示。 5. Tick Count (ms) 函数(Functions»Time & Dialog)——返回启动到现在的时间(以毫秒为单位)。在这里例子里需要使用两个这个函数。另一个在第2帧中。 6. 按图连好线。转入第1帧。该帧是匹配计算,内含一个循环结构。该图中使用的新函数有: Round to Nearest函数(Functions»Numeric)——在该例中,它用于取0到100之间的随机数到距离最近的整数。 Not Equal?函数(Functions» Comparison)——在该例中,它将随机数和前面板中设置的数相比较,如果两者不相等会返回TRUE值,否则返回FALSE。 Increment函数(Functions»Numeric)——在该例中,它将While循环的计数器加1。 7. 按图连好线。转入第2帧 测控技术与仪器教研室 /97 LabVIEW实践教程 在第0帧中,Tick Count (ms)功能函数将以毫秒为单位表示当前时间。这个数值被连到顺序局部变量,这样它就可以被后续的帧使用。在第1帧中,只要函数返回的值与指定值不等,VI就会持续执行While循环。在第2帧中,Tick Count (ms)功能函数以毫秒为单位返回新的时间。VI从中减去原来的时间(由第0帧通过顺序局部变量提供)就可以计算出花费的时间。 8. 返回前面板,在Number to Match控制对象中输入一个数值,执行该VI。 9. 把该VI保存为LabVIEW\Activity 目录下Time to Match.vi。 练习 5.2结束。 第六讲 数组、簇 6.1 概述 数组是同类型元素的集合。一个数组可以是一维或者多维,如果必要,每维最多可有231-1个元素。可以通过数组索引访问其中的每个元素。索引的范围是0到n – 1,其中n是数组中元素的个数。图6-1所显示的是由数值构成的一维数组。注意第一个元素的索引号为0,第二个是1,依此类推。数组的元素可以是数据、字符串等,但所有元素的数据类型必须一致。 图6-1 数组示意图 簇(Cluster)是另一种数据类型,它的元素可以是不同类型的数据。它类似于C语言中的struct。使用簇可以把分布在流程图中各个位置的数据元素组合起来,这样可以减少连线的拥挤程度。减少子VI的连接端子的数量。 6.2 数组 数组是由同一类型数据元素组成的大小可变的集合。同其他语言一样,Labview也提供了数组结构,数组是相同数据类型的集合,这些数据类型可以是数组型,布尔型,字符串型等。当需要频繁地对一批数据进行绘图时,使用数组将获益匪浅。 测控技术与仪器教研室 /97 LabVIEW实践教程 下面将详细介绍数组及数组函数的各种用法。 创建数组 1.从前面板上创建数组:打开前面板,在控件→新式→数组,矩阵与簇→数组,如图: 再在里面放置一个数值输入控件即可,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 如果要显示更多的数组成员,在工具选项板上选择定位工具,在数组的边框停滞,当出现网状拐角后就可以拖动增加或减少显示区域。如图: 如果要增加或减少数组的维度,既可以在索引框的快捷菜单上执行,如图: 增加后如图: 对于二维数组来说,索引框中上一个为行索引,下一个为列索引。 测控技术与仪器教研室 /97 LabVIEW实践教程 2.程序框图上创建数组:在程序框图上创建数组和在前面板上创建数组有点类似,也首先创建一个外壳,然后再放入数值型常量,枚举或环形常量,字符串型常量以及布尔型常量等。刚刚放入常量后,所有的数组成员显示为灰色,可以用操作工具依次给它们赋值,赋值范围以外的数组成员保持灰色不变。如果跳过一些数组成员给后面的成员赋值,则前面的成员自动赋一个系统默认的值。 先在程序框图上放置一个数组常量,位于函数→编程→数组→数组常量,如图: 然后再往里放入一个数值常量,完成后如图: 数组函数 数组函数的面板如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 例一:设计步骤如下: 创建一个For循环,循环次数定为100次 在数学函数中调用Sinc函数,重复端子作为输入,输出用一个波形图表和一个数组显示。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 例二:创建一个二维数组 程序框图如图所示: 现在已经有两组一维数组了,可以使用创建数组函数就可以把他们创建为二维数组,在一个波形图中显示,如图: 可以用鼠标对该函数进行拉伸操作,即可有两个输入端子了。 程序框图如图: 前面板运行结果如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 例三:初始化和分离数组:利用For循环的自动索引功能从一个输入数组中依次抽取各个元素,如果是大于0的数则添加到正数数组,如果是小于0的则添加到负数数组。并分别计算两个数组中各自有多少个元素。 如图所示便是程序框图 下图是在选择结构中为“假”时的情景 测控技术与仪器教研室 /97 LabVIEW实践教程 其中一共用到了三个数组函数,一个初始化函数,一个创建函数,一个数组大小函数,运行时前面板如图: 数组函数就给大家介绍这么多,大多数函数的功能看汉语意思便能明白。 6.3 簇 簇是一种类似数组的数据结构,用于分组数据。簇和数组有着重要的差别,其中一个重要差别是,簇可以包含不同的数据类型,而数组仅可以包含相同的数据类型。例如,一个数组可以包含10个数字指示器,一个簇却可以包含一个数字控件,一个开关和一个字符串控件。 尽管簇和数组的元素都是有序存放的,但访问簇的元素最好是通过释放的方法同时访问其中部分或全部元素,而不是通过索引一次访问一个元素。簇和数组的另一个差别是簇具有固定的大小。 簇通常用于将出现在框图上的有关数据元素分组管理。因为簇在框图中仅用唯一的连线表示,所以对于减少连线混乱和子VI需要的连接器端子个数,使用簇有着积极的效果。可以将簇看做是一捆连线,线缆中每一个连线表示簇的不同元素。在框图上,只有当簇具有相同类型,相同元素数量和相同元素顺序时,才可以将簇的子端连接。多态性应用于簇时,只需要簇具有同样顺序,同样数量的元素。 测控技术与仪器教研室 /97 LabVIEW实践教程 下面来向大家介绍簇的创建簇的创建框位于前面板中的控件→新式→数组,矩阵和簇→簇,如图 然后就可以往簇的框中添加各种类型的控件了,例如现在要建立一个学生的记录信息,包括学生的姓名,学号,性别和年龄.这就需要在簇外壳里依次放入两个字符串输入控件,一个数字控件和一个布尔控件.如图: 与数组的创建类似,簇也可以从程序框图中创建,先在程序框图上放置一个簇外壳,然后就可以在簇外壳里放置各种数据类型常数。如图: 簇内对象的大小是可以调整的,右击簇边界,在弹出的快捷菜单中可以选择各种调节操作,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 选择调整为匹配大小,即可缩小簇的边框,如图为调整后的结果: 簇结构中的元素排列是按照它们放置的先后来排序的,它与簇内元素的位置无关。放入簇内的第一个元素序号为0,第二个元素序号是1,依次向下排列。如果删除了一个元素,序号将重新自动调整。簇的排序很重要,它直接影响着后面将要介绍的“捆绑”以及“接触捆绑”函数的端口顺序,如果你想将一个簇与另一个簇连接,这两个簇的序和类型必须相同。 如果想要改变簇内元素的排列顺序,可以右击簇结构的边框,在弹出的快捷菜单中执行“重新排序簇中控件”,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 这时鼠标会变成一个带“#”号的手柄箭头,黑框指出新设置的排列序号,白框表示原先的排列序号,可以改变标题栏上的“单击设置”内容,然后单击簇元素即可设置新的序号。设置完毕后单击工具栏上的“”按钮确定更改,如果想恢复原先设定值,单击“”取消设置。 簇函数 簇函数的模版如图: 簇函数中最主要的就是构造打包生成簇的“捆绑”函数,还有从簇中解包提取簇中元素的“解除捆绑”函数。它们是根据簇成员的顺序来进行操作的,这也说明了簇内成员顺序排列的重要性。 簇函数举例: 例1. 创建簇,解包簇,再打包簇 测控技术与仪器教研室 /97 LabVIEW实践教程 该例的目的是学习使用簇的两个基本函数,如图:首先放置一个簇外壳到前面板上,将标签内容改为“输入簇” 在簇外壳中依次放入字符串控件“Name”,布尔控件“Sex”,数字输入控件“Pay”以及字符串控件“Address”,通过这些簇元素来组成某一公司内一名员工的工资记录。如图: 切换到程序框图,放置一个“解除捆绑”解包簇函数,函数刚放入时,它的右侧只有2个输出端口,当输入端口与“输入簇”端子相连后,右侧端口会自动增加为簇元素的数目,端口从上向下排列的顺序与簇内元素的放置顺序相对应,并且数据类型也是与簇元素数据类型相对应。如图: 同样放置一个“捆绑”打包簇函数,用定位工具将输入端口的数目增加到4个,依次将它们与解包出来的4个簇元素相连,表示又把它们进行打包生成一个新的簇。在输出端口创建一个簇显示器,把标签改为“输出簇”,如图: 例2. 替换簇成员 测控技术与仪器教研室 /97 LabVIEW实践教程 该例的目的是学习使用“按名称捆绑”函数来替换簇内的某些元素。 1.新建一个VI,在前面板上创建一个簇外壳,依次向簇内添加一个数字输入控件,一个布尔控件,一个字符串输入控件,如图: 2.打开程序框图,选择“按名称捆绑”函数,它的功能是按照名称来替换簇成员的值。在函数刚放入时,它的左侧只有一个输入端口,将函数的“输入簇”端口与创建的簇端子相连之后,左侧端口会显示簇内第一个元素的名称数值,用操作工具单击它可以选择其他的簇成员。如图: 3.在前面板上创建一个输入控件,将标签改为“输入数字”,在程序框图将它与“数值”端口相连,表示将用它来替换簇元素。如图: 4.在“按名称捆绑”函数后面创建输出簇,完成后即可运行程序,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 例3. 插接生成簇数组 该例的目的是学习使用“索引与捆绑簇数组”函数插接簇数组函数来生成一个簇数组。 1.新建一个VI,打开程序框图,放置一个该函数,刚放入时它只有一个输入的端口,用定位工具拖拉它为3个输入端口。 2.在程序框图上放置三个数组外壳,然后分别添加字符串常量,数值常量和布尔常量,建立三个数组,如图: 然后给他们赋如图所示的值,如图: 然后连线,并创建显示控件,如图: 运行,结果如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 说明:该函数从输入的3个数组中依次取值,相同索引值的数据被攒程一个簇,所有的簇构成一个一维数组。插接成的数组的长度与所有输入数组中长度最短的一个相等,多余的数据被丢弃。 4. 建立“数组的数组” 该例看起来好像是不可以实现的,因为在数组的学习中,已经知道数组的成员不可以是数组。这里将学习把一维数组当成一个簇,然后通过建立簇的数组,因为簇数组的每一个成员都是一个簇(即一维数组),从而实现建立“数组的数组”的目的。 1.先新建一个VI,打开程序框图,放置一个“创建簇数组” 函数,该函数的功能是建立簇的数组,簇数组的每个成员都是一个簇。刚放入程序框图时,函数只有一个输入端口,用定位工具拖动它的边框,使它具有3个输入端口。 2.在程序框图上创建3个数值型数组,分别对它们进行赋值,第一个和第三个数组长度设定为5,第二个数组的长度设定为4。在“创建簇数组”函数的输出端口创建一个簇显示器,将簇显示器的标签内容改为“数组的数组”,如图: 3.运行程序,即可在前面板上看到结果,如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 Error簇 Error簇是一类很重要的簇,许多的控件里都有“错误输入”和“错误输出”这两个簇的端口,通常来讲,当一个VI中间出现错误而导致不能运行时,可以在出错的控件的“错误输出”端子创建一个显示控件,则可以让程序继续运行,如图所示,即为Error簇: 而Error簇更重要的应用在于,它可以控制控件执行的先后顺序,也可以通过Error簇来控制循环的终止。如图: 测控技术与仪器教研室 /97 LabVIEW实践教程 当信号的发生出现错误的时候,就可以把循环停止。 练习题 1.创建一个3行4列的数组,(1)求数组的最大与最小值;(2)求出创建数组的大小;(3)将该数组转置;(4)将该二维数组改为一个一维数组。 2.创建一个簇控件,成员为字符型姓名,数值型学号,布尔型注册。从该控件中提取簇成员注册,并显示在前面板上。 测控技术与仪器教研室 /97

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档