![]() |
|
Spaces home LabVIEWPhotosProfileFriends | ![]() |
如何学习 LabVIEW根据我自己的观察,学习LabVIEW一般有以下三种方式:系统型学习方法、探索型学习方法和目标驱动型学习方法。这三种方法之间并不矛盾,可以在不同的时段使用不同的方法。每个人可以根据自己的个性特点和所处环境选择一个适合自己的学习方案。 系统型学习方案是传统的学习方法,学生学习多是按此方法。它是指按照别人制定好的学习方案一步一步学习掌握一门知识。学习效果如何,主要取决于教师和教材的水平。若选此方案学习LabVIEW,最高效的方法莫过于参加NI公司的LabVIEW培训课程。基本上,完全没接触过LabVIEW的学员可以在一星期的时间内达到编写简单程序的程度。此外,现在很多大学都开有LabVIEW课程,方便了在校生学习。 探索型学习方法适合喜好自己钻研的人。同样一个技巧,如果是自己发现的,比从他人那里的来会更有成就感。任何一个教程都不可能覆盖到LabVIEW的全部功能,有心得学员不妨自己打开书中未曾介绍到的那些菜单或者函数选板,尝试一下它们都是做什么用的。在真正动手摆弄每个新东西之前,打开LabVIEW的即时帮助窗口,阅读一下相关说明可以大大加快学习过程。 阅读他人代码也是一个很好的学习方法。自己的探索总是有思维局限性的,他人解决问题的方法可以大大拓宽自己思路。我介绍过的编程经验中,很大一部分都不是我自己凭空想出来的,而是借鉴与别人的LabVIEW代码。 目标驱动型学习方法是公司员工中最常见的学习方式了。工作后,如果不是个人有兴趣,多数人不会浪费时间去学习工作中用不到的知识。等老板布置了具体项目或者工作任务后再学习相关知识,效率更高。学也只要够解决眼前问题就行了。针对这种情况,请教身边牛人或者公司前辈是最好的学习方法。如果周围的人不能解决问题,到论坛上发贴,寻求更广泛的帮助。 开发 XControl 2 - 创建在项目浏览器上,点击鼠标右键,选择“新建->XControl”,就可以创建一个新的XControl。 XControl 在结构上是一种特殊的库,他包含一些特定的更能VI,和一些可选的属性、方法VI及其它相关文件。在新建的 XControl 上已经包含了4个必须的功能VI(控件):数据、状态、外观、初始化。XControl 还有两个可选的功能VI:反初始化和转换状态以保存。 下面对XControl做一些基础的设置,比如修改它的图标、版本号等,然后保存。 开发 XControl 1 - 设计 XControl 是 LabVIEW 8 开始出现的一个制作 LabVIEW 控件的工具。与之前的用户自定义控件相比,用户自定义控件只能定义控件的界面,而 XControl 还允许通过编写代码来定义控件的行为。因此 XControl 功能更加强大。 需要开发一个新的控件之前,首先要考虑一下以何种方式实现这个控件。 我们前面提到的黑白棋的控件,既有特殊界面,又有特殊行为,又可以应用于不同软件中,非常适合做成XControl。我们先来具体设计一下这个XControl所需的界面和行为。 界面编程技巧 5 - 使用绘图控件 有时候需要画一个比较复杂图形或曲线,而 LabVIEW 没有提供相应的控件。可以借用 LabVIEW 已有的基本功能的控件,配上一些代码,实现一个具有特定功能的控件。 下面介绍一下实现这个界面的具体过程。 与前面介绍的方法不同,使用Picture控件制作棋盘棋子的过程,不是在VI编辑状态下进行的,而是需要在程序运行时绘制。所以下面的界面设计工作都要通过编程来完成了。先介绍一下Picture控件的Erase First属性,它有3个值:0表示从不擦除,也就是说每次传一个数据给这个控件,比如一个圆环图案,Picture上显示的并非只有这个圆环,而是把圆环叠加在原本的内容之上。如果我想画一个有三个矩形组成的图案,可以分三次画,每一次传递一个矩形图案给Picture控件;2表示每次都擦除,每次传递一个图案给Picture控件,它都会将原来的图案擦掉,仅保留这一次的图形。擦除图案后Picture控件会显示默认的白色。所以,使用这种方式,用户在切换图案时会看到Picture闪烁一下。若非必要,尽量不要使用这种方式;1表示程序第一次运行时把Picture上的内容清除,等于自动帮你做了初始化工作,我们这里也使用这种方式。 棋盘再棋子下层,所以要先画棋盘。画棋盘可以使用LabVIEW提供的划线函数,一条线一条线画出来。因为我们之前已经制作了棋盘的图片,所以可以直接把这张图片显示出来。代码如下: 下面再画上棋盘初始时的四个棋子。画棋子的方法与棋盘相同,可以使用画圆函数,已可以使用已经制作好的图片: 到目前为止,界面设计的几种方法就已经介绍好了。如果能够把这个黑白棋的相关界面和操作(比如放置棋子,反转棋子等)提取出来,合成一个组件,公布出来,其他有类似需求的人就可以直接利用这个组件,不再需要自己重新设计了。 下面我就会重启一个先话题,讨论如何把这个黑白棋做成一个可以独立发布的组件。 界面设计技巧 4 - 改进界面实现方法 到目前为止,棋盘棋子的界面已经基本成型。下面我们实现一小部分代码,来看看这个界面设计方案是否可行,是否可以改进。 代码中的子VI(Get All Chess.vi)中的代码,就是我们在第一节图8中看到的那段代码。它负责得到所有棋子的引用,并排列成二维数组。 这段初始化的代码并不算复杂,但是我们还是可以从中看出一些问题:棋子的布局需要用两个数组才可表达清楚,这给编程增加了负担。造成这一状况的根本原因在于:每个位置上的棋子实际上有三个状态:黑、白、无;而我们选用的灯泡控件,只有两个值:真、假。用这两个值不足以完全表达棋子的状态,所以,要两个布尔类型才能确定一个棋子的状态。 上面的代码还有一处不足,每个棋子都是一个独立的控件,造成界面控件太多,不好管理。对于更复杂的程序,比如围棋游戏,如果使用这种方式,界面上就有将近400个控件,这是不可接受的。 具体的实现步骤如下: 在程序中,我们不希望看见 Pict Ring 控件的边框和背景。我们可以用透明画笔,把边框和背景画为透明。 造一个二维数组用来放置棋子元素。由于界面上不希望看到这个数组的边框和背景,所以同样用透明画笔把它们画为透明。数组的标签、索引显示可以通过数组的右键菜单->显示一项进行隐藏。 界面设计技巧 3 - 用户自定义控件现在棋盘已经很漂亮了,相对来说,棋子似乎残留了比较多的LabVIEW控件的痕迹,与我们要编写的游戏程序风格不符。我们可以利用用户自定义控件来造出更漂亮的棋子。 制作自定义控件,可以从一个全新的ctl文件开始,也可以在某个已有的控件基础上进行修改。比如这里我们想把棋子周围一圈光效移走,右键点击一颗棋子,选择 Advanced->Customized,弹出控件编辑界面。按工具栏上扳手一样的按钮,切换到自定义模式,即可修改控件上的元素。这个控件有三个元素:标签、灯泡的主体部分、和边框。选中最外面那个白色的框,即边框,删除即可。编辑完成保存,新的棋子就不再有边框了。 自定义控件也可以贴图,布尔型控件,比如按钮一般有4个状态,可以贴上4张不同的图片,做成复杂形状的按钮。下图就是通过贴图做成的一个有阴影效果的棋子按钮。 最好所有的控件都使用严格类型定义,这样以后再需要改变界面的时候,只要在类型定义ctl文件中改动,所有的棋子就都会改变。 界面设计技巧 2 - 装饰和背景图片现在棋子都已经摆放到位了,下面考虑如何把棋盘加上去。由于棋盘是静态不动的,所以设计起来要比棋子简单。LabVIEW 自带了这种形状的装饰组件,比如线条、方块之类的,利用这些装饰图案,很容易搭出一个棋盘来。如下图,就是由几根被画成黑色的线条搭出来的部分棋盘。 在编写程序界面时,装饰最常被用来将一组相关联的控件包围起来,或把不相关的控件个离开。 不过呢,用LabVIEW自带的简单图形拼出来的棋盘始终是不够漂亮。我们可以先用专业的画图工具,比如画图板(也不怎么专业吗)画一个漂亮的棋盘,保存成图片文件。然后把图片贴到VI的前面板,当作背景图片。这样,就可以得到一个漂亮的多的棋盘了。 棋盘棋子都摆好之后,它们的相对位置应该固定下来。如果需要它在界面上挪动,应该是所有的棋子和棋盘一起动。先用鼠标把棋盘和全部棋子选中,再在Reorder工具中,选择group就可以把它们设定为一组。之后他们之间的相对位置就固定下来了。 咱们刚刚贴上来的图片是个矩形的,可是有时候,需要背景图片是不规则形状的。这种情况下需要使用支持透明色的图片格式,比如gif格式,把不规则图片空白部分设为透明即可。还有一种常用的文件格式png格式,支持像素点透明度的设置,利用不同的透明度设置还可以给背景图片做出阴影等效果。例如下图VI界面中两个带粉色的带阴影效果的解说框,使用的就是png文件格式的图片。 界面设计技巧 1 - 利用 LabVIEW 自带控件 我前面讲了一堆设计界面的规范和原则,下面介绍一些具体的技巧,可以让界面编写更快捷、美观。 界面设计的时候,首先要调查一下看能不能使用已有的控件。借用已有控件可以大大节省我们自己的开发时间了。我们这个游戏界面上的按钮、文本框等自然可以使用LabVIEW自带的控件;黑白棋的棋盘棋子,也可以上网去找找看有没有别人已经做好的可供使用。 比如说棋子:这个游戏的棋子为圆形,只有黑白两色,个数最多64个。这个特点很适合用 LabVIEW 中的圆形LED灯泡来表示。圆形LED灯泡控件如下图所示: 为了使它更像棋子,我们还要对他进行一下加工。首先,要把它的尺寸调大;用工具选板上的颜色画笔工具把它在“真”“假”状态下的颜色分别设置成黑色和白色;给他起一个有意义的名称-chess 0,但是在前面板上需要把这个标签隐藏起来,这个名声是为了以后编程的。改进后的棋子,如下图所示: 我们总共需要64个这样的棋子,排成8行8列。其它的棋子不需要再一个一个添加,以第一个棋子为模板,拷贝复制,就生成了第二个;再把两个棋子都选中,复制生成四个;重复这一过程,生成8、16、32、64个棋子。如下图所示: 下面我们要把这些棋子排列整齐。如果有耐心,可以用鼠标一个一个的调整每个棋子的位置。LabVIEW 提供了几个小工具来帮我们整理界面控件的位置和大小,它们就是工具条上,字体调整按钮右侧的四个按钮。这四个个按钮分别用于对齐控件,调整控件间距调整控件大小和控件前后次序。这几个工具在编辑界面时会经常使用到。 我们先把首先利用对齐工具把首行和首列棋子对齐、再利用间距调整按钮使它们间距均匀。再利用对齐工具让其它棋子都与首行首列对齐即可。调整好的界面如下: 到此为止,棋子的界面部分就完全设计好了。但是我们还要考虑一下相关的代码。棋子在程序运行过程中时发生变化的。 设计界面时,经常遇到有些控件只在某种特定情况下出现。这样的问题有两种最常见解决方案,一是我们刚刚提到的,可以在不需要看见某个控件时设置它的Visible属性,将其隐藏。这种方法代码编写比较简单,但是不利于界面编辑。尤其当界面某一位置需要在不同情况下出现多种不同控件的情况下。几个几个控件需要在那个位置上重叠摆放,不利于对控件进行编辑调整。 打开程序的框图,64个控件端子排布在那里。对它们分别进行操作,程序代码将会非常杂乱难懂。为了让程序更清晰,最好把这64个控件按照在棋盘上的位置,组织成一个8×8的二维数组。之后,程序对哪个位置的棋子进行操作就一目了然了。 直接把它们组成数组的方法是:为每个控件建立一个引用,然后使用 build array 函数把它们组织起来。但是对64个控件进行一一操作还是够烦的,最好可以编程解决。由于这64个棋子的名字是有规律的,因此我们可编程,按照名字一一等到这些控件的引用。再将得到的引用转换成8×8的数组。如下图所示的代码 这里使用了一个关键的子VI,Get Control.vi。这是LabVIEW自带的一个VI([LabVIEW]\resource\importtools\Common\VI Scripting\VI\Front Panel\Method\Get Control.vi),它用来按名称得到前面板上控件的引用。 实际工作中,有些应用程序有比较复杂的界面,为了简化它的代码,对界面控件的操作被放置在子VI中完成。直观的做法也是:程序开始时为主程序的控件建立引用,把这些引用捆绑成一个簇,传递到子VI中去。但是,一旦界面发生变化,所有使用到这个簇的VI都可能需要被修改,相当不便。所以,这样的程序也可以使用上段文字介绍的方案,只把主VI的引用传递给子VI,在使用到某个主VI控件的时候,按照名字得到它的引用再对其进行操作。 用户界面设计 5 - 限制 保障软件的可靠性是软件开发者的责任。如果用户误操作,或者提供了错误的数据给程序,稳定的程序可以组织程序继续运行并报告错误。但这毕竟是亡羊补牢的做法,更完美的解决方案应倒是从根源上就杜绝误操作和错误的输入数据。 一、限制输入数据 LabVIEW 的某些控件本身就带有对输入数据进行限制的功能。比如数值型控件,在它的属性对话框中的 Data Entry 页,可以设置这个控件接受的数据的范围。我有一个控件用来表示选取某个通道,可供使用的合法数据为通道0至通道3,我们就可以在这一页把控件的最大最小值分别设为3和0。如下图: 这样设置后,用户也许还会输入一个不合理的数值,比如99,但LabVIEW 会立即忽略这个不合理数值。 除了 Enum 或 Ring 型控件,单选按钮也可以起到同样的效果。单选按钮可以直接就在界面上显示出所有可供选择的值,并且可以附带对每个选项的详细解释。不经常被用到的对话框可以采用这种控件。比如下图,是VI属性中设置密码的页面。 二、防止误操作 一个简单的规则:让所有但是不应被改动的控件都失效。大家看图3中的修改密码按钮是灰色的。因为这是用户选择的是无密码,所以当时不应出现修改密码的操作出现。与其让用户判断是否可以按这个按钮,不如直接禁止它的使用,以防用户错误的按下它发生不可预期的错误。当用户有密码设置后,再允许这个按键被使用。 怎样根据错误代码得到错误信息 大多数 VI 都会带有错误处理机制,所以 VI 的前面板上会有 error in/error out 控件。如果发现有返回错误代码,之间在空间边缘处点击鼠标右键,选择 Explain Error 就可以看到详细的错误信息。 如果是在程序当中需要动态的得到一个错误代码的信息,可以使用 [LabVIEW]\vi.lib\Utility\error.llb\Error Code Database.vi。这个 VI 可以根据输入的错误代码返回错误信息。 被个小贼吓到了昨晚又没睡好,是因为睡觉前被个小贼吓了一大跳。 昨晚九点左右,我和老婆在卧室里看电视。因为开了空调,就把卧室门关上了。正看着电视的时候,老婆跟我说听见客厅里有动静,其实我也听到了一些声音,但是我一项大大咧咧也没留意。在老婆的提醒下,我觉得有必要去客厅查看一下。 门卫和巡逻的走了以后,我觉得还是要自己做点什么,防止小贼再回来。据我观察,那个贼是先进入了我们楼道(我们楼道的大保险门不灵活,经常关不严),然后从楼道三四楼之间的窗户爬出去,一步就可以跨到我的空调上了。楼道内其他楼层的窗户都已被封死了,打不开,只有三四楼之间的窗户可以活动。我挺喜欢开着它通风的,可是为了安全,宁可不通风了。我在邻居的帮助下,把这扇窗户也钉死了。当然,小贼还可以把钉子撬出来,但是这样会大大增加他的犯案时间和风险。 在这一切布置妥当之后,我就开始仔细思索小贼的行为。这个小贼不像是单纯来偷东西的。 我老婆平时都住在学校,恰巧昨天比较闲,就跑回家来。要是像平时一样,只有我一个人在家,可能一不留神,就让那个贼进来了。我听说的入室抢劫,大多杀人灭口。真是越想越害怕…… 计划书的内容 我打算主要写两部分的内容。一是 LabVIEW 初学者容易遇到问题或出错的方面,比如程序的常见错误、代码风格、界面设计、调用DLL库等。二是LabVIEW的一些高级用法,比如 VI Scripting、LvClass、XControl 等。 准备把 blog 上的文章整理成书最近跟北航出版社的一位老师联系了几次,在他的建议和鼓励下,开始正式考虑把LabVIEW相关的内容编辑成书。 其实我写书的想法也是由来已久的。很早以前,我爸就一直鼓励我把工作都整理出来发表些文章,或者写本书。不过当时只是粗略的考虑了一下这个建议,觉得对我没太大好处,所以就一直没有回应。当前中国的形式是这样的,在技术杂志上发表文章的主要都是为了取得学位或职称的。所以杂志主要靠作者养活,而不是读者。在这样的杂志上发文章,浪费了我的时间和金钱,而又不会被需要的读者读到,没有意义。 真正开始仔细研究写书的可能性是大约三年前开始的。当时好友小吴和我们公司韩国分公司的一位同事联系比较多,于是知道那位同事靠撰写和翻译相关的技术书籍赚了不少外快。小吴很是动心于是找我一起商量是否我们也可以干点同样的事情,不久另一个好友小王也参与了进来。我们对当时市面上的 LabVIEW 的书籍以及它们的销售情况都进行了分析。对财政方面的分析结果,是比较令人失望的。中国的知识产权不值钱,加上 LabVIEW 用户有限,指望写 LabVIEW 的书籍发家致富是不可能的了。甚至它的投入产出比远不及我本职工作高。所以,后来再有同事跟我提起靠写书捞点外快的时候,我就建议他去跳槽,肯定比写书收益高。 之后,又有几次,同事或者出版商和我联系讨论写书的事项。而我都觉得自己准备还不充分,没有积极参与。这次北航出版社的老师给我展示他们的一个出版计划成绩。我觉得他们的计划和设计挺不错的,再加上老婆最近也鼓励我写书,于是又动了心。我当时开始在博客上写 LabVIEW 文章的时候,心里有个打算:积累4年之后,把它们整理成册出版,所以发表的文章都是按章节排布好的。现在离那时只过了两年,文章积累的不算丰富。不过呢,万事也不用那么追求完美,没必要一下子就写部大部头的书出来。把自己部分经验整理整理,写出来也是个不错开端。 我现在正在考虑这本书的内容。我不会写一部教科书一样面面俱到的书籍,LabVIEW 每个技术点都讲一下,那书就厚的不得了了,六个月的时间我肯定写不出来。所以呢,还是只能侧重我最熟悉的那部分知识。但是呢,又不能只写一些 LabVIEW 高级编程的内容。LabVIEW 的用户几乎还全部是初级用户,当然要面向大多数人。再考虑考虑吧。 终于读完了整本《心理学》 这是我这几年读的时间最长的一本书(大约读了两年),一是因为它特别厚(699页),再有这本书是断断续续读的。我这本《心理学》的作者是 David G. Myers,是美国比较流行的一部心理学导论教材,我看到的是它的第七版。 听《百家讲坛》王立群讲课的时候,有一回他提到:一个人要想成就一番事业,只琢磨事是不够的,够重要的要琢磨人。这句话要正面来理解,琢磨人可不是算计别人;而是要掌握和理解自己乃至别人的思维方式。说的具体点,如果你当对方是敌人,知己知彼才能取胜;如果你当对方是朋友,知己知彼才能相处融洽。文明发展的趋势就是人越来越社会化。现在别说干事业,即便是日常工作生活也离不开与人打交道。对人性的理解程度直接影响到你的受欢迎程度,从而又间接影响了工作效率和生活质量。 可能是心理作用,我觉得自己读这本书期间,周围人际关系和谐了不少:) 不知道我老婆赞同不? |