Qizhen's profileLabVIEWPhotosBlogListsMore Tools Help

Blog


    G 语言

        G 语言是图形化编程语言(Graphical Programing Language)的缩写。LabVIEW 有的时候也被叫做 G 语言。我们可以这样理解:LabVIEW 是一个开发环境(类似的如 Visual Studio 也是一个开发环境),在这个环境下编写的代码就是 G 语言代码(类似的如在 Visual Studio 下写出的C代码)。

        目前在中国,很多工程师认为 LabVIEW 是一个应用在工业测控领域的应用软件,并不理解他是一个编程语言。原因有两个,首先是因为它和以往其它的编程语言差距太大,第一次看到它的人倒是更容易联想到电路板布线、工业总线配置软件等;其次是因为 LabVIEW 在中国使用的年头不多,大多数用户仅用到了 LabVIEW 的一小部分功能,还没有真正体验到 LabVIEW 的强大。
        既然是一门编程语言,在使用 LabVIEW 的时候,就应该按照程序设计的思想来解决问题。举一个例子来说明如果用程序设计的思想来解决问题:

        我们需要解决的问题是求两个正整数的最大公约数,这是一个非常常见的编程例子。
        用 LabVIEW 来解决这个问题,应当与用其他语言求解这个问体的思路是一致的。按照程序设计的一般方法,解决这个问题可以三个步骤:

        第一:确定问题的需求,给出需求的详细说明。对于这个求最大公约数的问题,我们在这一步需要做的就是写出程序输入输出的详细定义。如果是用普通的文本语言编程,你至少应该以文档的方式吧问题需求记录下来。但是 LabVIEW 程序员在这一步有个更方便的设计方法——直接在 VI 的前面板上定义程序输入输出:程序需要两个输入值(a, b),用 Numeric control 代表,一个输出(x)用 indicator 代表。输入要求是正整数,我们可以把 Numeric control 的数据类型设置为 U32,并在这个控件的属性中设置最小值为1。再为 VI 和它每个控件添加上帮助信息,VI 的前面板就可以用户提供一个详细的 VI 的功能描述以及接口定义。

        第二:设计解决问题的算法。一个问题通常不只会有一种解决方法(算法),比如说我们的求最大公约数问题,你可以采用穷举算法,把1到a之间所有的整数都试一遍,然后找到那个最大的公约数;也可以使用g.c.d.算法
        多数情况下这一步骤和具体的语言环境无关,比如说我们的问题不论采用哪种语言编写,g.c.d.算法的效率都高于穷举法。但是某些时候可能要考虑 G 语言不同与文本语言的特性,在 G 语言下使用不同于其他语言的算法。比如要遍历一棵树,可以使用递归的算法,也可以使用循环的算法。在C语言下,一般会选择递归的算法,因为递归算法的思维方式更自然,更容易掌握,实现起来也比较方便;但是在 G 语言下,递归的实现并不那么容易,效率也比较低,所以在 G 语言中,选择循环的算法更加适合。
        对于我们要解决求最大公约数问题,我们还是选用g.c.d.算法,它的运算过程如下:
            Step1: If (a mod b == 0) goto Step3; else goto Step2;
            Step2: (a, b) = (b, a mod b); goto Step1;
            Step3: x=a; return;

        第三:在 LabVIEW 下实现设计好的算法。G 语言之所以被称之为图形化的编程语言,并不仅仅是因为它的程序又图形化的界面(前面板),最本质的原因是因为它的代码也是通过画图的方式来编写的(程序框图)。
        针对本例,可以使用 while 循环,a 和 b 分别用循环上的两对移位寄存器表示。在循环体内首先判断 a 是否被 b 整除,如果是,结束循环;否则把 b 和 a mod b 赋给两个移位寄存器,进入下一次循环。

        图形化编程语言是数据流驱动(以后再解释)的,与一般文本编程语言的过程驱动机制有很大差别,因而在程序设计的思路上也与文本编程语言有所区别。尤其是有过文本编程经验的程序员开始使用 LabVIEW 的时候,会感觉 LabVIEW 缺失了很多文本语言常用的功能,比如使用局部变量、跳出循环等等,因而 LabVIEW 用起来不是太方便。另外 LabVIEW 编写出来的的代码连线乱七八糟,造成程序阅读和维护的困难。不过这些问题其实不能算是 LabVIEW 本身的问题,主要是由于编程者还没有掌握 G 语言的编程思想造成的。
        LabVIEW 虽然不能覆盖所有文本语言的优点,但它具有自己的特色。在编写与工业领域设计、测量、控制等相关的程序或系统时,其开发效率大大高于其它语言。
        在 LabVIEW 中可以为代码添加图文并茂的注释,再加上人类对图形的识别速度远远超过对文本的分析速度,一个优秀程序员编写的 G 语言代码的可读性要高于文本语言一个层次。

    相关文章:
        我和 LabVIEW

    编辑

    Comments (5)

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    Picture of Anonymous
    冯元幸 wrote:
    您好,得到您的指点非常高兴。
    我们的平台其实都是ivi驱动,但是不能直接用labview.我想我们新的平台可能会用labview.
    谢谢,有什么问题我还会麻烦您的。
    从您这儿得到了答案,真好。
    Apr. 25
    善在琳心wrote:
    看您的文章受益匪浅,请问可以再写写您对G语言编程思想的理解吗?
    我现在也正在用LabVIEW编程,但是很多时候想问题还是文本语言的想法,然后再转成LabVIEW的思想来实现功能的,感觉有些不对!
    Apr. 18
    Qizhen Ruanwrote:
    把 VI 编译成 DLL,我在 LabVIEW 7 下没有做过这件事情,所以不能肯定。但是 LabVIEW 8.2 我是用过的,多个 VI 可以编译在同一个 DLL 内,每个 VI 为一个被包装成一个外部函数。既然你们买了 8.2,还是用 8.2 吧。
    NI DAQ 我也没有太用过,他们提供的驱动主要是针对 LabVIEW 的,在LabVIEW下使用会比在其他语言下使用方便的多。你们的整个系统软件为什么不用 LabVIEW 开发呢?
     
    Apr. 16
    Picture of Anonymous
    冯元幸 wrote:
    你好,好不容易发现有关labview的blog,内容很好,我已经将其收藏。:)
    我是一个developer, 要写一些测试设备的驱动,但是我对labview还是无从下手。现在主要是一个对labview比较熟悉的同事先编写vi,将其编译成dll, 然后我再将它import到我的driver里,但是第一,labview编译成de动态库到了我的程序里就成了unmanaged代码,而且,这个dll居然只能包含一个成员函数,请问,这是真的吗?
    我们已经采购了labview8.20,但是还没有用它,现在只用7.1,我真想自己编写labview的vi, 这样就能把握整个driver的质量。
    第二,我们正在开发ni daq 卡的driver, 如果我们用daq的api开发,是不是自由度更大一些。
    我说了这些,不知道您能不能听懂我说什么,其实,我对labview有先天的惧怕心里,虽然有软件,但是没有真正弄懂它。
    Apr. 15
    杰 高wrote:
    我感觉,从8.0开始有了project之后,LV才离通用的编程语言更进一步。呵呵。
    LV做递归确实复杂了一点,而且错误难以捕获。
    最近一直在看清华的那本LV的高级编程,收获不小。
    楼主的本篇Blog,稍显深度不够,嘿嘿。
    Apr. 15

    Trackbacks

    The trackback URL for this entry is:
    http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!2145.trak
    Weblogs that reference this entry
    • None