程式管理和撰寫相關問題(Event structure 可攜性和VI LLB)

大家好 第一次在這發文 

使用labview 有一段時間,但是對大型程式開發經驗其實沒有很多
最近在撰寫大型程式的時候有用Producer/Consumer的 方式進行撰寫
並且有將各個不同的類型加以分成不同的while loop 和 FGV
但是想詢問以下問題

1.Event Structure 可攜方式?
使用Event Structure時,卻依然將全部的按鈕 放置在同一個Event Structure
之前好像有看過有人分享 讓Event Structure 可以像FGV或是subvi的方式進行包裝
在分類和管理感覺較為方便,而且可以方便在製作新程式時可以馬上應用
不知道人知道那個範例或是文章嗎??

2.在大型程式中假如需要快速的反應和運作(ex:DAQ擷取資料讓馬達確認是否移動和停止),是否建議所有的code都盡量以最低階的VI進行撰寫,而不要包成subvi 或是FGV?
假如包成subvi或是 FGV 在執行速度上會差異很多嗎?尤其外部資料傳輸上用Variant 進行FGV和subvi間的溝通和傳輸 (ex:DAQ 資料要傳給motor判斷)

3.目前撰寫的時候都用project 進行檔案的管理,不知道大家都是如何管理自己的project??
我目前不同類型的VI會放置在不同的資料夾進行管理,同時也會將資料夾(Folder)設為Auto-populating的方式自動更新,但是資料夾有些內容其實算是同類型參考資料(包含非VI的檔案)也會更新上去。不知道若只想自動更新或新增VI檔案,使用Libray是否會更好?
Libray 在管理VI上 是否更為方便或是簡易?
若是相同或是不同的Libray 在使用Open VI referance 時,在載入路徑要如何載入? 或是有其他方法可以呼叫 libray 的vi?

感謝各位的協助和回復

[QUOTE=Adwaze]

2.在大型程式中假如需要快速的反應和運作(ex:DAQ擷取資料讓馬達確認是否移動和停止),是否建議所有的code都盡量以最低階的VI進行撰寫,而不要包成subvi 或是FGV?
假如包成subvi或是 FGV 在執行速度上會差異很多嗎?尤其外部資料傳輸上用Variant 進行FGV和subvi間的溝通和傳輸 (ex:DAQ 資料要傳給motor判斷)
[/QUOTE]
謝謝Adwaze的發問,很有深度的問題s。
請容我一個一個說說我的看法,同時,因為我的看法不一定正確(有些問題很專業),所以還要請各位先進指導。
我想先針對問題2來回答,其他的問題我比較不熟,或是不敢自詡了解,所以想請其他有經驗的網友協助回答:

之所以要用低階的subVI,是為了增加效能。如因是,如果以DAQ為例,一個高階的DAQ Assistant的VI,裡面包含了open session (init.) > 擷取 > close session,這三個主要的區塊。但是對於連續擷取而言,open session只需要做一次即可,接下來只要連續擷取就可以了,所以如果將高階的subVI改為低階的subVI,就可以做到open session只做一次,這樣就可以增進效率。

「把資料(尤其是大量資料)透過接線的方式傳遞到subVI裡面」,這件事情是會消耗CPU時間的,原因是在記憶體裡面要做pointer的指定與資料搬移,所消耗的時間由CPU的chip set版本決定。如果你所傳遞的資料只是1024個element以內的1D array或甚至只是單一個數字,您則不需要擔心使用local variable或是傳遞資料到subVI所造成的效率降低。

Benjamin41956.7861574074

關於第一點

你是說這樣的程式技巧嗎

http://digital.ni.com/public.nsf/allkb/A882E27D1D7A949386256E0D0066B91A

[QUOTE=Adwaze]

3.目前撰寫的時候都用project 進行檔案的管理,不知道大家都是如何管理自己的project??
我目前不同類型的VI會放置在不同的資料夾進行管理,同時也會將資料夾(Folder)設為Auto-populating的方式自動更新,但是資料夾有些內容其實算是同類型參考資料(包含非VI的檔案)也會更新上去。不知道若只想自動更新或新增VI檔案,使用Libray是否會更好?
Libray 在管理VI上 是否更為方便或是簡易?
若是相同或是不同的Libray 在使用Open VI referance 時,在載入路徑要如何載入? 或是有其他方法可以呼叫 libray 的vi?
[/QUOTE]

關於第3點,我的習慣是把所有的vi都放在一個資料夾內,通常我會命名為vilib。不使用*.llb的方式,原因是如果把很多vi存成llb檔,如果將來儲存的時候有什麼意外,可能整個llb檔會壞掉,無法開啟。

[QUOTE=Benjamin]

[QUOTE=Adwaze]

2.在大型程式中假如需要快速的反應和運作(ex:DAQ擷取資料讓馬達確認是否移動和停止),是否建議所有的code都盡量以最低階的VI進行撰寫,而不要包成subvi 或是FGV?
假如包成subvi或是 FGV 在執行速度上會差異很多嗎?尤其外部資料傳輸上用Variant 進行FGV和subvi間的溝通和傳輸 (ex:DAQ 資料要傳給motor判斷)
[/QUOTE]
謝謝Adwaze的發問,很有深度的問題s。
請容我一個一個說說我的看法,同時,因為我的看法不一定正確(有些問題很專業),所以還要請各位先進指導。
我想先針對問題2來回答,其他的問題我比較不熟,或是不敢自詡了解,所以想請其他有經驗的網友協助回答:

之所以要用低階的subVI,是為了增加效能。如因是,如果以DAQ為例,一個高階的DAQ Assistant的VI,裡面包含了open session (init.) > 擷取 > close session,這三個主要的區塊。但是對於連續擷取而言,open session只需要做一次即可,接下來只要連續擷取就可以了,所以如果將高階的subVI改為低階的subVI,就可以做到open session只做一次,這樣就可以增進效率。

「把資料(尤其是大量資料)透過接線的方式傳遞到subVI裡面」,這件事情是會消耗CPU時間的,原因是在記憶體裡面要做pointer的指定與資料搬移,所消耗的時間由CPU的chip set版本決定。如果你所傳遞的資料只是1024個element以內的1D array或甚至只是單一個數字,您則不需要擔心使用local variable或是傳遞資料到subVI所造成的效率降低。

[/QUOTE]

會詢問這部分其實是擔心使用low VI 製作成FGV或是subvi以後,程式運作時,在VI間資料傳遞的結合和解開需要耗費很多時間,尤其使用Variant 進行資料傳遞時,每次取出資料都會要使用Variant to Data 將資料轉換出來。因為在寫某些跨FGV或是subvi的資料傳遞時,資料格式的不確定性有可能產生,所以才想都使用Variant當作資料傳遞媒介。

[QUOTE=CleoMadlax]關於第一點

你是說這樣的程式技巧嗎

http://digital.ni.com/public.nsf/allkb/A882E27D1D7A949386256E0D0066B91A
[/QUOTE]

還未細看,不過感覺 很類似我想要的概念,我的構想是subVI內部只有 event Structure ,然後用2~3個event Structure的subvi 組成一個泛用Event Structure 的 while loop ,且 只有收到命令 才會啟動。
晚些時間再來測試看看 此構想是否可以實現。