为了让写出来的程序具有弹性化,以方便以后去修改或扩充程序功能,我会将程序功能包成 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 的架构上改写,除了让程序写起来除了比较有弹性之外,也具备有扩充性。