標籤:

LabVIEW程序應該怎樣模塊化?

正在用LabVIEW寫一個上位機,基本所有功能都集中在main里,只有兩個子vi。

如果要模塊化,因為很多變數都是相互關聯的,難道都需要從子vi的介面中引出來嗎?

如果用全局變數的話,聽說速度會慢?

請問大家,有什麼好的模塊化的方法嗎?

謝謝!


謝邀。

這個問題問的有點大。實際上LabVIEW的模塊化方法和任何其他程序的模塊化方法並沒有什麼本質的不同。編程模塊化設計的資料很多的,知乎上也有一些討論:

有什麼關於模塊化編程與解耦之類的程序設計的好書推薦嗎? - 程序員

貌似推薦這本書的也不少:向熱愛計算機科學的你推薦SICP -- 簡明現代魔法

還有下載:計算機程序的構造和解釋(SICP中文第2版).pdf

這裡我簡單說一下在LabVIEW環境下我是怎麼模塊化的。題主現在面臨的問題是已經有了一個程序,希望進行拆分,那麼在這種情況下主要有2種思路。

第一種是重構,把局部程序抽取出來,進行打包。這個LabVIEW提供了一個很方便的打包工具:創建子系統,在菜單欄的 編輯 下面,選中你要打包的子VI和連線,就可以打包了,介面也自動連上了。當然打包了以後還是要做一些調整。如果沒有太高的要求,直接簡單粗暴的把各個功能塊一框,創建子VI就完了,就算接線很多也沒有關係,LabVIEW里的子VI可接的輸入輸出是相當多的,多層調用也不慢。

當然了,只是這麼打包就談不上模塊化了。重構過程是從局部開始,但也需要對整個程序的結構有一定的梳理。比如把變數和函數進行分類,把屬性相似的變數打包成cluster,把一個數據流的程序單獨列出來排整齊,這樣更容易發現數據流之間的共通性。有些已知的處理流程可以做很好的參考,比如串口讀數一般採用Open-Config-Read-Write-Close,資料庫處理有CRUD,那麼一個程序里總會有這些功能,可以考慮按照類似的程序進行打包。比如我曾經做了個讀Access資料庫的程序,除了LabVIEW自帶的工具包外還外接了很多跟我這個程序相關的變數、處理函數和數據介面等,我還是按照Open-Config-Search-Update-Close的流程來重構的,把相關的變數就打包到對應的子函數里。

第二種方法當然就是重新設計了。如果一個程序實在是跟亂麻一樣,這個時候單純局部重構和迭代就不容易了,必須先理清楚現有的程序結構,根據模塊化的要求做一些調整。LabVIEW雖然提倡數據流,但也給出了不少模板,比較常用的是狀態機,再用上Event組成生產-消費模型,一般程序都夠用的,這就已經進行了初步的模塊劃分。在每個功能模塊里應該就是上述的流程化的東西。

題主考慮到用全局變數,看來是已經絕望了。我個人用全局變數主要是用來定義具名常量,以及全局關閉的ExitFlag。代替全局變數的一個不錯的選擇是用隊列。LabVIEW除了隊列提供了相當多的數據通道工具,比如集合點、用戶定義的事件,但本質上和隊列是相通的。使用隊列可以給不同的模塊輸送自己所需的變數值,並嚴格定義數據類型,比較容易養成一致的編程習慣。比隊列再進一步就是設計類了,但是現在階段不建議這麼激進。

考慮題主的程序應該還不大,但是布線已經有點亂了,這個時候最好還是把程序架構以及子模塊的介面好好理一理。把前面板更新和數據計算分開,即數據計算只有演算法,結果通過隊列的方式輸送給前面板更新模塊。理清楚以後,每個模塊一個while框,while里用數據流也好,用並行的流水線也好,用狀態機也好,可以根據實際需要來調整。模塊和模塊之間用隊列做數據通道,當然通道的數據類型最好是定義,而不要太依賴Variant類型。做到這些以後,main里就只剩一個個的子模塊和相互之間的粗粗的隊列線。在這個基礎上,有個更高級的玩意兒叫QMH(Queue Message Handler)。到時候再看有沒有興趣了,有的話可以升級成這個。網上也有很多推薦用Class的,但是我個人不是很喜歡。

我大概目前就知道這麼多,題主沒事可以去LAVA論壇逛逛,多挖掘LabVIEW的自帶常式,裡面各種驚艷的想法和程序,都值得作為範本。


參考一篇文章,基於viserve和隊列的程序架構


謝邀題主參考下

http://bbs.elecfans.com/forum.php?mod=viewthreadtid=527565extra=page%3D1page=1mobile=no

1:Labview的基本介紹,講講自己的感受。學習過程。大致的方法。

2:介紹普通隊列狀態機。包含:2個模塊的模板。再介紹一下JKI自帶的模板狀態機,當時都看不懂

3:介紹JKI狀態機。再介紹結合JKI和隊列的含2個模塊的狀態機。

4:介紹AMC狀態機。

5:介紹結合JKI和AMC的狀態機

6:介紹使用類封裝的結合JKI和AMC隊列的狀態機。

7:介紹ActorFramework

8:介紹包含三個子AF的框架。(改了僅僅有2個AF)

9:介紹AF的樹形動態擴展方式


1.常用控制項寫成xcontrol

2.隊列傳遞值,用調用方式調用子vi


推薦閱讀:

推薦一個免費的LabVIEW SVN插件Viewpoint TSVN Toolkit
Matlab 與 Labview 哪個對電氣控制工作更有幫助?
NI偷偷發布了分析和機器學習工具包
關於LabVIEW的句柄(Handle)二三事
Python和LabVIEW計算性能對比

TAG:LabVIEW |