微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 测试测量 > Labview > 写好LabVIEW程序不可不知的利器(一):模块化功能 VI

写好LabVIEW程序不可不知的利器(一):模块化功能 VI

时间:10-02 整理:3721RD 点击:

对于一般的初学者,无论是否有程序基础,LabVIEW 是个相当容易入门的程序语言。因为 LabVIEW 图形化以及资料流的概念,相对于文字叙述的程序语言较容易理解。也正因如此,虽然初学者在刚开始接触 LabVIEW 时,可以非常快速的使用内建的 Function 或 VI 来写一些小程序,但一遇到程序需要增加较多功能时,程序往往越写越庞大而复杂,程序码杂乱无章,图形化此时反而没有得到较多的好处。这也是导致一般人对于 LabVIEW 的印象是很容易上手,但只能写一些小程序。其实只要善用 SubVI 将程序功能模块化,以及选择适当的程序架构,无论多复杂的程序也能轻松地完成。




上图是一个红绿灯的小程序,其功能是一开始红灯先亮 2 秒,接着换黄灯亮 1 秒,最后再换绿灯亮 3 秒。最直觉的写法当然就是用 Sequence 轮流让三个灯亮起且分别等待不同的时间,而其中因为要将前一个灯关掉,所以会用到 Local Variable ,如下图。



这种直觉式的写法非常简单,可以在短时间内完成程序,初学者也较常使用这种思维来写程序。但这样的写法存在着一些缺陷,例如当使用者按下 Stop 后,需等待程序完整跑完一个循环才会停止,而不能实时将程序停止。这也是使用 Sequence 当作程序架构的缺点,当 Sequence 执行过程中发生 Error 时,并没有办法直接跳出 Sequence 来解决 Error 或是将程序停止。而且程序里面大部分的工作是 Wait Time ,如果要让这个程序在同个循环中执行其他功能会非常难写,因为循环的更新时间是 6 秒。


在 LabVIEW 里面,建议不要将循环时间设的太长或太短。时间太长的话,按键的反应会非常不灵敏;太短的话,则会比较占 CPU 资源。一般只要人眼无法辨识人机界面的更新即可,通常将循环更新时间设为约 100ms 。除非程序码执行的时间超过 100ms (通常是卡在硬件通讯时间),可以再设长一点。

为了要让循环每 100ms 更新一次,在写程序时就要思考如何程序时间切割。同样以红绿灯的程序为例,红绿灯每 6 秒会依序亮完,如果把循环更新时间设为 100ms ,则第 1 ~ 30 圈要亮红灯、第 31 ~ 40 圈要亮黄灯,最后第 41 ~ 60 圈要亮绿灯。所以同样的程序功能可以改用 Case 的写法,来决定目前循环在第几圈要亮什么灯号,如下图。



这两种用 Sequence 以及 Case 的写法,执行的结果是一样的,但 Case 的写法可以让使用者按下 Stop 后,程序马上停止而不用像 Sequence 写法那样要等到红绿灯依序亮完,而且也可以比较有弹性地在循环里面加入别的程序码。

而这两种写法虽然简单但其实不够有弹性,目前只有 3 个灯号要依序亮起,如果之后要写个程序要让 10 个灯号依序亮起,而且时间都不相同的话,虽然程序功能是类似的,但在这两种架构下都不太好写。因为要拉出 10 个灯号,而且要写 10 个 Sequence 或 Case 的框架。当然这还是可以土法炼钢把程序写完,但每次只要程序功能一改变,整个程序几乎要重新写起,非常浪费时间。







为了让写出来的程序具有弹性化,以方便以后去修改或扩充程序功能,我会将程序功能包成 SubVI ,如上图。将来如果程序功能需要修改或扩充,只需要去修改 SubVI 里面的程序即可,而不需要去修改整个程序架构。要注意的是我会将红绿灯的三种灯号包成的 Cluster 以及控制灯号状态的 Enum Control 存成 Type Definition ,以方便之后修改。在人机界面新增一个 Enum Control 并且将它存成 Type Definition 的步骤如下:








将 Enum Control 的 Type Definition 存档并关掉后,程序会询问你是否要替换原本的物件。替换后,原本的 Enum Control 按右键就会如下图出现 Auto-Update from Type Def. 。之后,只要修改 Type Definition 后再存档关掉,程序里面所有 Type Definition 就会一起更新,这样程序写起来会省事许多。



而整个程序执行的结果就会如下列图示:






如果程序都已经写好了,却想再增加一个蓝色的灯号的话,程序完全不需要修改,只需要去修改 Traffic Light Cluster 和 Enum Control 的 Type Definition 即可,程序会自动更新所有的 Type Definition ,如下图。



将写好的程序在右上角的 icon 按下右键,选择 Show Connector ,接着再将 Enum Control 和 Cluster Indicator 设定为 Input 以及 Output 的接点,如下图。如此一来,这个程序就可以当成一个 Sub VI 让其他程序来使用,只要输入目前要亮哪个灯号,经由这个 Sub VI 输出即会显示相对应状态的红绿灯。




最后用 Case Structure 配合写好的 Sub VI ,就可以把红绿灯的程序完成,而且和前面两种写法的功能完全相同,如下图。除了使用者按下 Stop 可以实时停止程序之外,将程序功能模块化的好处是,程序会变得比较有弹性,不必为了修改某个功能而导致程序需要整个重写。




虽然这种写法达成了原本的程序需求,但如果写完后想加入让使用者按下 Start 按键,红绿灯才开始依序亮起,以及按下 Restart 按键,红绿灯会重新从第一个灯号开始亮起的这两种功能,其实不太好扩充。所以下回会讲到将这个程序在 State Machine 的架构上改写,除了让程序写起来除了比较有弹性之外,也具备有扩充性。


转载


遇到过很多这样的人,对LabVIEW很不屑,觉得这样简单的东西还用学吗?
觉得自己的LabVIEW编程水平已经可以藐视一切,可以应对所有的问题。
但当真的一个问题出现在他面前时,结果就显而易见了。
高调做事,低调做人。看着脚下的路,走好~

赞同,细节决定一切,踏踏实实的走才是长远之道啊!

每次看别人的程序,总有一些亮点,coding 可是创造性的劳动呢!

每次看别人的程序,总有一些亮点,coding 可是创造性的劳动呢!

对我很有帮助!

模块化确实很重要啊 好好学习吧

还有一种办法是直接用单选按钮修改下就可以。即只有单选功能,其他关闭。

条件分支的多数字在一个条件里是如何实现的呀

写的非常不错!

分享是一种美德!

学习学习,谢谢小编!

看着不错,先get走了,谢谢小编

       初学者是东一榔头西一棒,不上路

很受用,谢谢分享

很受用,谢谢分享

业界小生谢谢分享了,学习下

直接在选项的数字后边加..代表省略号

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top