转载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 的架构上改写,除了让程式写起来除了比较有弹性之外,也具备有扩充性。
讲的很好啊
恩,很详细哦!谢谢分享
很好!
好啊,谢谢小编分享!好东东
很好很强大
学习了
vi发出来
(二)的呢?
不错,好贴!
LZ这个真的很好。希望继续哦!
hufenge潜水很多年 什么时候出大作?
学习了。
本人属于企业员工,作品要保密,呵呵
这种帖子最好,讲的简单明白
好资料 正学习这方面的
膜拜大神啊突然觉得labview入门都这么难
太六了
6666666
好作品又被翻出来~
谢谢小编分享!