从毕业设计开始,学习 labview已经将近一年;没有过多涉及NI硬件数采、信号处理等方面的知识,主要集中于Func tions/Programming下的软件设计方法。LabVIEW对某一工程实际问题的快速实现着实令人称奇,对于软件开发背景不太深厚的工程师们,LabVIEW绝然是第一选择。
一、G语言与T语言的对比 G语言编程和T(Text)语言编程是截然不同的。 1、线程和内存空间 Windows平台下,无论面向对象还是面向过程的高级程序设计语言,编译结束后都是差不多的机器代码由Windows负责加载执行。可见,T语言在运行时的核心概念有二,线程以及内存空间。因此,在编写T语言程序时,程序员自觉不自觉的都会在心里默默先画一个竖条,然后给若干PC指针,规划自己的应用程序执行。 LabVIEW提供了同步线程的几个机制,也提供了几种优化内存使用的函数;但实质上,在LabVIEW的技术文档中并不能找到对应的概念,而这些繁琐的事情被LabVIEW所抽象以及托管——可能这才是整个LabVIEW系统中最核心的技术。所谓成也萧何败也萧何。LabVIEW为用户消灭掉“线程”和“内存”的概念后,使得用户完全失去了对这两者的控制,进而用户不能有效优化代码,降低了LabVIEW程序运行的效率和灵活性。比如,你不能直接结束一个正在运行着的While循环,因为你不知道它在哪个线程中,同时,LabVIEW环境也没有线程的概念。再比如LabVIEW可能最受人诟病的数据拷贝,让你极其怀念T语言中的变量名,因为LabVIEW环境中,根本不存在内存地址的概念。 2、变量 本质上,变量是内存中的某段数据,而变量名为这段数据的地址。T语言中的变量无需介绍,而其地位也是毋庸置疑的。关键讨论一下LabVIEW中的变量。 由于LabVIEW环境中,内存管理对用户不可见,所以,LabVIEW中实质上是没有变量概念的。很多人认为输入、输出控件是LabVIEW中的变量,其实,这是不正确的。控件是LabVIEW环境中单纯存储数据的一个对象而且是拥有图形显示的对象,每当你从控件中读取、写入数据时,其实是在跟这个对象 通信而获取其中的存储的数据。可能LabVIEW工程师为提高效率会在后台把数据的引用或地址送给申请者,但无论如何这一过程与直接使用变量名读取内存数据是完全不同的。如果注意到,在数据流线分支时,LabVIEW会复制一份数据到新的分支线上。而之后对两条数据线的操作是互补干扰的。仔细想下,LabVIEW中的变量其实是数据流线!分支时,LabVIEW申请新的内存空间,然后拷贝分支数据,之后再将该内存数据传递到下一个处理单元。之所以还说LabVIEW中没有变量,是因为你永远也得不到处理数据流线任何引用!(VI Script亦无能为力) 所以,LabVIEW中如何引用数据就会首先成为众多刚入门开发者迷失的地方。 3、小结 由LabVIEW实现的G语言完全把T语言中赖以自豪的核心概念线程以及内存空间封装,使的编程不再特别依赖专业的基础计算机知识。也就是说,如何让程序实际的在计算机上跑不再是开发者的问题,而完全交付LabVIEW处理;用户唯一需要关心的仅仅是如何实现算法。 任何事物都有一个发展的过程,对于LabVIEW,我们亦不能强求。从8.5到9.0,不断的看到NI在程序设计方面所给我们的惊喜,多核优化、支持递归、允许数据引用等等。相信他们才华横溢的工程师能够最终解决G语言基本原则(掩盖任何具体的计算机实现,使用户只关心算法实现)和效率之间的矛盾。使LabVIEW成为易用以及高效的程序设计语言。
二、LabVIEW编程思想 LabVIEW没有语法,因为用户无法创造给定有意义图形外的任何其他图形。也就是说,Case结构怎么画,用户没有发言权,同时也不可能改变。那么,LabVIEW就完全没有必要告诉你Case结构应该怎么画。 1、LabVIEW程序的程序结构 C语言的程序结构是Main函数+其他函数,而LabVIEW的程序结构是子VI。即使如今LabVIEW已经引入面向对象的编程方法,但是,一个LabVIEW程序仍然是由至少一个的子VI所构成。这与C语言的结构非常相似,不同仅仅在于,LabVIEW并不强制某个子Vi首先运行。 程序结构是某个编程语言组织代码最基本的方式。C语言中使用函数组织代码,Dephi同时使用函数和过程组织代码,QBasic几乎不组织代码(Goto 太强大);而面向对象的程序设计语言,之所以提出的第一个原因便是这样组织代码更加高效。LabVIEW中组织代码的方式是子Vi,而子Vi称为LabVIEW的程序结构。程序结构的概念要和软件架构的概念区别开来。 2、LabVIEW程序的软件架构 状态机、事件驱动甚至面向对象。软件架构是表示程序逻辑结构的概念,是程序运行的哲学。软件架构不依赖任何具体的程序结构而总能被搭建。也就是说,某种程序开发语言总能试图实现某种给定的软件架构,试图实现某种程序运行逻辑,试图实践开发者的哲学。在新建VI对话框中,NI公司提供了几种最常见的软件架构方式:状态机、事件驱动等等。 正如前文所提到的,LabVIEW本身是没有任何软件架构所言的,而LabVIEW仅仅是实现某种架构思想具体的一种编程语言。LabVIEW就像一张白纸,你可以尽情发挥,实现你的程序执行哲学。 3、小结 LabVIEW没有复杂的语法需要学习,但要求你要注意到它是以子vi为组织代码的基本单位。构造不同地位的子Vi,而最终能搭建几乎任何你可以想象到的软件架构方式。学习LabVIEW的编程思想,其实更多的是学习已有的程序设计思想,然后落实到LabVIEW中。
三、学习LabVIEW 刚刚接触LabVIEW总有一种看着空白的BlockDiagram不知道该从什么地方下手的感觉。然后拖着横纵拉条到处跑,感慨,这么大的空白,怎么办!个人认为,虽然不断和T语言对比对学习LabVIEW以及加深对G语言理解意义非凡,但试图凭着T语言的编写经验而直接运用于G语言是不现实的。程序设计思想可以借鉴,但是程序编写技术完全是一门新的课程。注意G语言中提出的各种基本概念是学习LabVIEW最有效的方法。 1、不知道该如何下手。 看着空白的,或者别人的编写的大体积vi,新手总会感觉到丈二和尚摸不着头脑。其实之所以不知如何下手,是因为对LabVIEW语言的执行方式尚不了解以及掌握。T语言的执行方式是按着行号,一条一条执行的;而G语言中消灭了行号的概念,却引入输入控件、数据流线、输出控件以及特殊的多线程执行方式。解决如何下手的问题,唯一需要使初学者明白的是LabVIEW程序从何处开始执行,顺藤摸瓜,自然而然便熟悉G语言的执行方式。 数据流线总是从输入控件始,到输出控件止;这也就是说,LabVIEW程序总是从输入控件开始,沿着数据流线,按顺序执行遇到的任何对象,最终结束于输出控件;进一步,数据流线的开始不一定是输入控件,而数据流线的结束也不一定是输出控件。这样,下手的地方就是数据流线开始的地方。LabVIEW中的多线程执行方式是很有意思的,我们可以通过激活Highlight Execute按钮观察:某个图形(函数、框图等等)之所以开始执行,是因为其所需的所有输入端均有数据流入。 LabVIEW是流动的语言,抓住数据开始流出的一点,便能了解整个程序的运行走向;而开发LabVIEW程序也是从数据源头开始,一步一步推动数据向前流动。 2、Programming/Structures与String、Array、Boolean、Numeric、Cluster等等 个人认为熟悉如何下手后,应该学习如何使用Programming/Structures中的所有结构。程序流程控制是实现任何算法的基础,也是计算机之所以智能的原因。另外,个人认为,好的LabVIEW程序也应该是分相执行的,也就是所有操作不要一条数据流线到底,适当的打断数据流线,异步的完成一些操作。比如,串口的使用。一般,初始化,发送命令、接收数据、撤销引用都是一条到底的。这不是很好的串口使用方案,不够灵活;我们可以把所有操作都放入一个事件循环中,每次只做一件事情。这样,编写的程序就能够动态的改变串口端口引用,以及随时发送想要的数据。 紧接着Structures是Array、String、Boolean、Numeric、Cluster(Class、Variant)这五位是LabVIEW程序设计中的“米”。任何复杂的程序均建立的它们之上。他们是LabVIEW中可能出现的所有数据类型。 数据以及程序流程控制是LabVIEW程序开发的基石。不妨多花些时间,多读读文档,多练练手。 3、通讯机制 LabVIEW中提供了丰富的通讯机制,这里就不赘述了。这些手段亦是搭建大型LabVIEW程序的必修课。需要说明的一点是:LabVIEW程序中的各种引用的使用空间是很广泛的,你可以在一个VI中创建某个引用而传递到另一个VI中时依然有效。使用引用通信是一种很高效的方案。比如传递某个控件的引用到其他VI中作为通讯用时,一方面,对方可以直接写入数据,而无需多余的数据传递,也无需其Vi的结束而获得数据;另一方面,当这一引用数据流线在某处分支时,虽然引用数据依然被复制一次,但所对应的数据控件却没有改变,添加合适的同步机制,是一种很好的共享数据访问方案,因为任何地方对共享数据的修改都一定是有效的。(PS,LabVIEW中的类却没有采用这样的设计方法) 4、小结 之后便逐步扩展到Programming中的其他子目录。可以研究一些诸如互操作性的问题,等等。LabVIEW是一门学习成本极小、功能强大的程序设计语言极其开发系统。一般而言,学习LabVIEW半年以上,便小有成就。和其他所有程序语言的学习一样,思考与实践并重是最好的学习方法。
四、建议 写一本大小通吃的书是很难的事情;既照顾初学者、又不侮辱高级开发者智商便更难。但作为介绍LabVIEW编程思想方面的书籍,完整的论述对比G语言与T语言的不同相同,G语言的逻辑是很有必要的。虽然讨论这些话题其实是可以抛开LabVIEW的,但,这部分理论却有着极强的实战性。然而,既然称为LabVIEW编程思想,那么书籍的主干应该是具体讨论几种不同的LabVIEW软件架构思想、实现以及优略。最后,一些有用的编程技巧亦是编程思想中不可或缺的部分。
|