求助,用LabVIEW模拟一种仪器外观的外观及基本操作

如何用虚拟数字键盘对多个输入控件进行输入? - LabVIEW论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
如何用虚拟数字键盘对多个输入控件进行输入?
10:04:36  
按方向键在几个输入控件中选择,按数字键输入,按enter键保存输入结果,如何实现?
QQ图片00.png (8.88 KB, 下载次数: 0)
10:03 上传
11:50:28  
看看,布吉岛怎么做
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司求助,怎么判断一个变量增大还是减小,然后分别触发不同事件? - LabVIEW论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
求助,怎么判断一个变量增大还是减小,然后分别触发不同事件?
14:35:59  
比较前后两个值大小吗?
(16.22 KB, 下载次数: 0)
14:35 上传
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司Uninitialized string offset: 2 in /home/wwwroot//read.php on line 81
虚拟仪器LabView入门及进阶教程和实验
提纲 第一章 虚拟仪器及 LabVIEW 入门 1.1 虚拟仪器概述 1.2 LabVIEW 是什么? 1.3 LabVIEW 的运行机制 1.3.1 LabVIEW 应用程序的构成 1.3.2 LabVIEW 的操作模板 1.4 LabVIEW 的初步操作 1.4.1 创建 VI 和调用子 VI 1.4.2 程序调试技术 1.4.3 子 VI 的建立 1.5 图表(Chart)入门 第二章 程序结构 2.1 循环结构 2.1.1 While 循环 2.1.2 移位寄存器 2.1.3 For 循环 2.2 分支结构:Case 2.3 顺序结构和公式节点 2.3.1 顺序结构 2.3.2 公式节点 第三章 数据类型:数组、簇和波形(Waveform) 3.1 数组和簇 3.2 数组的创建及自动索引 3.2.1 创建数组 3.2.2 数组控制对象、常数对象和显示对象 3.2.3 自动索引 3.3 数组功能函数 3.4 什么是多态化(Polymorphism)? 3.5 簇 3.5.1 创建簇控制和显示 3.5.2 使用簇与子 VI 传递数据 3.5.3 用名称捆绑与分解簇 3.5.4 数组和簇的互换 3.6 波形(Waveform)类型 第四章 4.1 4.2 4.3 4.4 4.5 图形显示 概述 Graph 控件 Chart 的独有控件 XY 图形控件(XY Graph) 强度图形控件(Intensity Graph)
4.6 4.7
数字波形图控件(Digital Waveform Graph) 3D 图形显示控件(3D Graph)
第五章 字符串和文件 I/O 5.1 字符串 5.2 文件的输入/输出(I/O) 5.2.1 文件 I/O 功能函数 5.2.2 将数据写入电子表格文件 5.3 数据记录文件(datalog file) 第六章 数据采集 6.1 概述 6.1.1 采样定理与抗混叠滤波器 6.1.2 数据采集系统的构成 6.1.3 模入信号类型与连接方式 6.1.4 信号调理 6.1.5 数据采集问题的复杂程度评估 6.2 缓冲与触发 6.2.1 缓冲(Buffers) 6.2.2 触发(Triggering) 6.3 模拟 I/O(Analog I/O) 6.3.1 基本概念 6.3.2 简单 Analog I/O 6.3.3 中级 Analog I/O 6.4 数字 I/O(Digital I/O) 6.5 采样注意事项 6.5.1 采样频率的选择 6.5.2 6.5.3 多任务环境 6.6 附:PCI-MIO-16E-4 数据采集卡简介 第七章 信号分析与处理 7.1 概述 7.2 信号的产生 7.3 标准频率 7.4 数字信号处理 7.4.1 FFT 变换 7.4.2 窗函数 7.4.3 频谱分析 7.4.4 数字滤波 7.4.5 曲线拟合 第八章 LabVIEW 程序设计技巧 8.1 局部变量和全局变量
8.2 8.3
属性节点 VI 选项设置
第九章 测量专题 9.1 概述 9.1.1 模入信号类型与连接方式 9.1.2 信号调理 9.2 电压测量 9.3 频率测量 9.4 相位测量 9.5 功率测量 9.6 阻抗测量 9.7 示波器 9.8 波形记录与回放 9.9 元件伏安特性的自动测试 9.10 扫频仪 9.11 函数发生器 9.12 实验数据处理 9.13 频域分析 9.14 时域分析 第十章 网络与通讯 第十一章 仪器控制
第一章 虚拟仪器及 LabVIEW 入门 1.1 虚拟仪器概述 虚拟仪器(virtual instrumention)是基于计算机的仪器。计算机和仪器的密切结合是目 前仪器发展的一个重要方向。粗略地说这种结合有两种方式,一种是将计算机装入仪器,其 典型的例子就是所谓智能化的仪器。 随着计算机功能的日益强大以及其体积的日趋缩小, 这 类仪器功能也越来越强大, 目前已经出现含嵌入式系统的仪器。 另一种方式是将仪器装入计 算机。以通用的计算机硬件及操作系统为依托,实现各种仪器功能。虚拟仪器主要是指这种 方式。下面的框图反映了常见的虚拟仪器方案。
被 测 对 象
信 号 调 理
数 据 采 集 卡
数 据 处 理
虚拟仪器面板
虚拟仪器的主要特点有: 尽可能采用了通用的硬件,各种仪器的差异主要是软件。 可充分发挥计算机的能力, 有强大的数据处理功能, 可以创造出功能更强的仪 器。 用户可以根据自己的需要定义和制造各种仪器。 虚拟仪器实际上是一个按照仪器需求组织的数据采集系统。 虚拟仪器的研究中涉及的基 础理论主要有计算机数据采集和数字信号处理。 目前在这一领域内, 使用较为广泛的计算机 语言是美国 NI 公司的 LabVIEW。 虚拟仪器的起源可以追朔到 20 世纪 70 年代, 那时计算机测控系统在国防、 航天等领域 已经有了相当的发展。PC 机出现以后,仪器级的计算机化成为可能,甚至在 Microsoft 公司 的 Windows 诞生之前, 公司已经在 Macintosh 计算机上推出了 LabVIEW2.0 以前的版本。 NI 对虚拟仪器和 LabVIEW 长期、系统、有效的研究开发使得该公司成为业界公认的权威。 普通的 PC 有一些不可避免的弱点。用它构建的虚拟仪器或计算机测试系统性能不可能 太高。目前作为计算机化仪器的一个重要发展方向是制定了 VXI 标准,这是一种插卡式的 仪器。每一种仪器是一个插卡,为了保证仪器的性能,又采用了较多的硬件,但这些卡式仪 器本身都没有面板, 其面板仍然用虚拟的方式在计算机屏幕上出现。 这些卡插入标准的 VXI 机箱,再与计算机相连,就组成了一个测试系统。VXI 仪器价格昂贵,目前又推出了一种较 为便宜的 PXI 标准仪器。 虚拟仪器研究的另一个问题是各种标准仪器的互连及与计算机的连接。 目前使用较多的 是 IEEE 488 或 GPIB 协议。未来的仪器也应当是网络化的。 1.2 LabVIEW 是什么? LabVIEW(Laboratory Virtual instrument Engineering)是一种图形化的编程语言,它广 泛地被工业界、学术界和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。 LabVIEW 集成了与满足 GPIB、VXI、RS-232 和 RS-485 协议的硬件及数据采集卡通讯的全 部功能。它还内置了便于应用 TCP/IP、ActiveX 等软件标准的库函数。这是一个功能强大且 灵活的软件。 利用它可以方便地建立自己的虚拟仪器, 其图形化的界面使得编程及使用过程
都生动有趣。 图形化的程序语言,又称为“G”语言。使用这种语言编程时,基本上不写程序代码, 取而代之的是流程图或流程图。它尽可能利用了技术人员、科学家、工程师所熟悉的术语、 图标和概念,因此,LabVIEW 是一个面向最终用户的工具。它可以增强你构建自己的科学 和工程系统的能力, 提供了实现仪器编程和数据采集系统的便捷途径。 使用它进行原理研究、 设计、测试并实现仪器系统时,可以大大提高工作效率。 利用 LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位编译器。像许 多重要的软件一样,LabVIEW 提供了 Windows、UNIX、Linux、Macintosh 的多种版本。 1.3 LabVIEW 的运行机制 1.3.1 LabVIEW 应用程序的构成 所有的 LabVIEW 应用程序,即虚拟仪器(VI) ,它包括前面板(front panel) 、流程图 (block diagram)以及图标/连结器(icon/connector)三部分。 前面板 前面板是图形用户界面,也就是 VI 的虚拟仪器面板,这一界面上有用户输入和显示输 出两类对象, 具体表现有开关、 旋钮、 图形以及其他控制 (control) 和显示对象 (indicator) 。 图 1 所示是一个随机信号发生和显示的简单 VI 是它的前面板,上面有一个显示对象,以曲 线的方式显示了所产生的一系列随机数。 还有一个控制对象――开关, 可以启动和停止工作。 显然,并非简单地画两个控件就可以运行,在前面板后还有一个与之配套的流程图。
控制对象 (输入)
显示对象 (输出)
随机信号发生器的前
流程图 流程图提供 VI 的图形化源程序。在流程图中对 VI 编程,以控制和操纵定义在前面板 上的输入和输出功能。流程图中包括前面板上的控件的连线端子,还有一些前面板上没有, 但编程必须有的东西,例如函数、结构和连线等。图1-2是与图1-1对应的流程图。我 们可以看到流程图中包括了前面板上的开关和随机数显示器的连线端子, 还有一个随机数发 生器的函数及程序的循环结构。 随机数发生器通过连线将产生的随机信号送到显示控件, 为 了使它持续工作下去,设置了一个 While Loop 循环,由开关控制这一循环的结束。
2 与前面板控件对 应的连线端子
函数:随机数
如果将 VI 与标准仪器相比较,那么前面板上的东西就是仪器面板上的东西,而流程图 上的东西相当于仪器箱内的东西。在许多情况下,使用 VI 可以仿真标准仪器,不仅在屏幕 上出现一个惟妙惟肖的标准仪器面板,而且其功能也与标准仪器相差无几。 图标/连接器 VI 具有层次化和结构化的特征。一个 VI 可以作为子程序,这里称为子 VI(subVI) , 被其他 VI 调用。图标与连接器在这里相当于图形化的参数,详细情况稍后介绍。 1.2.2 LabVIEW 的操作模板
在 LabVIEW 的用户界面上,应特别注意它提供的操作模板,包括工具(Tools)模板、 控制(Controls)模板和函数(Functions)模板。这些模板集中反映了该软件的功能与特征。 下面我们来大致浏览一下。 工具模板(Tools Palette) 该模板提供了各种用于创建、修改和调试 VI 程序的工具。如果该模 板没有出现,则可以在 Windows 菜单下选择 Show Tools Palette 命令以 显示该模板。 当从模板内选择了任一种工具后, 鼠标箭头就会变成该工具 相应的形状。当从 Windows 菜单下选择了 Show Help Window 功能后,把 工具模板内选定的任一种工具光标放在流程图程序的子程序(Sub VI)或 图标上,就会显示相应的帮助信息。 下述工具中注意1和2的区别, 2用于编程时, 1用于运行程序时。 4是一个特有的工具,它并不是一个简单的画线工具,而是一个符合 LabVIEW 语言规定的 对象连接工具。 工具图标有如下几种: 图标 名称 功 能
Operate Value (操作值) Position/Size/Sele ct (选择) Edit Text(编辑 文本) Connect Wire (连 线)
用于操作前面板的控制和显示。使用它向数字或字符 串控制中键入值时,工具会变成标签工具 用于选择、移动或改变对象的大小。当它用于改变对 象的连框大小时,会变成相应形状。 用于输入标签文本或者创建自由标签。当创建自由标 签时它会变成相应形状。 用于在流程图程序上连接对象。如果联机帮助的窗口 被打开时,把该工具放在任一条连线上,就会显示相 应的数据类型。
Object Shortcut 用鼠标左键可以弹出对象的弹出式菜单。 Menu(对象菜单) Scroll Windows (窗口漫游) Set/Clear Breakpoint 断点 ( 设置/清除) Probe Data (数据 探针) Get Color(颜色 提取) Set Color(颜色 设置) 使用该工具就可以不需要使用滚动条而在窗口中漫 游。 使用该工具在 VI 的流程图对象上设置断点。
可在框图程序内的数据流线上设置探针。通过控针窗 口来观察该数据流线上的数据变化状况。 使用该工具来提取颜色用于编辑其他的对象。
用来给对象定义颜色。它也显示出对象的前景色和背 景色。
下面的两个模板是多层的,其中每一个子模板下还包括多个对象。 控制模板(Control Palette) 注意:只有打开前面板时才能调用该模板 该模板用来给前面板设置各种所需的输出显示对象和输入 控制对象。每个图标代表一类子模板。如果控制模板不显示, 可以用 Windows 菜单的 Show Controls Palette 功能打开它, 也可以在前面板的空白处,点击鼠标右键,以弹出控制模板。 控制模板如左图所示,它包括如下所示的一些子模板。子 模板中包括的对象,我们在功能中用文字简要介绍。
子模板名称
1 2 3 4 5 6 7 8 9 10
Numeric 数值量) 数值的控制和显示。包含数字式、指针式显示表盘及各 ( 种输入框。 Boolean 布尔量) 逻辑数值的控制和显示。包含各种布尔开关、按钮以及 ( 指示灯等。 String & Path 字 字符串和路径的控制和显示。 ( 符串和路径) Array & Cluster (数组和簇) List & Table(列 表和表格) 数组和簇的控制和显示。 列表和表格的控制和显示
Graph 图形显示) 显示数据结果的趋势图和曲线图。 ( Ring & Enum(环 与枚举) I/O 输入/输出功 ( 能) Refnum Digilog Controls 数字控 ( 制) Classic Controls 经典控 ( 制) Activex Decorations(装 饰) Select a Controls 控制选 ( 择) User Controls (用户控制) 环与枚举的控制和显示。 输入/输出功能。于操作 OLE、ActiveX 等功能。 参考数 数字控制
经典控制,指以前版本软件的面板图标。
11 12 13 14 15
用于 ActiveX 等功能。 用于给前面板进行装饰的各种图形对象。 调用存储在文件中的控制和显示的接口。
用户自定义的控制和显示。
功能模板(Functions Palette) 注:只有打开了流程图程序窗口,才能出现功能模板。 功能模板是创建流程图程序的工具。该模板上的每一个顶 层 图 标 都 表示 一 个 子 模板 。 若 功 能模 板 不 出 现, 则 可 以用 Windows 菜单下的 Show Functions Palette 功能打开它,也可 以在流程图程序窗口的空白处点击鼠标右键以弹出功能模板。 功能模板如右图所示,其子模块如下所示。 (个别不常用的 子模块未包含)
图标 1 2 3 4 5 6 7 8 9 10 11 12 13
子模板名称 功 能 Structure 结构) 包括程序控制结构命令,例如循环控制等,以及全局 ( 变量和局部变量。 Numeric(数值运 包括各种常用的数值运算,还包括数制转换、三角函 算) 数、对数、复数等运算,以及各种数值常数。 Boolean(布尔运 算) String 字符串运 ( 算) Array(数组) Cluster(簇) Comparison ( 比 较) Time & Dialog 时 ( 间和对话框) File I/O (文件输 入/输出) Data Acquisition(数 据采集) Waveform(波形) Analyze(分析) Instrument I/O (仪器输入/输 出) Motion & Vision (运动与景像) Mathematics(数 学) Communication (通讯) Application Control(应用控 制) Graphics & Sound (图形与声音) Tutorial 示教课 ( 程) Report Generation 文档 ( 生成) Advanced 高级功 ( 能) Select a VI(选 择子 VI) 包括各种逻辑运算符以及布尔常数。 包含各种字符串操作函数、数值与字符串之间的转换 函数,以及字符(串)常数等。 包括数组运算函数、 数组转换函数, 以及常数数组等。 包括簇的处理函数,以及群常数等。这里的群相当于 C 语言中的结构。 包括各种比较运算函数,如大于、小于、等于。 包括对话框窗口、时间和出错处理函数等。 包括处理文件输入/输出的程序和函数。 包括数据采集硬件的驱动,以及信号调理所需的各种 功能模块。 各种波形处理工具 信号发生、时域及频域分析功能模块及数学工具 。 包括 GPIB(488、488.2)、串行、VXI 仪器控制的程序 和函数,以及 VISA 的操作功能函数。
14 15 16 17 18 19 20 21 22
包括统计、曲线拟合、公式框节点等功能模块,以及 数值微分、积分等数值计算工具模块。 包括 TCP、DDE、ActiveX 和 OLE 等功能的处理模块。 包括动态调用 VI、标准可执行程序的功能函数。
包括 3D、OpenGL、声音播放等功能模块。包括调用动 态连接库和 CIN 节点等功能的处理模块。 包括 LabVIEW 示教程序。
User Library (用 户子 VI 库)
1.4 LabVIEW 的初步操作 1.4.1 创建 VI 和调用子 VI 我们通过例子来说明如何创建一个 VI。 练习1-1: 建立一个测量温度和容积的 VI,其中须调用一个仿真测量温度和容积的传感器子 VI。 步骤如下: 1.选择 File?New,打开一个新的前面板窗口。 2.从 Controls?Numeric 中选择 Tank 放到前面板中。 3.在标签文本框中输入“容积” ,然后在前面板中的其他任何位置单击一下。 4.把容器显示对象的显示范围设置为 0.0 到 1000.0。 a. 使用文本编辑工具(Text Edit Tool),双击容器坐 标的 10.0 标度,使它高亮显示。 b. 在坐标中输入 1000,再在前面板中的其他任何地方单 击一下。 这时 0.0 到 1000.0 之间的增量将被自动显示。 5. 在容器旁配数据显示。 将鼠标移到容器上, 点右键, 在出现的快速菜单中选 Visible Iterms?Digital Display 即可。 6.从 Controls?Numeric 中选择一个温度计,将它放到前 面板中。设置其标签为“温度”,显示范围为 0 到 100,同时配数 字显示。可得到如下的前面板图。
练习1-1的前面板图
7. Windows?Show Diagram 打开流程图窗口。从功能模板 中选择对象, 将它们放到流程图上组成下图 (其中的标注是后加 的)。 乘法函数 随机数发 生器 进程监视器
图1-4 练习1-1的流程图 该流程图中新增的对象有两个乘法器、两个数值常数、一个随机数发生器、一个进程监 视器,温度和容积对象是由前棉板的设置自动带出来的。 a. 乘法器和随机数发生器由 Functions?Numeric 中拖出,尽管数值常数也可以这 样得到,但是建议使用 c 中的方法更好些。 b. 进程监视器(Process Monitor)不是一个函数,而是以子 VI 的方式提供的,它 存放在 LabVIEW\Activity 目录中,调用它的方法是在 Functions?Select a VI 下打开 Process Monitor,然后在流程图上点击一下,就可以出现它的图标。 注意:LabVIEW 目录一般在 Program Files\National Instruments\目录下。 8.用连线工具 将各对象按规定连接。a 中的遗留问题创建数值常数对象的另一
种方法是在连线时一起完成。具体方法是:用连线工具在某个功能函数或 VI 的连 线端子上单击鼠标右键,再从弹出的菜单中选择 Create Constant,就可以创建一 个具有正确的数据格式的数值常数对象。 9.选择 File?Save, 把该 VI 保存为 LabVIEW\Activity 目录中的 Temp & Vol.vi。 在前面板中,单击 Run(运行)按钮,运行该 VI。注意电 压和温度的数值都显示在前面板中。 10.选择 File?Close,关闭该 VI 。 练习 1-1 结束 附注与说明: 1. 如果要查看某个功能函数或者 VI 的输入输出, 需要从 Help 菜单中选择 Show Help, 再把光标置于这个功能函数或者 VI 上。例如进程监视器 VI 的 Help 窗口显示如下:
2.显示对象(Indicator) 、控制对象(Control)和数值常数对象 显示对象和控制对象都是前面板上的控件, 前者有输入端子而无输出端子, 后者正好相 反, 它们分别相当于普通编程语言中的输出参数和输入参数。 数值常数对象可以看成是控制 对象的一个特例。 在前面板中创建新的控制对象或显示对象时, LabVIEW 都会在流程图中创建对应的端子。端子的 符号反映该对象的数据类型。例如,DBL 符号表示 对象数据类型是双精度数; 符号表示布尔数; TF I16 符号表示 16 位整型数;ABC 符号表示对象数据类型 是字符串。 一个对象应当是显 示对象还是控制对象必 须弄清楚,否则无法正
确连线。 有时他们的图标是相似或相同的, 可以根据需要明确规 定它是显示对象还是控制对象。 方法是将鼠标移到图标上, 然后 点右键,可出现快速菜单(例见右图)。如果菜单中的第一项是 Chang to Control,说明这是一个显示对象,你可以根据需要,将 其变为控制对象。如果菜单中的第一项是 Chang to Indicator , 说明这是一个控制对象, 你也可以根据需要, 将其变为显示对象。 控制对象和显示对象都不能在流程图中删除, 只能从前面板 上删除。 3.关于连线 连线是程序设计中较为复杂的问题。 流程图上的每一个对象都带有自己的连线端子, 连 线将构成对象之间的数据通道。 因为这不是几何意义上的连线, 因此并非任意两个端子间都 可连线,连线类似于普通程序中的变量。数据单向流动,从源端口向一个或多个目的端口流 动。不同的线型代表不同的数据类型。下面是一些常用数据类型所对应的线型和颜色: 类型 整形数 浮点数 逻辑量 字符串 文件路径 颜色 兰色 橙色 绿色 粉色 青色 标量 一维数组 二维数组
当需要连接两个端点时,在第一个端点上点击连线工具(从工具模板栏调用) ,然后移 动到另一个端点,再点击第二个端点。端点的先后次序不影响数据流动的方向。 当把连线工具放在端点上时,该端点区域将会闪烁,表示连线将会接通该端点。当把 连线工具从一个端口接到另一个端口时,不需要按住鼠标键。当需要连线转弯时,点击一次 鼠标键,即可以正交垂直方向地弯曲连线,按空格键可以改变转角的方向。 接线头是为了帮助正确连接端口的连线。 当把连线工具放到端口上, 接线头就会弹出。 接线头还有一个黄色小标识框,显示该端口的名字。 线型为波折号的连线表示坏线。 出现坏线的原因有很多, 例如: 连接了两个控制对象; 源端子和终点端子的数据类型不匹配(例如一个是数字型,而另一个是布尔型) 。可以通过 使用定位工具点击坏线再按下 &Delete& 来删除它。选择 Edit?Remove Bad Wires 或者按 下&Ctrl-B& 可以一次删除流程图中的所有坏线。当 VI 无法运行,或者显示 Signal has Loose Ends (信号丢失终端)的错误信息时,这是一个快捷的调试方法。 1.4.2 程序调试技术
1.找出语法错误 如果一个 VI 程序存在语法错误, 则在面板工具条上的运行按钮会变成一个折断的箭头, 表示程序不能被执行。 这时该按钮被称作错误列表。 点击它, LabVIEW 弹出错误清单窗口, 则 点击其中任何一个所列出的错误,选用 Find 功能,则出错的对象或端口就会变成高亮。 2.设置执行程序高亮 在 LabVIEW 的工具条上有一个画着灯泡的按钮,这个按钮叫做“高亮执行”按钮上。 点击这个按钮使它变成高亮形式,再点击运行按钮,VI 程序就以较慢的速度运行,没有被 执行的代码灰色显示,执行后的代码高亮显示,并显示数据流线上的数据值。这样,你就可
以根据数据的流动状态跟踪程序的执行。 3.断点与单步执行 为了查找程序中的逻辑错误,有时希望流程图程序一个节点一个节点地执行。使用断 点工具可以在程序的某一地点中止程序执行, 用探针或者单步方式查看数据。 使用断点工具 时,点击你希望设置或者清除断点的地方。断点的显示对于节点或者图框表示为红框,对于 连线表示为红点。当 VI 程序运行到断点被设置处,程序被暂停在将要执行的节点,以闪烁 表示。按下单步执行按钮,闪烁的节点被执行,下一个将要执行的节点变为闪烁,指示它将 被执行。你也可以点击暂停按钮,这样程序将连续执行直到下一个断点。 4.探针 可用探针工具来查看当流程图程序流经某一根连接线时的数据值。从 Tools 工具模板 选择探针工具, 再用鼠标左建点击你希望放置探针的连接线。 这时显示器上会出现一个探针 显示窗口。 该窗口总是被显示在前面板窗口或流程图窗口的上面。 在流程图中使用选择工具 或连线工具,在连线上点击鼠标右键,在连线的弹出式菜单中选择“探针”命令,同样可以 为该连线加上一个探针。 1.4.3 子 VI 的建立 子 VI(SubVI)相当于普通编程语言中的子程序,也就是被其他的 VI 调用的 VI。可以 将任何一个 定义了图标 和联接器的 VI 作为另 一个 VI 的 子程序。在 流程图中打 开 Functions?Select a VI…. ,就可以选择要调用的子 VI 。构造一个子 VI 主要的工作就是定 义它的图标和联接器。 每个 VI 在前面板和流程图窗口的右上角都显示了一个默认的图标。启动图标编辑器的 方法是,用鼠标右键单击面板窗口的右上角的默认图标,在弹出菜单中选择 Edit Icon。 下图显示了图标编辑器的窗口。 可以用窗口左边的各种工具设计像素编辑区中的图标形 状。 编辑区右侧的一个方框中显示了一个实际大小的图标。 图标编辑器的具体使用细节参阅 有关资料。
图标编辑器窗口
联接器是 VI 数据的输入输出接口。如果用面板控制对象或者显示对象从子 VI 中输 出或者输入数据,那么这些对象都需要在联接器面板中有一个连线端子。您可以通过选择 VI 的端子数并为每个端子指定对应的前面板对象以定义联接器。 定义联接器的方法是,用鼠标右键单击面板窗口中的图标窗口,在快捷菜单中选择
Show Connector。 联接器图标会取代面板窗口右上角的图标。LabVIEW 自动选择的端子连接模式是控制 对象的端子位于联接器窗口的左边, 显示对象的端子位于联接器窗口右边。 选择的端子数取 决于前面板中控制对象和显示对象的个数。 联接器中的各个矩形表示各个端子所在的区域,可以用它们从 VI 中输入或者输出数 据。如果必要,也可以选择另外一种端子连接模式。方法是在图标上单击鼠标右键单出快捷 菜单,选择 Show Connector,再次弹出快捷菜单,选择 Patterns。下面我们通过一个练习 说明具体操作。 练习 1-2 为 VI 创建图标和联接器
1.打开 LabVIEW\Activity 目录中的 Temp & Vol.vi,这是练习1-1做的程序。 2. 在前面板中, 用鼠标右键单击窗口右上角的图标, 在快捷菜单中选择 Edit Icon…., 也可以双击图标激活图标编辑器。注意只能在前面板中编辑图标和联接器。 3. 删除默认图标。 使用 Select Tool (矩形框)单击并拖动想要删除的部分, , 按下&Delete&。 也可以通过双击工具框中的阴影矩形删除图标。 4.用 Pencil Tool (铅笔工具)绘制一个温度计。 5.用 Text Tool(文本工具)创建文本。得到图标将如下图所示。
编辑后的图标编辑器窗口
6.单击 OK,关闭编辑器。新创建的图标就显示在屏幕右上角的图标窗口中。 7.用鼠标右键单击前面板中的图标窗口,在快捷菜单中选择 Show Connector, 设置联接器端子连接模式。 在默认情况下, LabVIEW 会 根据前面板中的控制对象和显示对象的数目确定联接器的端子连接 模式。因为前面板中有两个对象,所以联接器有两个端子,如左图 所示。用鼠标右键单击联接器窗口,在快捷菜单中选择 Rotate 90 Degrees(旋转 90 度) ,注意联接器窗口的变化,如左图所示。
9.将端子连接到温度计和电压计: a. 点击联接器上部端子。光标自动变成连线工具,同时端子变成黑色。 b. 单击温度显示对象。一个移动的虚线框把它包围起来,选中的端子的颜色变为 与控制/显示对象的数据类型一致的颜色。 如果单击前面板中的任何空白区域以后, 虚线消失, 选中的 端子变暗, 这表示您已经成功地把显示对象和上部端子连接起来。 如果端子是白色,则表示没有连接成功。 c. 重复步骤 a 和 b,把底部的端子和容积计连接起来。 d. 用鼠标右键单击联接器,在快捷菜单中选择Show Icon…. 10.选择 File?Save ,保存该 VI。 这样这个 VI 就完成了,并也可以作为子 VI 被其他的 VI 调用。子 VI 的图标在主 VI 的流程图中代表它。VI 的联接器 (含有两个端子)输出温度和电压。 练习 1-2 1.5 图表(chart)入门 图表(chart)是一种周 期性更新数据的数字式图形 显 示 对 象 。 可 以 在 Controls?Graph 模板中找到 两种图表:波形图和强度图 (后者不常用)。也可以自定 义图表的格式, 以满足自己的 显示需要或者让它显示更多 的数据。图表具有的特性有: 滚动条、图例、模板、数值显 示、时间坐标显示。 右图显示了快速菜单中 Advanced?Update Mode 子菜 单中提供的三种图表显示类 型――Strip chart (条状图) , Scope chart(示波器图)和 Sweep chart(扫描图)。默认模 式是条状图。 结束
练习 1-3 使用三种图表模式 目的:查看 VI 分别在三种模式下执行时图表的显示。 1.建立前面板及流程图如下 该程序中利用一个循环产生连续的 sin(i)函数值, 并及时地在 chart 图表上显示出 来,现在前面板上的 chart 是一个 strip,这是一个坐标式显示器,与纸带式图表记录 器相似。每接受一个新数据,新数据就将显示在右侧,而原有数据移动到左侧
图1-7 图表的例子 2. 用鼠标选中 chart,点击右键, 可在快速菜单中选择 Advanced?Update Mode 子菜单。 可以选择更换其他两种更新模式。 示波器模式是一个返回式的显示器,与示波器类似。每接受一个新数据时,它就把 新数据绘制在原有数据的右侧。当数据曲线到达显示区的右边缘时,VI 会删除全部图 形,从左边缘重新开始绘制曲线。示波器模式显然要快于条状图模式,因为它不会因为 滚动产生溢出。 扫描模式更接近于示波器模式, 但是当数据曲线到达显示区的右边时, 不会变成空 白,而是会出现一个移动的垂线,标记新数据的开始,并当 VI 添加新数据时穿过整个 显示区。 练习 1-3 结束。
重叠式和堆栈式图区 LabVIEW 可以用同一个垂直坐标在一个图表中显示多个图 区,这种图区被称为重叠式图区,也可使用多个垂直坐标,这时 这 种 图 形 被 称 为 堆 栈 式 图 区 。 请 参 考 Examples\General\ Graphs\charts.llb 中的 charts.vi 示例。
补充练习: 通过下面的要求练习 LabVIEW 的操作。 画出如右下所示的流程图,配以适当的前面板。注意连线时快捷菜单和 Create 功能的 使用,和在前面板上替换不同的 Indicator 的方法。
补充练习的面板及框图
2.1 循环结构 2.1.1 While 循环
While 循环可以反复执行循环体的程序, 直至到达某个边界 条件。 它类似于普通编程语言中的 Do 循环和 Repeat-Until 循 环。 While 循环的框图是一个大小可变的方框, 用于执行框中的 程序,直到条件端子接收到的布尔值为 FALSE。 该循环有如下特点: 计数从 0 开始(i=0)。 先执行循环体,而后 i+1,如果循环只执行一次,那么 循环输出值 i=0。 循环至少要运行一次。
While 循环示意图
练习 2-1 使用 While 循环和图表 目的:用 While 循环和图表获得数据,并实时显示。 创建一个可以产生并在图表中显示随机数的 VI。 前面板有 一个控制旋钮可在 0 到 10 秒之间调节循环时间,还有一个开关 可以中止 VI 的运行。学习怎样改变开关的动作属性,以便不用 每次运行 VI 时都要打开开关。操作步骤如下: 前面板
随机信号 1.0 0.8 0.6 0.4 0.2 0.0 0
10.0 2.0 循环延时 4.0 6.0 8.0
控制开关 ON OFF
练习2-1的前面板
1. 选择 File?New,打开一个新的前面板。
2. 选择 Controls?Boolean,在前面板中放置一个开关。 设置开关的标签为控制开关。 3. 使用标签工具创建 ON 和 OFF 的标签, 放置于开关旁。 4. 选中 Controls?Graph, 在前面板中放置一个波形图 (是 chart,而不是 graph)。设置它的标签为随机信号。这个图表 用于实时显示随机数。 5. 把图表的纵坐标改为 0.0 到 1.0。方法是用标签工具 把最大值从 10.0 改为 1.0。 6. 选择 Controls?Numeric,在前面板中放置一个旋钮。 设置旋钮的标签为循环延时。这个旋钮用于控制 While 循环的 循环时间。 流程图 7. 开流程图,按照下图创建流程图。
循环延时 控制开关
图2-2 练习2-1的流程图 a. 从 Functions?Structures 中选择 While 循环,把它 放置在流程图中。 将其拖至适当大小, 将相关对象移到循环圈内。 b. 从 Functions? Numeric 中选择随机数(0-1)功能函 数放到循环内。 c. 在循环中设置 Wait Until Next ms Multiple 函数 (Functions?Time & Dialog),该函数的时间单位是毫秒,按 目前面板旋钮的标度,可将每次执行时间延迟 0 到 10 毫秒。 d. 照上面所示的流程图连线, 把随机数功能函数和随机信 号图表输入端子连接起来,并把启动开关和 While 循环的条件 端子连接。 8. 返回前面板,调用操作工具后单击垂直开关将它打开。 9. 把该 VI 保存为 LabVIEW\Activity 目录中的 Random Signal.vi。 10. 执行该 VI。While 循环的执行次数是不确定的, 只要设置的条件为真,循环程序就会持续运行。在这个例子中, 只要开关打开(TRUE),框图程序就会一直产生随机数,并将其 在图表中显示。 11. 单击垂直开关,中止该 VI。关闭开关这个动作会 给循环条件端子发送一个 FALSE 值,从而中止循环。
12. 用 鼠 标 右 键 单 击 图 表 , 选 择 Data Operations?Clear Chart,清除显示缓存,重新设置图表。 练习 2-1结束 附注与说明 布尔开关的机械动作: 布尔开关有 6 种机械动作属性可供选择。 在前面板上用鼠标右键单击开关, 在快捷菜单 中选择 Mechanical Action 就可以看到这些可选的动作。LabVIEW 还提供了一个范例示范这 些动作,它是位于 Examples\General\Controls\booleans.llb 的 Mechanical Action of Booleans.vi。
2.1.2
移位寄存器(Shift Register)
移位寄存器可以将数据从一个循环周期传递到另 外一个周期。在程序设计中,经常要用到它.创建一 个移位寄存器的方法是,用鼠标右键单击循环的左边 或者右边,在快捷菜单中选择 Add Shift Register。如 右图所示。 移位寄存器在流程图 上用在循环边框上相应的 一对端子来表示。右边的 端子中存储了一个周期完 成后的数据,这些数据在 这个周期完成之后将被转 移到左边的端子, 赋给下一个周期。 移位寄存器可以转移各种类 型的数据--数值、布尔数、数组、字符串等等。它会自动适应 与它连接的第一个对象的数据类型。下图表示了它的工作过程.
Shift Register 的工作过程
可以令移位寄存器记忆前面的多个周期的数值。 这个功能对 于计算数据均值非常有用。 还可以创建其他的端子访问先前的周 期的数据, 方法是用鼠标右键单击左边或者右边的端子, 在快捷 菜单中选择 Add Element。例如,如果某个移位寄存器左边的端 口含有三个元素,那么就可以访问前三个周期的数据。 练习 2-2 使用移位寄存器 目的:创建一个可以在图表中显示运行平均数的VI。 前面板 1.打开一个新的前面板,按照下图所示创建对象。 2.把波形图表的坐标范围改为 0.0 到 2.0。 3.在 添 加 竖 直 坐 标 之 后 , 用 鼠 标 右 键 单 击 它 , 在 快 捷 菜 单 中 选 择 Mechanical Action?Latch When Pressed, 再选择 Operate?Make Current Values Default, ON 状态设 把 置为默认状态。
Boolean ON OFF 缺省值:ON 机械动作 Latch When Pressed
随机数 2.0 1.5 1.0 0.5 0.0 0 50
图2-4 流程图 4.按下图创建流程图。
练习2-2的前面板
500 Boolean
练习2-2的流程图
5.在流程图中添加 While 循环(Functions?Structures),创建移位寄存器。
a. 用鼠标右键单击 While 循环的左边或者右边, 在快捷菜单中选择 Add Shift Register。 b. 用鼠标右键单击寄存器的左端子,在快捷菜单中选择 Add Element,添加一个寄存 器。用同样的方法创建第三个元素。 6.Random Number (0C1)函数(Functions?Numeric)――产生 0 到 1 之间的某个随机数。 7.Compound Arithmetic 函数(Functions?Numeric)――在本练习中,它将返回两个周期 产生的随机数的和。如果要加入其他的输入,只需用右键单击某个输入,从快捷菜单中 选择 Add Input。 8.除法函数(Functions?Numeric)――在本练习中,它用于返回最近四个随机数的平均 值。 9.数值常数(Functions?Numeric)――在 While 循环的每个周期,Random Number (0C1) 函数将产生一个随机数。VI 就将把这个数加入到存储在寄存器中的最近三个数值中。 Random Number (0C1)再将结果除以 4,就能得到这些数的平均值(当前数加上以前的 三个数) 。然后再将这个平均值显示在波形图中。 10. Wait Until Next ms Multiple 函数 (Functions?Time & Dialog)――它将确保循环 的每个周期不会比毫秒输入快。在本练习中,毫秒输入的值是 500 毫秒。如果用鼠标右 键单击图标,从快捷菜单中选择 Visible?Label,就可以看到 Wait Until Next ms Multiple 的标签。 11. 用鼠标右键单击 Wait Until Next ms Multiple 功能函数的输入端子,在快捷菜单中 选择 Create Constant。出现一个数值常数,并自动与功能函数连接。 12. 将 Constant 设置为 500。 这样连接到函数的数值常数设置了 500 毫秒的等待时间。 因此循环每半秒执行一次。注意,VI 用一个随机数作为移位寄存器的初始值。如果没 有设置移位寄存器端子的初始值, 它就含有一个默认的数值, 或者上次运行结束时的数 值,因此开始得到的平均数没有任何意义。 13. 执行该 VI,观察过程。 14. 把该 VI 保存为 LabVIEW\Activity 目录下的 Random Average.vi。 练习 2-2 结束。
附注:移位寄存器的初值: 上面的练习中对移位寄存器设置了初值0.5。如果不设这个初值,默认的初值是0。 在这个例子中, 一开始的计算结果是不对的, 只有到循环完3次后移位寄存器中的过去值才 填满,即第4次循环执行后可以得到正确的结果。 2.1.3 For 循环 For 循环用于将某段程序执行指定次数。 While 循环一样, 和 它不会立刻出现在流程图中, 而是出现一个小的图标, 而后您可 以修改它的大小和位置。 具体的方法是, 先单击所有端子的左上 方,然后按下鼠标,拖曳出一个包含所有端子的矩形。释放鼠标 时就创建了一个指定大小和位置的 For 循环。
For 循环将把它的框图中的程序执行指定的次数,For 循环 具有下面这两个端子: N: 计数端子(输入端子)――用于指定循环执行的次数。 I: 周期端子(输出端子)――含有循环已经执行的次数。 上图显示了一可以产生 100 个随机数并将数据显示在一个 图表上的 For 循环。在该例中,i 的初值是 0,终值是 99。 练习 2-3 使用 For 循环 目的:用 For 循环和移位寄存器计算一组随机数的最大值。 1.打开一个新的前面板,按照下图创建对象。 a. 将一个数字显示对象放在前面板, 设置它的标签为 “最 大值”。 b. 将一个波形图表放在前面板, 设置它的标签为 “随机数” 。 将图表的纵坐标范围改为 0.0 到 1.0。 c. 在图表的快捷菜单中选择 Visible Items?Scrollbar 和 Digital Display,并隐藏 Plot Legend。 d. 用移位工具修改滚动栏的大小。
100 随机数 最大值 0
练习2-3 的面板和流程图
2.按照上图画流程图。
3. 在流程图中放置一个 For 循环 (Functions?Structures) 。 4. For 循环的边框处单击鼠标右键, 在 在快捷菜单中选择 Add Shift Register。 5.将下列对象添加到流程图。 a Random Number (0C1)函数(Functions?Numeric)― ―产生 0 到 1 之间的某个随机数。 b 数值常数(Functions?Numeric)――在这个练习中需 要将移位寄存器的初始值设成 0。 c Max&Min 函数(Functions?Comparison)――输入两个 数值,再将它们的最大值输出到右上角,最小值输出到右下角。 这里只需要最大值,只用连接最大值输出。 d 数值常数(Functions?Numeric)――For 循环需要知 道需要执行的次数。本练习中是 100 次。 6.按照上图连接各个端子。 7.运行该 VI。 8. 将该 VI 保存为 LabVIEW\Activity 目录下的 Calculate Max.vi。 练习 2-3 结束。
2.2 分支结构:Case Case 结构含有两个或者更多的子程序(Case),执行那一个 取决于与选择端子或者选择对象的外部接口相连接的某个整数、 布尔数、字符串或者标识的值。必须选择一个默认的 Case 以处 理超出范围的数值,或者直接列出所有可能的输入数值。Case 结构见下图, 各个子程序占有各自的流程框, 在其上沿中央有相 应的子程序标识:Ture、False 或1、2、3…。按钮用来改变 当前显示的子程序(各子程序是重叠放在屏幕同一位置上的)。
条件端子 子程序标识
练习 2-4 使用 Case 结构 目的:创建一个VI以检查一个数值是否为正数。如果它是正的,VI就计算它的平方根,反之 则显示出错。
前面板 1. 打开一个新的前面板,并按照下图所示创建对象。 控制对象用于输入数值,显示对象用于显示该数值的平方根。 流程图 2.照下图创建流程图。
Number 2.00 SQRT 1.41
False -999.00
练习2-4的面板和流程图
3. 从 Functions?Structures 中选择一个 Case 结构,并 放置在在流程图中。Case 结构是一个可以改变大小的方框。先 来做 Ture 的情况,照流程图上半部分构造。 a Greater Or Equal To 0? 函数(Functions?Comparison) ――如果输入数值大于或者等于 0 就会返回一个 TRUE 值。 b Square Root 函数(Functions?Numeric)――返回输 入数值的平方根。 c 连好线 d 点击 Case 框的选择按钮,转入 False 情况编程 e 数值常数(Functions?Numeric)――这里用于显示错 误的代数值-999.00。 f One Button Dialog 函数(Functions?Time & Dialog)――在这里它用于显示一个对话框,内容是 Error...。 g 字符串常数 (Functions?String)――用 Edit Text Tools 在对话框中输入字符串。 h 该 VI 在 TRUE 或者 FALSE 情况下都会执行。 如果输入的 数值大于等于 0,VI 会执行 TRUE Case,返回该数的平方根,否
则将会输出-999.00,并显示一个对话框,内容为 Error...。 4. 返回前面板,运行该 VI。修改标签为 Number 的数字式 控制对象的数值,分别尝试一个正数和负数。注意,当把数字式 控制对象的值改为负数时,LabVIEW 会显示 Case 结构的 FALSE Case 中设置的出错信息。 5. 保存该 VI 到 LabVIEW\Activity 目录中的 Square Root.vi。 VI 的算法 本练习中的流程图功能相当于代码式编程语言中的下列伪 代码: if (Number &= 0) then Square Root Value = SQRT(Number) else Square Root Value = -999.00 Display Message &Error.. & end if 练习 2-4 结束。
2.3 顺序结构和公式节点 2.3.1 顺序结构(Sequence Structure) 在代码式的传统编程语言中,默认的情况是,程序语句按照排列顺序执行,但 LabVIEW 中不同,它是一种图形化的数据流式编程语言。在图2-7左图中,假设有 A、B、C、D4 个节点,其数据流向如右图所示。按照数据流式语言的约定,任何一个节点只有在所有
图2-7 顺序结构的说明 的输入数据有效时才会执行,所以图中,当且仅当 A、B、C3个节点执行完,使得 D 节点的 3个输入数据都到达 D 节点后,D 节点才执行。但是你要注意,这里并没有规定 A、B、C3 个节点的执行顺序。在 LabVIEW 中这种情况下,A、B、C 的执行顺序是不确定的,如果你需 要对它们规定一个确定的顺序,那就需要使用本节介绍的“顺序结构” 。 图2-7中的右边是顺序结构的图标,它看上去像是电影胶片。它可以按一定顺序执行 多个子程序。首先执行 0 帧中的程序,然后执行 1 帧中的程序,逐个执行下去。与 Case 结 构类似,这多帧程序在流程图中占有同一个位置。 练习 2-5 使用顺序结构 目的:创建一个 VI,计算生成等于某个给定值的随机数所需要的时间。
前面板 1. 打开一个新的前面板,并按照下图所示创建对象。
给定数据 50 当前值 50 执行次数 6 匹配时间(秒) 0.00
练习2-5的前面板
我们约定数据是0到 100 范围的整数。 当前值用于显示当前产生的随机数。执行次数” “ 用于显示达到指定值循环执行的次数。匹配时间用来显示达到指定值所用的时间。 流程图
0 [0..2] 读取初始时间
1 [0..2] 匹配计算 当前值 100.00 执行次数
2 [0..2] 计算延时时间(秒) 匹配时间(秒)
练习2-5的流程图(共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帧 在第 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。 练习 2-5 附注与说明:设置数据范围 在设定一个数据对象时, 可以设置对输入数据的限制, 利用 结束。
快捷键选择 Data Range… 选项,将会出现如下对话框:
设置数据范围
它可以防止用户创建的控制对象或显示对象的值超出某个 预设的范围。 您可以选择忽略这个值, 将它强制修改到范围以内, 或暂停程序的执行。在程序执行时,如果发生溢出错误,溢出错 误符号将显示在工具栏中的执行按钮的位置。 而且, 一个立体的 黑框将把发生溢出的控制对象包围起来。 2.3.2 公式节点(Formula Node) 公式节点是一个大小可变的方框, 可以利用它直接在流程图 中输入公式。从 Functions?Structures 中选择公式节点就可以 把它放到流程图中。 当某个等式有很多变量或者非常复杂时, 这
个功能就非常有用。例如等式:y = x + x + 1 使用公式节点可 以表示为: 图2-10 公式节点示意图
利用公式节点可以直接输入一个或者多个复杂的公式, 而不 用创建流程图的很多子程序。 使用文本编辑工具来输入公式。 创 建公式节点的输入和输出端子的方法是,用鼠标右键单击第 0 帧的底部边框,选择 Add Input (Add Output)。再在节点框中 输入变量名称。 变量名对大小写敏感。 然后就可以在框中输入公 式。每个公式语句都必须以分号(;)结尾。
公式节点的帮助窗口中列出了可供公式节点使用的操作符、 函数和语法规定。一般说来,它与 C 语言非常相似,大体上一个 用 C 写的独立的程序块都可能用到公式节点中。 但是仍然建议不 要在一个公式节点中写过于复杂的代码程序。 下面这个例子显示了如何在一个公式节点中执行不同条件 时的数据发送。 请阅读下面这段程序代码, 如果 X 为正数, 它将算出 X 的平 方根并把该值赋给 Y,如果 X 为负数,程序就给 Y 赋值-99。 if (x &= 0) then y = sqrt(x) else y = -99 end if 可以用公式节点取代上面这段代码,如下图所示:
Y=(X&=0)?sqrt(X):-99; Y
注意:公式节点中变量字母 X,Y 大、小写是有区别的,开方 的函数 sqrt(X)中函数名称是小写。 练习 2-6 使用公式节点 目的:创建一个VI,它用公式节点计算下列等式: 3 2 y1 = x C x + 5 y2 = m* x + b x 的范围是从 0 到 10。 可以对这两个公式使用同一个公式节 点,并在同一个图表中显示结果。 前面板
Waveform Graph m 30.00 .0 600.0 b 20.00 400.0 200.0 0.0 0 1 2 3 4 5 6 7 8 9 10 y1 y2
图2-11
练习2-6的面板
1. 打开一个新的前面板, 按照上图 (该图中包含运行结果) 创建前面板中的对象。 波形图显示对象用于显示等式的图形。 该
VI 使用两个数字式控制对象来输入 m 和 b 的值。
按照下图创建流程图。
11 Formule Node y1=x**3+x**2+5; y2=m*x+b; m m b b x y2 y1 Waveform Graph
图2-12
练习2-6的流程图
在创建某个输入或者输出端子时, 必须给它指定一个变量名。 这个变量名必须与公式节点中使用的变量名完全相符。 公式节点中,在边框上单击鼠标右键,在快捷菜单中选择 Add Input,可以创建三个输入端子。在快捷菜单中选择 Add Output,创建输出端子。 x 的范围是从 0 到 10(包括 10),就必须连接 11 到计数端 子。 Build Array (Functions?Array)――在这个 例子中,它用于将两个数据构成数组形式提供给一 个多曲线的图形中。通过用变形工具拖拉边角就可 以创建两个输入端子。 3. 返回前面板, 尝试给 m 和 b 赋以不同的值再执行该 VI。 4. 把 该 VI 保 存 为 LabVIEW/Activity 目 录 下 的 Equations.vi。
练习 2-6 结束。
第三章 数据类型:数组、簇和波形
3.1 概述 数组是同类型元素的集合。一个数组可以是一维或者多维, 31 如果必要, 每维最多可有 2 -1 个元素。 可以通过数组索引访问 其中的每个元素。索引的范围是 0 到 n C 1,其中 n 是数组中 元素的个数。 图3-1所显示的是由数值构成的一维数组。 注意 第一个元素的索引号为 0,第二个是 1,依此类推。数组的元素 可以是数据、字符串等,但所有元素的数据类型必须一致。
数组示意图
簇(Cluster)是另一种数据类型,它的元素可以是不同类 型的数据。它类似于 C 语言中的 stuct。使用簇可以把分布在流 程图中各个位置的数据元素组合起来, 这样可以减少连线的拥挤 程度。减少子 VI 的连接端子的数量。 波形(Waveform)可以理解为一种簇的变形,它不能算是一种有普遍意义的数据类型, 但非常实用。 3.2 数组的创建及自动索引
3.2.1 创建数组 一般说来,创建一个数组有两件事要做,首先要建一个数组的“壳” (shell) ,然后在这 个壳中置入数组元素(数或字符串等) 。 如果需要用一个数组作为程序的数据源,可以选择 Functions?Array?Array Constant,将它放置在流程图中。然 后再在数组框中放置数值常量、 布尔数还是字符串常量。 下图显 示了在数组框放入字符串常量数组的例子。左边是一个数组壳, 中间的图上已经置入了字符串元素, 右边的图反映了数组的第0 个元素为:”ABC”,后两个元素均为空。
Array Constant 0 0
Array Constant ABC 0
Array Constant ABC
数组的创建
在前面板中创建数组的方法是,从 Controls 模板中选择 Array & Cluster,把数组放置在前面板中,然后选择一个对象 (例如数值常量) 插入到数组框中。 这样就创建了一个数值数组。 也可以直接在前面板中创建数组和相应的控制对象, 然后将 它们复制或者拖曳到流程图中,创建对应的常数。 还有很多在流程图中创建和初始化数组的方法, 有些功能函 数也可以生成数组。 3.2.2 数组控制对象、常数对象和显示对象 通过把数组与数值、布尔数、字符串或者簇组合在一起,可以在前面板和流程图中创建 任何一种控制对象、常数对象和显示对象。数组元素不能是数组、图表或者图形。如果您想 查看一些数组的例子,请查看 Examples\General\arrays.llb 中的例子。 3.2.3 自动索引 For 循环和 While 循环可以自动地在数组的上下限范围内编索引和进行累计。这些功能 称为自动索引。 在启动自动索引功能以后, 当把某个外部节点的任何一维元素连接到循环边 框的某个输入通道时, 该数组的各个元素就将按顺序一个一个地输入到循环中。 循环会对一 维数组中的标量元素, 或者二维数组中的一维数组等编制索引。 在输出通道也要执行同样的 工作DD数组元素按顺序进入一维数组,一维数组进入二维数组,依此类推。 在默认情况下, 对于每个连接到 For 循环的数组都会执行自 动索引功能。 可以禁止这个功能的执行, 方法是用鼠标右键单击 通道(输入数组进入循环的位置),在快捷菜单中选择 Disable Indexing。 练习 3-1 创建一个自动索引的数组 目的:使用 For 循环的自动索引功能创建数组,并用一个图形(Graph)显示该数组。 前面板
练习3-1的面板
1. 打开一个新的前面板。 2. 选择 Controls?Array & Cluster,在前面板 中放置一个数组。设置它的标签为 Waveform Array。 3. 选择 Controls?Numeric,在
数组框中插入一个数字式显示对象。 如右图所示。 它用于显示数 组的内容。 4. 选择 Controls?Graph,在前面板中放置一个波形图。 设置它的标签为 Waveform Graph。 5. 隐藏图例和模板。 6. 用鼠标右键单击图形,并在快捷菜单中取消选中 Y Scale?Autoscale Y,禁止自动坐标功能。 7. 使用文本工具,把 Y 轴的范围改为-0.5 到 1.5。 流程图 8.
按照下图创建流程图。
Delta X 1 0 Waveform Graph X0
Waveform Array
图3-2 练习3-1的流程图 由 Functions?Select a VI… 寻 找 LabVIEW\activity 目录下的 Generate Waveform VI ,它的作用是返回波形中的某一点。这个 VI 需要输入一个索引,我们将循环周期连接到这个 输入。 注意 Generate Waveform VI 连出来的连线在循环边界 变成一个数组时会变粗,正是在这个边界处形成了一维数组。 For 循环会自动累计边界内的数组。 这种功能叫做自动 索引。在这个例子中,连接到循环计数输入的数值常数令 For 循环创建了一个由 100 个元素组成的数组。 Bundle 函数( Functions? Cluster)― ―将图块中的各个组件组合成一个簇,在正确连接 以前需要改变该函数的图标的大小。将移位工具放 在图标的左下角。 变形工具会变成如左图所示, 拖曳鼠标直到出 现第三个输入端子。 数值常数 Functions?Numeric) ( ――三个数值常数用 于设置 For 循环执行的周期数 N=100,初始 X=0 和 delta X=1。 9. 从前面板执行该 VI。该 VI 将把自动索引后的波形图数 组显示在波形图中。 10. 把 X 的 delta 值改为 0.5, 的初始值改为 20。 X 再次执 行该 VI。注意,波形图现在同样显示 100 个点,而每个点的初 始值为 20,X 的 delta 值为 0.5(见 X 轴)。 11. 只需在显示器中输入元素的索引号就可以查看波形数 组中的任何元素。 如果输入的数比数组的元素个数大, 那么显示
器将变暗,表示您没有为该元素设置索引。 如果需要一次查看多个元素,可以通过改变数组显 示对象的大小来实现。把定位工具放置在数组框的右下 角。工具将变成右图所示的变形工具。当工具变形时,用鼠标拖 曳数组的右边或者下边。 数组现在就可以按照元素索引的上升顺 序显示多个素, 以某个与指定索引对应的元素开始, 如下图所示。
练习3-1中多个数组元素的同时观察 在前面的流程图中, 您为波形图指定了初始的 X 值和 delta X 值。默认的 X 初始值是 0,delta X 值是 1。这样,也可以把 波形数组直接连接到波形图端子, 而无需指定初始的 X 值和 delta X 值,如图3-4所示。
练习3-1使用默认 X 及 Delta X 时简化后的流程图 12. 按上图删除 Bundle 功能函数和它所连接的常数对象。 方法是用移位工具选择该功能函数和连接的常数对象,按下 &Delete&。再选择 Edit?Remove Bad Wires。按照上图完成流程 图的连线。 13. 执行该 VI。注意初始的 X 值是0,delta X 值是 1。
多图区图形 可以创建含有多条曲线的图形, 方法是创建一个数组, 用它 来汇集传给单图区图形的类型的数据元素。
Waveform Graph Build Array 50 0.5
练习3-1多图区图形的流程图
14. 按照上图创建流程图。
正 弦 函 数 (Functions?Numeric?Trigonometric) ――在这里, 它用于在 For 循环中创建一个由数据点组成的数组, 表示一个正 弦波周期。 Pi 常数(Functions?Numeric?Additional Numeric Constants) Build Array (Functions?Array)――在 这里, 它用于创建合适的数据结构 (一个二维数组) , 在波形图中绘制两条曲线。。用移位工具拖曳边角 可以增大该函数的面积,创建两个输入端子。 15. 返回前面板,执行该 VI。注意同一个波形中的两个图 区。默认情况下,它们的 X 初始值都是 0,delta X 初始值都是 1。下图是该程序的运行结果(前面板未改动)。 16. 把该 VI 保存为 LabVIEW\Activity 目录中的 Graph Waveform Arrays.vi。 17. 可以修改图形中的某个图区的外观。 方法是, 用鼠标右 键单击这个图形,再从弹出菜单选择对应的图例。
Waveform Graph 1.5 Array 0 -0.09 1.0 Plot 0
0.5 0.0 -0.5 0 10 20 30 40 50 60 70 80 90 100
图3-6 练习3-1多图区图形的面板显示 练习 3-1 结束。 在上面这个例子中, 由于计算端子连接了一个值为 100 的常 数对象,所以 For 循环将执行 100 次。下面这个例子显示了另
外一种控制循环执行次数的方法。 更详细的例子建议调阅 Examples》Fundamentals 》Graphs and Charts》Graph Examples》Waveform Graph 例子。 练习 3-2 对输入数组使用自动索引功能 目的:打开并执行一个 VI,它将在一个 For 循环中使用自动索引功能处理一个数组。 1. 选 择 File?Open… , 打 开 Examples\General\arrays.llb 中的 Separate Array Values VI 。 2. 打开流程图。下面的示意图显示的是在 TRUE 和 FALSE 时的情况。
Initialize Array True Positive Array Build Array Input Array Negative Array
Initialize Array
False Build Array Positive Array Negative Array
Input Array
练习3-2的流程图
注意,Input Array 引出的连线与 For 循环外的粗线不同, 表示这是一个数组, 而循环内部的细线则表示这是一个数组元素。 数组元素在每个循环期间将自动编号。 用自动索引功能设置 For 循环的计数器 注意,计数器端子还没有连线。当您对某个进入 For 循环的数组使用自动索引功能时, 循环就将根据数组的大小执行 相应的次数, 这样就无需连接某个值到计数器的端口。 如果对一 个以上的数组使用自动索引功能, 或者在使用自动索引功能之外 还需要设置计数器时,实际的循环次数将是其中最小的数。 3. 执行该 VI。在输入的八个数中,可以看到 4 个属于正 数数组,另外 4 个属于负数数组。 4. 从流程图中将一个值为 5 的常数对象连接到 For 循环 的计数器端子。执行该 VI。可以看到尽管输入数组仍然有八个 元素, 但是 3 个位于正数数组, 另外 2 个位于负数数组。 这说明,
如果设置了 N 并开启了自动索引功能, 那么实际循环的次数将取 较小的数。 5. 关闭该 VI,不要保存任何修改。 注:练习 3-2的算法说明 下面是一段伪代码, 解释上面的算法, 假定输入数组为 A (已 赋值),B(正数)、C(负数)。Sbr 、Scr 分别是与 B 数组、 C 数组对应的右寄存器数组,Sbl 、Scl 分别是与 B 数组、C 数 组对应的左寄存器数组, size 运算为测数组实际大小, ins 运算 为将一个数插入数组中最左边的空位。 B=0 C=0 K=size(A(.)) For i=0 to k-1 p=A(i) if p&=0 then Ins p,Sbr Else Ins p,Scr end if Sbl=Sbr Scl=Scr Next i B=Sbr C=Scr Print B Print C End 练习 3-2 结束。 显示 右寄存器值送到正数组 右寄存器值送给左寄存器 将p值插入右寄存器 取第I个元素值 测A数组大小 初始化
数组功能函数 LabVIEW 提供了 很多 用于操 作数 组的功 能函 数,位于 Functions?Array 中。 其中包括 Replace Array Element,、 Search 1D Array、Sort 1D Array、 Reverse 1D Array 和 Multiply Array Elements 等等。
创建数组――Build Array 函数(Functions?Array) ,用于根据标量值或 者其他的数组创建一个数组。
开始时, Build Array 函数具有一个标量输入端子。 您可以根据需要向该功能函数中加入 任意数量的输入,输入可以是标量或者数组。如果要添加其他的输入,用鼠标单击函数的左 侧,在弹出菜单中选择 Add Element Input 或者 Add Array Input。还可以用变形工具来增 大节点的面积(把移位工具放置在某个对象的边角就会变成变形光标) 。也可以使用变形光 标或者选择 Remove Input 来删除输入。 下图显示了利用流程图中的常数对象的值创建和初始化数组的两种方法。 左侧的方法是, 将 5 个字符串常数放入一个一维字符串数组中。 右侧的方法是, 将三组数值常数放入三个一 维数值数组,再将这三个数组组成一个二维数组。这样最后产生的是一个 3x3 的数组,三列 分别是 3, 4, 7; C1, 6, 2; 5, C2, 8.。
还可以通过结合其他的含有标量元素的数组来创建数组。例如,假设有两个数组,三个 标量元素,可把它们组成一个新的数组,顺序是:数组 1,标量 1,标量 2,数组 2,标量 3。 初始化数组(Initialize Array)――用于创建所有元素值都相等的数组。下图 中,该功能函数创建了一个一维数组。
元素输入端子决定每个元素的数据类型和数值, 维长度输入端子决定数组的长度, 例如, 假设元素类型是长整型,值为 5,维长度为 100,那么创建的数组是一个一维的、由 100 个 值为 5 的长整型元素组成的数组。 也可以从前面板控制端子、 流程图常数或者程序其他部分 的计算结果得到输入。 创建和初始化一个多维数组的方法是, 用鼠标右键单击函数的右下侧, 在弹出菜单中选 择 Add Dimension。还可以使用变形光标来增大初始化数组节点的面积,为每个增加的维添 加一个维长度输入端子。 也可以通过缩小节点的方法来删除维, 即从函数的弹出菜单中选择 Remove Dimension,或者使用变形光标。下面的示意图显示了怎样初始化一个三维数组。
如果所有的维长度输入都是 0,该函数会创建一个具有指定数据类型和维数的空数组。 数组大小――Array Size 函数,返回输入数组中的元素个数。
数组子集(Array Subset)――选取数组或者矩阵的某个部分。
该函数可以返回从某个指针开始的部分数组, 并包括了长度元素。 下图显示了一些数组 子集的例子,注意,数组索引从 0 开始。
索引数组(Index Array)――用于访问数组中的某个元素。
下图显示了一个索引函数的例子,它用于访问数组中的第三个元素。注意,因为第一个 元素的索引为 0,所以第三个元素的索引是 2。
将一个二维数组与 Index Array 函数相连,Index Array 就会含 2 个索引端子。将一个三 维数组与 Index Array 函数相连,Index Array 就会含 3 个索引端子。余类推。可以使用的索 引端的符号是一个黑方快, 被禁止使用的索引端 (Disable Indexing) 是一个空心的小方框。 当给一个被禁止使用的索引端连接上一个 Constant 或 Control 是它会自动变为黑方快,即 变为可以索引,相反原来一个可以使用的索引端上连接的 Constant 或 Control 被删去时, 索引端符号会自动变为空心的小方框,即变为禁止使用。 也可以按照任何维的组合提取子数组, 下面的示意图显示了怎样从一个二维数组中提取 一个一维的行或者列数组。
还可以从一个三维数组中提取一个二维数组, 方法是禁止两个索引端子, 或者通过禁止 一个索引端子提取一个一维数组。下图显示了从三维数组提取数组的各种方法。
下面的规则对使用剪切数组进行了规定: 输出对象的维数必须等于被禁止的索引端口的数目。例如 0 个索引端口被禁止=标量元素 1 个索引端口被禁止=二维元素 2 个索引端口被禁止=三维元素 启动的端子所连接的数值必须指定输出元素。 这样,您就可以理解,上图中左下方的例子的作用是,利用 0 列和 3 行的所有元素产生 一个一维数组, 而右上方的例子的作用是利用第一帧中的所有元素产生一个二维数组。 新的 第 0 个元素是与原有元素最近的元素。 练习 3-3 使用创建数组功能函数 目的:使用创建数组函数,把一些元素和输出组织成一个更大的数组。
练习3-3的面板和框图
1. 按照图3-8创建一个前面板。 2. 从 Controls?Numeric 模板中选择一个数字控制对象放 置在前面板中,设置它的标签为 scalar 1。 3. 复制并粘贴该数字显示对象, 创建两个新的对象, 并分 别设置它们的标签为 scalar 2 和 scalar 3。 4. 创建一个数字控制对象的数组, 设置它的标签为 array 1。 复制并粘贴它, 创建一个新的数组, 设置它的标签为 array 2。 5. 在 array 1、scalar 1、 scalar 2、scalar 3、array 2 中输入数值 1 到 9。 6. 创建流程图。选择 Functions?Array,在流程图中放置 一个 Build Array 功能函数。用定位工具增大函数额面积,以容 纳 5 个输入。 7. 把数组和标量与 Build Array 连接起来。 创建输出的一 维数组,它由 array 1、scalar 1、 scalar 2、array 2、scalar 3 中的元素所组成,如图所示。 8. 执行该 VI。可以看到 array 1、scalar 1、 scalar 2、 scalar 3、array 2 中的数值出现在同一个一维数组中。 9. 保 存 该 VI 为 LabVIEW\Activity 目 录 下 的 Build Array.vi。 练习 3-3 结束。
什么是多态化(Polymorphism)? 多态化是指一种函数功能, 即可以协调不同格式、 维数或者 显示的输入数据。大多数 LabVIEW 的函数都是多态化的。例如, 图3-9给出了 Add 函数的一些多态化组合。
多态化组合的例子
第一个组合中,两个标量相加,结果还是一个标量。第二个 组合中,该标量与数组中的每个元素相加,结果是一个数组。数 组是数据的集合。 第三个组合中, 一个数组的每个元素被加到另 一个数组的对应元素中。 您还可以使用其他的组合, 例如数值簇 或者簇数组。 可以把这些准则应用到其他的 G 语言函数或者数据类型。G 语言函数对于各种情况都具有多态性功能。 有些函数接受数值和 布尔输入, 而有些函数接受其他任何数据格式的组合。 如果您想 了 解 更 多 关 于 多 态 化 的 知 识 , 请 参 阅 Online Reference?Function and VI Reference。 3.5 簇 3.5.1 创建簇控制和显示 在前面板上放置一个簇壳 (Cluster shell) 就创建了一个簇。 然后你可以将前面板上的任何对象放在簇中。例如数组,你也 可以直接从 Control 工具板上直接拖取对象堆放到簇中。 一个簇 中的对象必须全部是 Control,或全是 Indicator,不能在同一个 簇中组合 Control 与 Indicator,因为簇本身的属性必须是其中之 一。一个簇将是 Control 或 Indicator,取决于其内的第一个对象 的状态。如果需要可以使用工具重置簇的大小。右图所示是一 个含4个 Control 的簇。也可以在流程图上用类似的方法创建簇 常数。 如果你要求簇严格地符合簇内对象的大小,可在簇的边界上弹出快速菜单选择自动定 义大小(Autosizing) 簇的序(Order) 簇的元素有一个序, 它与簇内元素的位置无关。 簇内第一个元素的序为 0, 第二个是 1, 等等。如果你删除了一个元素,序号将自动调整。如果你想将一个簇与另一个簇连接,这两 个簇的序和类型必须同一。 如果想改变簇内元素的序,可在快速菜单中选择 ReOrder Controls In Claster,这时会 出现一个窗口,在该窗口内可以修改序。
3.5.2 使用簇与子 VI 传递数据 一个 VI 的连接窗口最大有 28 个端子,如果你不希望使用全部 28 个端子传递数据,这 既烦琐又易出错。 通过把控制或显示对象捆绑成一个簇的方法, 仅使用一个端子就可以实现 该功能。 捆绑(Bundle)数据 Bundle 功能将分散的元件集合为一个新的簇,或允许你重置 一个已有的簇中的元素。可以用位置工具拖曳其图标的右下角以 增加输入端子的个数。 最终簇的序是取决于被捆绑的输入的顺序。 右图中 Bundle 图标中部的 Claster 端子用于用新元素重置原簇中的元素。 分解(Unbundle)簇 Unbundle 功能是 Bundle 的逆过程, 它将一个簇分解为若干分 离的元件。 如果你要对一个簇分解, 就必须知道它的元素的个数。 LabVIEW 还提供一种可以根据元素的名字来捆绑或分解簇的方 法,稍后介绍。 练习 3-4 簇 目的:学习创建簇、分解簇,再捆绑簇并且在另一个簇中显示其内容。
Input Cluster Numeric 6.00 Boolean1 Boolean 2 Output Cluster Numeric 6.00 Boolean1 Boolean 2 stop STOP
String Tsinghua
String Tsinghua
Input Cluster
Output Cluster
图3-10
练习3-4的面板和框图
1.打开前面板,创建一个簇壳(Array & Cluster palette) ,标签改为 Input Cluster,拖曳至 适当大小。 2.在这个簇壳中放置一个数字 Control,两个布尔开关,和一个串 Control。 3.仿照以上步骤,创建 Output Cluster 如上。注意将各 Control 改为相应的 indicator。
4.用快速菜单查看两个簇的序是否一致,若有差别,改之。 5.在前面板上设置一个[STOP]按钮。注意其缺省值为 FALSE,不要改变它的状态。 6.建立如上面所示的流程图。注意在[STOP]按钮与循环条件端子之间接入了一个 NOT 函 数,因为按钮缺省值为 FALSE,经 NOT 函数后变为 TRUE,这 就意味着当按钮状态不变时, 循环继续执行, 相反一旦按钮动作, 则循环终止。在 6i 版本中这个设置可以简化,不必使用 NOT 函 数,直接将[STOP]按钮与循环条件端子相连,然后用鼠标右键点 击循环条件端子,选择 stop if true 即可。结果如右图所示。 7.返回前面板并运行 VI。在输入簇中输入不同的值观察输出。 8.关闭并保存程序。Cluster Exercise.vi 练习 3-4 结束
3.5.3 用名称捆绑与分解簇 有时你并不需要汇集或分解整个簇,而仅仅需要对其一、两个元素操作。这时你可以用 名称来捆绑与分解簇。在 Cluster 工具模板中除了 Bundle 及 Unbundle 功能外,还提供有 Bundle By Name 和 Unbundle By Name 功能。它们允许根据元素的名称(而不是其位置)来 查询元素。 Bundle 不同, 与 使用 Bundle By Name 可以访问你需要的元素, 但不能创建新簇; 它只能重置一个已经存在的簇的元素,同时你必须给 Bundle By Name 图标中间的输入端子 一个输入以申明要替换其元素的簇。Unbundle 可返回指定名称的簇元素,不必考虑簇的序 和大小。例如,如果你想重置上例中 Boolean 2 的值,就可以使用 Bundle By Name 功能而 不必担心簇的序和大小。 与此类似如果你要访问串的值, 可以使用 Unbundle By Name 功能。
Cluster Control Numeric 0.00 String TSINGHUA String Control ABCD Output Element Numeric 0.00 String ABCD Cluster Control String Control String Output Element
图3-11
用名称操作簇
在上面的例子中,Cluster Control 中有两个元素,一个是数据类型(名称是 Numeric) , 另一个是字符串型(名称是 String) ,另一个控制是字符串“ABCD” ,框图如右所示,运行 该程序,即可将簇内的字符串值重置。 (本例中为了使 Bundle By Name 的输入端由 Numeric 变为 String,需使用快速菜单中的 Select Item 项操作。 ) 3.5.4 数组和簇的互换 有时你会发现,将数组变为簇(或者相反)很方便。尤其是因为 LabVIEW 包括的关于 数组的操作功能多于簇。例如,前面板上有一个多按钮的簇,你希望颠倒这些按钮值的序。 好了,Reverse 1D Array 功能正好可用,但是它仅可用于数组。这没关系,你可以使用功 能 Cluster to Array 将簇转换为数组, 使用 Reverse 1D Array 切换开关的值, 最后再利用 Array
to Claster 变换回簇。
3.6 Waveform 数据类型 在数据采集和信号分析中经常要遇到波形数据,在 LabVIEW 6i 中增加了 Waveform 数 据类型, 使得波形的描述更加简洁。 Waveform 数据类型包含了波形的数据(Y)、 起始时刻(t0) 和步长ΔX,使用 Waveform 模板的 Build Waveform 函数可以建立一个波形。许多用于数 据采集和波形分析的 VI 和函数的缺省状态都接受或返回 Waveform 数据类型。当你将一个 Waveform 数据类型连接到 Waveform Graph 或 Chart 时,会自动画出相应的曲线。Waveform 数据类型是根据原有的数据类型进一步“打包”组合而成,这种打包也不可避免地带来一些 负作用,有时还需要对 Waveform 数据类型“解包” 。有关这一数据类型的函数或 VI 在 Functions? Waveform 和 Analyze 之中。
图3-12 使用 Waveform 的波形发生例子 图3-12是一个使用 Waveform 函数产生正弦波的例子。其中仅仅调用了 Sine Waveform 一个函数,只要将有关参数指定,就可产生正弦波。Sine Waveform 实际上是一个 子 VI,点击其图标,就可看到下层的程序,还是比较复杂的。在 LabVIEW 6I 以前的版本中 用户就需要那样去编程。
4.1 概述 图形显示对于虚拟仪器面板设计是一个重要的内容。 LabVIEW 为此提供了丰富的功能。 在前面几章我们已经接触了这个问题,现在较系统地介绍一下。 我们不从图形的实现方法上去讨论问题,那是计算机图形学的课题。但我们需要从用户 的可能的需求角度探求一下, 如果你需要做虚拟仪器方面的开发, 那么可能遇到些什么图形 问题。LabVIEW 在这方面所做的工作是非常值得借鉴的。 在 LabVIEW 的图形显示功能中 Graph 和 Chart 是两个基本的概念。一般说来 Chart 是 将数据源(例如采集得到的数据)在某一坐标系中,实时、逐点地显示出来,它可以反映被 测物理量的变化趋势,例如显示一个实时变化的波形或曲线,传统的模拟示波器、波形记录 仪就是这样。 Graph 则是对已采集数据进行事后处理的结果。 而 它先将被采集数据存放在一 个数组之中,然后根据需要组织成所需的图形显示出来。它的缺点是没有实时显示,但是它 的表现形式要丰富得多。例如采集了一个波形后,经处理可以显示出其频谱图。现在,数字 示波器也可以具备类似 Graph 的显示功能。 LabVIEW 的 Graph 子模板中有许多可供选用的控件,其中常用的见下表: Chart * * Graph * * * * * * *
Waveform(波形) XY Intensity(强度图) Digital(数字图) 3D Surface(三维曲面) 3D Parametric(三维参变量) 3D Curve(三维曲线)
由表中可以看出, Chart 方式尽管能实时、 直接地显示结果, 但其表现形式有限, Graph 而 方式表现形式要远为丰富,但这是以牺牲实时为代价的。在 LabVIEW 6i 版本中还包含有 极坐标等其他图形(Plot) ,本章不讨论。 4.2 Graph 控件 各种图形都提供了相应的控件,以 Graph 为例介绍。图4-1所示为它的控件。所有这 些控件都包含在图形快速菜单的 Visible Items 选项下。 曲线图例可用来设置曲线的各种属性,包括线型(实线、虚线、点划线等) 、线粗细、 颜色以及数据点的形状等。 图形模板可用来对曲线进行操作,包括移动、对感兴趣的区域放大和缩小等。 光标图例可用来设置光标、移动光标,帮助你用光标直接从曲线上读取感兴趣的数据。 刻度图例用来设置坐标刻度的数据格式、类型(普通坐标或对数坐标) ,坐标轴名称以 及刻度栅格的颜色等。
标签(Label)
说明 (Caption)
图形模板 (Graph Palette) 刻度图例 (Scale Legend) 光标图例 (Cursor Legend)
Graph 的图形控件
4.3 Chart 的独有控件 Chart 的数据并没有事先存在一个数组中, 它是实时显示的, 为了能够看到先前的数据, Chart 控件内部含有一个显示缓冲器,其中保留了一些历史数据。这个缓冲器按照先进先出 的原则管理,其最大容量是 1024 个数据点。 滚动条(Scrollbar) 它直接对应于显示缓冲器,通过它可以前后观察缓冲器内任何位置的数据。
数据显示(Digital Display) 选中它, 可以在图形右上角出现一个数字显示器, 这样可以在画出曲线的同时显示当前 最新的一个数据值。 刷新模式(Update Mode) Chart 提供了三种画面的刷新模式,分别是 Strip Chart Mode (条壮图) 它与纸带式图表记录仪类似。 : 曲线从左到右连续绘制, 当新的数据点到达右部边界时,先前的数据点逐次左移。 Scope Chart Mode(示波器模式) :它与示波器类似。曲线从左到右连续绘制,当新 的数据点到达右部边界时,清屏刷新,从左边开始新的绘制。它的速度较快。 Sweep Chart Mode(扫描模式) :与示波器模式的不同在于当新的数据点到达右部 边界时,不清屏,而是在最左边出现一条垂直扫描线,以它为分界线,将原有曲线
逐点向右推,同时在左边画出新的数据点。如此循环下去。 堆叠式图区(Stack Plots) 在相同的纵坐标下, 由于各种测量信号的差异, 将几条曲线显示在同一个图区有困难时, 可以组织出一种纵坐标相同,而有各自横坐标的堆叠式图区。 打开\LabVIEW\Examples\Graphs\chart.lib 目录的 Charts.vi,那里提供了有关 Chart 的各 种形态的例子,以及堆叠式图区的例子 练习 4-1 Chart 和 Graph 的比较 目的: 创建一个 VI, Chart 和 Graph 分别显示 40 个随机数产生的曲线, 用 比较程序的差别。 前面板及流程图如下
40 Waveform Chart Waveform Graph
Chart 和 Graph 的比较
显示的运行结果是一样的。但实现方法和过程不同。在流程图中可以看出,Chart 产生 在循环内,每得到一个数据点,就立刻显示一个。而 Graph 在循环之外,40 个数都产生之 后,跳出循环,然后一次显示出整个数据曲线。从运行过程可以清楚地看到这一点。 值得注意的还有 For 循环执行 40 次,产生的 40 个数据存储在一个数组中,这个数组创 建于 For 循环的边界上(使用自动索引功能) 。在 For 循环结束之后,该数组就将被传送到 外面的 Graph。仔细看流程图,穿过循环边界的连线在内、外两侧粗细不同,内侧表示浮点 数,外侧表示数组。 练习 4-1 结束 4.4 XY 图形控件(XY Graph) 波形图(Waveform Graph)有一个特征,其 X 是测量点序号、时间间隔等,Y 是测量 数据值。但是它并不适合描述一般的 Y 值随 X 值变化曲线。适合于这种情况的控件是 XY Graph。我们通过一个构成利萨育图形的例子来看一下它的使用。我们知道如果控制 XY 方 向的两个数组分别按正弦规律变化(假设其幅值、频率都相同) ,如果它们的相位相同,则
利萨育图形是一条 45 度的斜线,当它们之间相位差 90 度时为圆,其他相位差是椭圆。 练习4-2 利用 XY Graph 构成利萨育图形。
利用 XY Graph 构成利萨育图形
面板和框图如图4-3所示。 面板上除了一个 XY Graph 外, 还有一个相位差输入控件。 在框图中使用了两个 Sine Waveform.vi,第一个所有输入参数(包括频率、幅值、相位等) 都使用缺省值,所以其初始相位为0。第二个将其初始相位作为一个控件引到面板上。它们 的输出是包括 t0、dt 和 Y 值的簇,但是对于 XY Graph 只需要其中的 Y 数组,因此使用波 形函数中的 Get Waveform Components 函数分别提取出各自的 Y 数组, 然后再将他们捆绑在 一起,连接到 XY Graph 就可以了。当相位置为 45 度时,运行程序,得到如图所示的椭圆。 练习 4-2 结束 4.5 强度图形控件(Intensity Graph) 强度图形控件提供了一种在二维平面上表现三维数据的方法。 例如可以用屏幕色彩的亮 度来反映来反映一个二维数组元素值的大小。 图4-3就是这样的一个例子。 注意图中的 x、 y 轴刻度对应的是数组行、列的序号。
用强度图形表现一个二维数组及其元素值的大小
4.6 数字波形图控件(Digital Waveform Graph) 该控件的例子见图4-5。面板上有一个输入控制,共输入了7个十进制数,还有一个 二进制显示对象,显示了这些十进制数对应的二进制数,最右边是一个 Digital Waveform Graph。注意这个图中数据应当从纵方向读出,在横坐标上的刻度是数据的序号(0到6) , 其中最后一个数的序号是6,纵坐标从下向上读是 ,第一个数的序号是0,其值从 上向下读是 ,而第二个数(序号1)是 。
X0 0.00 DeltaX 1.0 输入数据 Digital Waveform Graph
二进制显示 Number of Ports 1
数字波形图控件的例图
该程序的框图中值得注意的问题有以下几点: 十进制数可以直接送给 Digital Waveform Graph,不必事先转化为二进制数。 在送给 Digital Waveform Graph 之前,需要经过一个捆绑(bundle 函数) 。 捆绑的顺序是 x0、deltx 、输入数据,最后是 Number of Ports。这里的 Number of Ports 将反映二进制的位数或字长,为1时是8位,为2时变为16位,余类推。
3D 图形显示控件(3D Graph)
字符串和文件 I/O
5.1 字符串 字符串是 ASCII 字符的集合。如同其他语言一样,LabVIEW 也提供了各种处理字符串的 功能,如果想获得字符串的例子,可查看 Examples\General\strings.llb。下面扼要介绍 一些内容。 创建字符串控制对象和显示对象 可以在 Controls?String & Table 中看到右边 所显示字符串控制对象和显示对象。还可以使用操 作工具或者标签工具输入或者改变字符串控制对象 中的文本。 用移位工具拖曳字符串控制对象和显示对象的边角可 以增大它们的面积。
字符串control 在这里输入文本
练习 5-1 组合字符串 目的: 使用一些字符串功能函数将一个数值转换成字符串, 并把该字符串和其他一些字符串 连接起来组成一个新的输出字符串。 前面板 打开一个新的前面板,按照下图向其中添加对象。
Header SET Number 5.50 Trailer VOLTS 输出串长度 16 输出字符串 SET 5.5000 VOLTS
其中的两个字符串控制对象和数值控制对象可以合并成一个输出字符串并显示在字符 串显示器中。数值显示器显示出字符串的长度。 本练习中输出字符串是一个 GPIB(IEEE 488)命令字符串,它可用来与和串口仪器 (RS-232 或者 RS-422)进行通信。 流程图
Header %s %.4f %s 输出字符串
输出串长度
Format Into String 函数(Functions?String)――在本练习中,它用于对 数值和字符串进行格式化,使它们成为一个输出字符串。用变形工具可 以添加三个加和输入。 String Length 函数(Functions?String)――在本练习中,它用于返回一 个字符串的字节数 执行该 VI。注意,Format Into String 功能函数将两个字符串控制对象和数值控制对象 组合成一个输出字符串。 把该 VI 保存为 Build String.vi,在下一个练习中还将用到这个 VI。 字符串格式的设定:选中 Format Into String 函数,单击右键,在快速菜单中选择 Edit Format String,可分别对个输入的各部分格式做设定。 练习 5-1 结束。 练习 5-2 字符串子集和数值的提取 目的:创建一个字符串的子集,其中含有某个数值的字符串显示,再将它转换成数值。 打开 Examples\General\strings.llb 中的 Parse String.vi。用默认输入值执行该 VI。注意, DC 的字符串子集被用于输入字符串。还要注意,字符串的数值部分被提取出来,并转换为 数值。您可以尝试使用不同的控制数值(记住数组式的字符串是从 0 开始进行编号) ,或者 您可以返回到流程图,查看怎样从输入字符串中提取出其中的元素。
String Subset 函数(Functions?String)――在本练习中,它用于返回偏移地址开始 的子字符串以及字节数。第一个偏移地址是 0。 很多情况下, 必须把字符串转换成数值, 例如需要将从仪器中得到的数据字符串转}

我要回帖

更多关于 美容仪器外观设计公司 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信