LuoBeiCe
今天終於弄懂了前幾天學習LabVIEW時遇到的事件結構中停止按鈕直接連接到條件接線端子出現的問題。自己悟出來的,屬實不易,另外,《LabVIEW寶典》是真的不錯。
問題描述:在自學LabVIEW編程時,遇到了如下圖的一個問題:為什么在while循環里面嵌入了一個事件結構,按下停止按鈕后不會停止運行,而是要連續兩次按下確定按鈕后才停止呢?

又或者是如下圖所示的問題:為什么要按兩次停止按鈕才能停止程序呢?

針對這種問題,我在網上找到了相關解釋,可以參見鏈接:https://blog.csdn.net/weixin_41413693/article/details/81048284?spm=1001.2014.3001.5506。
但是當時解釋我是沒看懂的,只知道停止按鈕不能直接接到while循環的接線端子上,要通過超時分支,或者將停止按鈕創建一個值改變事件,或者取消勾選
“鎖定前面板“來解決問題。自己對為何會出現這種問題還是不清楚。現在我懂了,我將介紹自己的理解,希望能幫助到朋友們。
首先我們得知道LabVIEW事件結構和while循環的運行知識:
1.事件結構通常只能處理一次事件,執行過程是:“等待事件發生“-”處理事件“-”事件結構結束“。要想連續處理事件,就得將其包含在循環結構里,這就是我們為啥通常將事件結構和while結構一起使用的原因。
2.一個循環內只能有一個事件結構,否則會鎖死。
3.while循環:當框圖內的程序執行完之后,而且條件接線端為false時,會進入下一個循環。
4.事件結構:為其超時分支指定時間后,在設定時間內沒有其他事件發生時,會默認超時事件發生,執行一次其中的程序。
接下來解釋上述第二個問題。

程序具體運行順序為:
進入while循環,此時i=0,注意:當i=0時,此時的停止按鈕為false,這就意味着,當本次while循環執行一次其框圖內的程序后,必定會跳到下個循環(也就是i=1,可以在循環計數端子加個顯示控件看看)。
此時,等待事件發生。當按下停止按鈕后,觸發事件結構,執行完事件結構后,立刻進入下一個循環,即i=1。在i=1時,由於按下停止按鈕后接線端子為true,故執行完本次循環后就會停止循環。問題就出現
在這里,必須要執行完本次循環才能退出,而本次循環的內容就是再一次響應事件結構,也就是說事件結構還在等待再一次觸發事件(也就是必須得再按一次停止按鈕)才能執行本次循環,執行完成本次循環
后就退出。第一次按的停止按鈕響應了第一次的事件結構,但是第一次按的停止按鈕需要執行兩次while循環才能完全退出,而每次循環都必須執行一次事件結構才能往后進行,所以需要按第二次停止執行第二
次循環里面的事件結構才能完全退出。
懂了第二個問題后就容易理解第一個問題了。


每按一次“確定”按鈕,布爾燈就改變一次,按下“停止”后結束程序。實際上,按下停止按鈕后不會停止程序,而是要再按兩次確定之后才會真的停止。這和上面的情況是一樣的,不同的只是換了個事件結構的觸發條件而已。
解決上面的辦法有很多,最好的方法就是將停止按鈕置於事件結構中,而不是直接與while條件端子直連。

此時程序執行順序為:進入while循環,i=0。等待事件響應,由於此時條件接線端子暫時沒有輸入,故還不知道能否進入下一循環。當按下停止按鈕時,執行事件分支,此時其值為true,並通過隧道傳遞給條件接線端,就意味
着本次循環結束后立即退出循環,因此達到了一按就停的目的。
希望這些分享能幫到大家,解答大家心中的疑惑。
