因為我有個程式在執行的過程中可能會出現使用者需要中斷暫停,所以我在程式中加入了一個中斷按鈕只要按下去就會進入一個迴圈,當使用者想繼續執行下去則在將按鈕按一次就會從迴圈跳出來,所以我試寫了一個類似的VI測試,但是當按鈕按下去程式是會進入迴圈中,但是在按一次按鈕卻不會跳出迴圈,所以想請教各位我的程式哪裡需要改進,謝謝~~~
一般來說,MainVI 跟 SubVI 的關係:
MainVI 只能給予 SubVI 初始值,
之後 SubVI 裡的 controller 的值
都不能透過 MainVI 來將之改變。想要從 MainVI 改變 SubVI 中的 controller 之值,
有兩個方法:1. 透過 Global Variable
2. 透過 controller 的 reference
所以你的程式架構需要做修正。
或者用其它方式來呈現你的 GUI 功能
[QUOTE=Airbolt]
一般來說,MainVI 跟 SubVI 的關係:
MainVI 只能給予 SubVI 初始值,
之後 SubVI 裡的 controller 的值
都不能透過 MainVI 來將之改變。想要從 MainVI 改變 SubVI 中的 controller 之值,
有兩個方法:1. 透過 Global Variable
2. 透過 controller 的 reference
所以你的程式架構需要做修正。
或者用其它方式來呈現你的 GUI 功能
[/QUOTE]
因為我不是很懂Global Variable的用法...
所以我找了LabVIEW裡的範例然後大概將裡面的範例加到我測試的程式裡,現在我是將Global Variable開啟成panel的方式控制,這樣是可以達到我要的功能,但是我想用按鈕去控制卻不知如何使用,請問一下要如何用按鈕去控制...謝謝~~感謝你的幫忙~~
CW38485.3999537037你可以將你的sub vi設定為類似對話框視窗的方式(用一個按鈕開關開啟)....因為在對話框視窗開啟時,主程式會暫停動作....當完成使用者要做的事情後...先將改變或欲輸出的值傳回主程式....再用FP:CLOSE(對話框關閉)的功能,就可以解除中斷,繼續執行主程式的動作了!!
[QUOTE=麟仔]
你可以將你的sub vi設定為類似對話框視窗的方式(用一個按鈕開關開啟)....因為在對話框視窗開啟時,主程式會暫停動作....當完成使用者要做的事情後...先將改變或欲輸出的值傳回主程式....再用FP:CLOSE(對話框關閉)的功能,就可以解除中斷,繼續執行主程式的動作了!!
[/QUOTE]
麟仔 提到了一個很不錯的方法,
而且這樣的 GUI 動作方式很常使用。
其實 CW 你可以構思一下,
當你的程式給操作者使用時,
要怎麼樣才能夠最直覺地讓他們找到要用的東西?
要怎麼樣才不會失焦在不該是使用者目前所要操作的地方?
比方說,主程式跳出一個功能視窗來,
如果程式的設計並不想讓使用者於功能視窗作用時,
再去控制到主程式。
那麼我們可能會有幾種方式來完成這件事,
Airbolt38488.37454861111. 讓功能視窗永遠壓在主程式之上,
這樣使用者就不會去執行到不該在這個時間點所該執行的功能。
2. 讓主程式隱藏,只顯示功能視窗。
同樣有 1. 的效果。
[QUOTE=CW]
因為我有個程式在執行的過程中可能會出現使用者需要中斷暫停,所以我在程式中加入了一個中斷按鈕只要按下去就會進入一個迴圈,當使用者想繼續執行下去則在將按鈕按一次就會從迴圈跳出來,所以我試寫了一個類似的VI測試,但是當按鈕按下去程式是會進入迴圈中,但是在按一次按鈕卻不會跳出迴圈,所以想請教各位我的程式哪裡需要改進,謝謝~~~
[/QUOTE]
我的直覺想法是使用state machine可以達到您的要求,以下文章您參考看看
http://www.labview.com.tw/forum/forum_posts.asp?TID=1032&KW=state+machine
感謝各位熱情的解答,我現在上傳的程式已經可以達到我需要的中斷功能了,就是在程式之中開啟另一個VI,藉由這個VI還達到中斷的功能~不過要開啟Highlight Execution看才比較清楚喔,再次感謝各位~~~
[QUOTE=CW]
感謝各位熱情的解答,我現在上傳的程式已經可以達到我需要的中斷功能了,就是在程式之中開啟另一個VI,藉由這個VI還達到中斷的功能~不過要開啟Highlight Execution看才比較清楚喔,再次感謝各位~~~
[/QUOTE]
少一個breaker.vi
[QUOTE=ancle][QUOTE=CW]
感謝各位熱情的解答,我現在上傳的程式已經可以達到我需要的中斷功能了,就是在程式之中開啟另一個VI,藉由這個VI還達到中斷的功能~不過要開啟Highlight Execution看才比較清楚喔,再次感謝各位~~~
[/QUOTE]
少一個breaker.vi
[/QUOTE]
抱歉,補上檔案,有興趣的人再試試看囉~
我試過用 one button dialog <---這個function tool也可以達到中斷的功能喔~
CW 用到了 Dynamically Calling 的技術,
那下面的程式可以參考一下。
附件是一個 llb 檔,打開後有三個 VI
分別是:
「mainVI.vi」、「subVI.vi」、「Global Abort.vi」
請執行「mainVI.vi」
「mainVI.vi」:
請注意,在 Method - Run VI 中的 Wait until done 請接上 false
否則後面的 Loop 將無法控制到 Global Abort.vi這邊是透過 Global 來停止 subVI.vi 的
然而這個部分也可以直接用 Method - Abort VI 來完成。
「subVI.vi」:
其實我只是想讓使用者在執行程式的中途可以按個鈕就可以暫停,然後再按一次就可以再開始於暫停的地方,不需繁複的動作只需簡單的按個鈕就行了~現在已經完成了,再次感謝各位給予的幫忙~謝囉~~~