第1章 绪论

1.1 虚拟仪器与LabVIEW

21世纪以来,电子技术、计算机技术和信息技术突飞猛进,各种测试、测量和自动化系统也因此得到了长足发展。作为提高生产力的重要手段之一,这些系统在科研与生产中充当着非同寻常的重要角色。然而,随着商业社会竞争日益加剧以及经济飞速发展,人们对自动化系统的功能和开发周期提出了更高的要求。一方面,要求系统开发者在非常短的工期内完成项目成果交付;另一方面,又要求所设计的自动化系统尽可能成本低、性能高、扩展性强并可实现无缝集成。这就迫使工程人员不断寻求新的技术和理念,通过创新来进一步提高开发效率,虚拟仪器(Virtual Instruments)应运而生。

虚拟仪器是指利用计算机把高性能模块化硬件(如A/D转换器、D/A转换器、数字输入/输出、定时和信号处理)和灵活可定制的软件(如数据分析软件、数学计算软件、通信软件及仪器界面等)结合起来完成各种测试、测量和自动化的应用(图1-1)。传统的、基于硬件的仪器或自动化系统一般由硬件电路实现自动化系统中的数据采集、信号处理、结果显示及仪器控制等功能。而虚拟仪器则一般基于计算机,综合灵活可定制的软件、传感器和运动控制模块来取代传统仪器或自动化系统的功能。

图1-1 虚拟仪器系统

虚拟仪器是一种全新的仪器概念,通常由硬件设备与接口、设备驱动、数据处理软件和虚拟仪器面板组成。其中,硬件设备与接口可以是各种以计算机为基础的内置功能插卡、通用接口总线接口卡、串行口、VXI总线仪器接口等设备,或者是其他各种可程控的外置测试、运动控制设备。设备驱动软件是直接控制各种硬件接口的驱动程序,虚拟仪器通过底层设备驱动软件与真实的仪器系统进行数据交换,经数据处理软件处理后的数据以虚拟仪器面板的形式在计算机屏幕上显示为类似真实仪器面板的显示元件。用户用鼠标操作虚拟仪器的面板上的各种控件来控制外部硬件设备,就如同操作真实仪器一样真实、方便。

软件代替大量硬件是虚拟仪器系统最主要的特色,这一突破不仅允许基于虚拟仪器的系统可使用计算机取代以往昂贵的硬件模块来降低系统成本、提高系统性能,还可以使用户通过对软件的定制或更新来快速、灵活地对系统进行变更或扩展。计算机可以通过不同的接口硬件(ISA、PCI、 PXI、PCMCIA、USB、GPIB、IEEE 1394,串口和并口等)将多种设备无缝集成至系统。由于虚拟仪器的工作过程完全受控于软件,仪器功能的实现在很大程度上取决于软件的功能设计,因此用户可以自由地定义仪器的功能,用一套虚拟仪器硬件来实现多种不同仪器的功能。当然,为了快速可靠地开发各种虚拟仪器,一套优秀的虚拟仪器软件开发平台是必不可少的。

进行虚拟仪器开发的语言和工具很多。传统基于文本的开发语言有C/C++、Python、Java、C#、Basic等;基于文本语言编程的开发工具有Visual Studio(VC++/VB/VC#等)、Qt、Eclipse、Borland C++/Delphi、NetBeans以及Linux平台下的GCC和Gnome/GTK库等。但是这些软件多为通用的开发软件,面向多个行业,并不提供规范的虚拟仪器开发元件库和仪器设备驱动集。如果开发任务集中在自动化测控领域,使用它们往往需要从头开发各种虚拟仪器软件模块和硬件驱动,这就如同从每个螺丝钉开始造汽车一样,开发周期长,成本也高。

在实际开发虚拟仪器系统时,我们往往选择提供规范的虚拟仪器开发元件库和仪器设备驱动集的开发工具。比较典型的有美国国家仪器公司(National Instruments,2020年更名为NI)的LabVIEW、LabWindows CVI和安捷伦科技公司(Agilent Technologies)的HP VEE(Visual Engineering Environment)等。其中LabWindows CVI为支持C语言的虚拟仪器开发工具。LabVIEW和HP VEE虽然均为图形化编程语言(Graphical Programming Language,简称G语言)的开发工具,但是HP VEE却主要支持安捷伦公司自己的仪器,相对而言LabVIEW支持的仪器更广泛。此外根据2015年EE Times和EDN杂志对测试、测量和仪器控制领域各类开发环境的使用情况统计(图1-2)来看,LabVIEW的使用最为广泛,它所支持的图形化编程语言也因此成为虚拟仪器项目开发的首选编程语言。此外,近年来,随着各种官方功能模块和第三方扩展模块的不断发布,LabVIEW不仅继续保持虚拟仪器开发平台的首要位置,也逐渐向完善的集成开发环境编程方向发展。

