在LabVIEW中使用一個按鈕停止並行While迴圈

更新 Nov 3, 2023

環境

軟體

  • LabVIEW Full

本文説明如何使用一個停止按鈕來停止在LabVIEW中的多個並行while迴圈並讓停止按鈕返回其初始狀態。

您可以根據所使用的LabVIEW版本選擇使用的方法,以一個停止按鈕停止LabVIEW中的多個並行While迴圈。

注意:下面僅列出最常用的方法。

通道線

如果您使用的是LabVIEW 2016,您可以使用通道線通過一個停止按鈕來停止多個並行的While迴圈。由於通道線是連接兩個並行While迴圈且不強制執行順序的異步線,因此兩個並行 While 迴圈之間沒有資料依賴性。

注意:LabVIEW Real-Time模組支援通道線,而非LabVIEW FPGA模組。
 

下圖演示了使用標籤(Tag)通道停止並行While迴圈:

具體細節如下:

  1. 迴圈A包含一個標籤寫入端,它將值寫入標籤通道。
  2. 通道線將標籤寫入端的通道輸出連接到標籤讀取端。
  3. 迴圈B包含一個從標籤通道讀取值的標籤讀取端。
  4. 停止按鈕連接到迴圈A中寫入端的元素參數,並與迴圈B溝通。如果單擊迴圈A中的停止按鈕,迴圈B也會停止。

下圖演示了使用Stream通道停止並行While迴圈:

使用Stream通道時,停止按鈕連接到迴圈A中寫入端的最後一個元素參數中與迴圈B溝通。

Tag通道和Stream通道在用於停止並行While迴圈時有很大的不同。

  • 使用Tag通道停止並行While迴圈會導致所有迴圈盡快停止,因為來自迴圈A停止按鈕值直接與迴圈B溝通。使用Stream通道停止並行 While 迴圈可能會導致迴圈B迴圈A停止得比較慢,因為來自迴圈A停止按鈕的值通過最後一個元素?參數與迴圈B溝通,這意味著迴圈A在寫入最後一個元素後立即停止。但是,迴圈B繼續讀取通道中的剩餘元素,並且在讀取完最後一個元素之前不會停止。 Stream通道確保通過通道溝通的所有資料元素在迴圈B停止之前得到處理。
  • 標籤通道允許您停止兩個或多個並行的While迴圈,因為標籤通道可以分叉到多個寫入端和讀取端。 Stream通道僅可以停止兩個並行的While迴圈,因為Stream通道只能同時擁有一個寫入端和一個讀取端。
下圖演示了使用標記通道停止三個並行的While迴圈。

警告

您不能通過增加多個停止按鈕擴充已有的標記架構。但是,您可以使用labview\vi.lib\ChannelSupport中的Share Stop Signal VI 添加一個或多個停止按鈕,這允許您使用任何一個停止按鈕來停止多個並行的While迴圈。

下面的VI snippet演示了如何使用兩個停止按鈕中的任何一個停止多個並行While迴圈。要添加更多停止按鈕,請遵循相同的架構。

區域變數

您可以將布林停止按鈕值從第一個迴圈的控制元件傳遞到所有其他迴圈,並為每個附加迴圈使用一個區域變數以實現通過使用一個停止按鈕停止多個並行While迴圈。下面的程式區演示了使用區域變數停止兩個並行的 While 迴圈。

重要細節如下:

  1. 頂部迴圈包含一個停止控制元件。通過右鍵單擊前面板上的停止控制元件並選擇Mechanical Action»Switch When Pressed。這允許所有迴圈讀取停止布林值,latch when pressed則會讀取值后將重置為真,使一些迴圈仍在運行。
  2. 底部的兩個迴圈包含停止控制元件的區域變數。通過右鍵單擊停止控制元件並選擇創建»區域變數來創建區域變數。通過右鍵單擊區域變數並選擇Change to Read來配置區域變數以讀取值
  3. 重要的是要注意Reinit To Default調用節點是隱式引用停止按鈕這會在下一次運行開始時將值重置為 true。
  4. 所有這些迴圈都包含一個Wait ms,以突出顯示所有迴圈都停止,無論它們的運行時間如何。

要停止三個以上的並行While迴圈,可以遵循相同的架構,添加更多區域變數以讀取頂層的停止控制元件。

屬性節點

您可以使用屬性節點將布林停止按鈕值從第一個迴圈的控制元件傳遞到所有其他迴圈。下面的程式區演示了使用屬性節點停止兩個並行的 While 迴圈。

重要細節如下:

  1. 頂部迴圈包含一個停止控制元件。通過右鍵單擊前面板上的停止控制元件並選擇Mechanical Action»Switch When Pressed來配置停止控制元件的機械動作這允許所有迴圈讀取停止布林值,latch when pressed則會讀取值后將重置為真,使一些迴圈仍在運行。
  2. 底部迴圈包含停止控制元件的屬性節點。通過右鍵單擊停止控制元件並選擇創建»屬性節點»值來創建屬性節點。通過右鍵單擊Value屬性節點並選擇Change to Read,將Value屬性節點配置為讀取值。
  3. 重要的是要注意Reinit To Default調用節點是隱式引用停止按鈕這會在下一次運行開始時將值重置為 true。
  4. 所有這些迴圈都包含一個Wait ms,以突出顯示所有迴圈都停止,無論它們的運行時間如何。

要停止兩個以上的並行 While 迴圈,請遵循相同的架構,添加更多的Value屬性節點讀取原始停止控制元件的值。

有關何時使用區域變數與屬性節點的更多信息,請參閱Control/Indicator, Local Variable, and Value Property Node Differences

通知器(Notifiers)

對於涉及復雜行為的應用程式,通知器可用於停止並行運行的多個迴圈。通知器函數可從功能面板找到,Programming»Synchronization»Notifier Operations

注意:通知器的使用很容易擴展到多個線程,但並不總是能與現有程式架構很好地集成。

以下VI snippet演示了使用通知器停止多個While迴圈的方法。

重要細節如下:

  • 頂部迴圈的每次疊代都會將停止按鈕的狀態寫入通知器。
  • 其他兩個迴圈在每次疊代中檢查通知器的狀態。

    注意:確保通知器在所有讀取它的線程都停止之前不會被釋放。在前面的VI snippet中, Merge Errors VI保證了Release Notifiers VI在所有迴圈停止之前不會執行。

  • 當您單擊停止按鈕時,停止狀態將發送到通知器,這會導致所有迴圈停止。

佇列(Queues)

您也可以使用佇列來停止並行運行的多個迴圈。佇列函數可從功能面板訪問,Programming»Synchronization»Queue Operations

注意:許多大型應用程式已經有一個佇列系統來在並行迴圈之間交換資料。在這些設置中,可以修改或增強現有佇列以包括並行迴圈的停止指令。

以下VI snippet演示了使用佇列停止多個While迴圈:

一些使用主從架構(Master-Slave)的應用程式在從線程退出之前釋放佇列。然後使用從被破壞的引用中出列所引發的錯誤來停止從屬迴圈。代替依賴錯誤條件來停止從迴圈,前面的VI snippet有一個離散的停止指令,該指令從主迴圈傳遞到從迴圈。