LabVIEW(Laboratory Virtual Instrumentation Engineering Workbench)是NI公司为测试、测量和控制应用而设计的可视化、跨平台(可在Windows、Linux、macOS上运行)系统工程软件。它使用图形化的程序设计语言代替文本行代码来创建应用程序,并可以快速访问和控制硬件和数据信息。传统文本编程语言根据语句和指令的先后顺序决定程序执行顺序,而LabVIEW程序的执行顺序则由程序框图中节点之间的数据流向决定,即数据流驱动(Data Flow Driven)。开发人员使用图标化的函数和数据连线,依据数据流逻辑来开发复杂的测量、测试和控制系统。LabVIEW广泛支持各种仪器硬件的驱动,包含大量内置和扩展的函数库(如数据采集、信号处理、数学计算、统计分析、图像处理、机器视觉、运动控制、数据通信、数据库、报表生成、移动开发、嵌入式开发等),并且都形象地表现为图形化编程语言函数。图1-3显示了LabVIEW图形化设计平台结构。

利用LabVIEW既能集成数千款硬件设备,也能通过直接使用大量内置库实现高级分析和数据处理。这就使开发人员不必从头开发各种处理函数,甚至不必关心处理函数内部的具体细节,从而大大缩减了系统开发时间,并使开发人员能专注于整个系统功能的研究,而不是在可重用的函数开发上浪费时间。此外,由于LabVIEW为编译型(并非解释型)开发工具,其生成的程序执行效率并不输于一般的文本编程开发工具,因此自1986年推出以来,就被广泛地应用于数据采集、仪器控制、工业自动化、航空航天和科学研究等领域。

图1-2 测试、测量和仪器控制领域常用软件的统计结果

图1-3 LabVIEW图形化设计平台结构

狭义来说,LabVIEW程序可以被称为虚拟仪器,因此通常我们把LabVIEW程序称作VI(Virtual Instruments)。每个VI由三部分组成(图1-4):

图1-4 由前面板、程序图和输入/输出端子组成的虚拟仪器

(1)前面板(Front Panel):即用户界面。

(2)程序框图(Diagram Block,又称后面板):定义VI功能的图形化源代码。

(3)图标和输入/输出接口端子(Icon & Connectors):用来定义VI的输入/输出参数(接口),以便VI可以被其他VI当作子VI(SubVI,相当于文本编程语言中的子程序)调用。

前面板由输入控件(Controls)和显示控件(Indicator)组成。这些控件是VI的输入/输出接口。输入控件有旋钮、按钮、转盘等。显示控件有图表、指示灯等。输入控件模拟仪器的输入装置,为VI的程序框图提供数据。显示控件模拟仪器的输出装置,用以显示程序框图获取或生成的数据。

前面板创建完毕,便可使用图形化的函数添加源代码来控制前面板上的对象。前面板上的对象在程序框图中显示为接线端(Terminal),接线端表示输入控件和显示控件的数据类型。开发人员将对数据操作的函数图标添加到程序框图上,并使用循环和条件结构控制程序的执行方式,使用连线控制程序框图中对象的数据传输来实现虚拟仪器的功能。这种基于图标和连线的开发语言称为图形化开发语言(G语言)。在G语言代码中,每个功能块通过连接到输入/输出端子的连线连接,只有当每个功能块需要的输入数据(变量)全部到达后,该功能块才能被执行,因而程序中各功能块的执行顺序受数据驱动。

当VI作为子VI(SubVI,类似子程序)被其他VI调用时,将以图标形式显示在主VI的后面板中,子VI的输入/输出通过其前面板中的部分输入控件(对应输入参数)和显示控件(对应输出参数)与其连接端子的一一对应来确定。也就是说每个子VI均可在单独进行调试后再被嵌入主VI。

此外,由于程序中的数据可能同时到达多个并行放置的功能块,因此数据驱动原理与生俱来就支持并行运行。当然多进程和多线程执行还是要受操作系统的调度。总的来说,使用LabVIEW可以非常快速地构建虚拟仪器系统,本章后续章节,先介绍如何基于LabVIEW搭建虚拟仪器项目的开发环境,然后以一个简单的实例,简要介绍虚拟仪器的开发和调试过程,使读者对基于LabVIEW的虚拟仪器项目开发过程有一个比较初步的概念。