應用設計架構:主/從模式

更新 Jan 5, 2022

環境

軟體

  • LabVIEW

主/從設計模式是LabVIEW開發人員使用的其中一種基礎架構。當您有兩個或兩個以上需要同時且連續且以不同速率運行的程式時,將使用它。如果這些程序在單個迴圈中運行,則可能會出現嚴重的時序問題。當迴圈的一部分執行時間比預期的長時,就會發生這些時序問題。如果發生這種情況,迴圈中的其餘部分將被延遲。主/從模式包括多個平行迴圈。每個迴圈可以不同的速率執行任務。在這些平行迴圈中,一個迴圈充當主迴路,另一個迴圈充當從屬迴路。主迴路控制所有從屬迴路,並使用消息傳遞體系結構(messaging architectures)與其通訊。

主/從模式是在同時擷取資料時響應用戶介面控件時最常用的模式。假設您要編寫一個應用程式,該應用程式每五秒鐘量測並記錄一次緩慢變化的電壓。它從傳輸線獲取波形,並每100毫秒將其顯示在圖形上,還提供一個用戶介面,允許用戶更改每次獲取的參數。
主/從設計模式非常適合此應用程式。在此應用程式中,主迴圈將包含用戶介面。電壓擷取和記錄將在一個從迴圈中進行,而通過傳輸線擷取資料和繪圖將在另一個從迴圈中進行。

涉及控制的應用程式可以受益於主/從設計模式的使用。其中一個範例是用戶與自由動作機械臂的交互。這種類型的應用程式非常注重控制,因為如果處理不當,可能會對手臂或周圍環境造成物理損壞。例如,如果用戶指示手臂停止其向下移動,但是程式被手臂旋轉控件佔用,則機械手可能會與支撐平台碰撞。通過將主/從設計模式應用於應用程式可以避免這種情況。在這種情況下,用戶介面將由主迴圈處理,並且機械手臂的每個可控部分都將具有自己的從屬迴圈。使用這種方法,手臂的每個可控部分都會有自己的迴圈,因此也就有自己的處理時間。
這將允許通過用戶介面對機器人手臂進行更靈活的控制。

為什麼要使用主/從模式?

創建多任務應用程式時,主/從設計模式非常有優勢。由於具有多迴圈功能,它為您提供了一種更具模組化的方法來進行應用程式開發,但最重要的是,它使您可以更好地控制應用程式的時間管理。在LabVIEW中,每個平行迴圈都被視為單獨的任務或執行緒。執行緒被定義為可以獨立於其他部分執行的程式的一部分。如果您有一個不使用單獨執行緒的應用程式,則該應用程式將被系統視為一個執行緒。當您將應用程式劃分為多個執行緒時,它們彼此之間平均共享處理時間。

這使您可以更好地控制應用程式的計時方式,並向用戶提供對應用程式的更多控制權。 LabVIEW的平行特性有助於實現主/從設計模式。

對於上面的資料擷取範例,我們可以想像將電壓量測和波形擷取放到一個迴圈中,而僅在迴圈的第50次迭代中執行電壓量測。與單次擷取和顯示波形相比,完成電壓量測和將資料記錄到磁盤可能需要更長的時間。如果是這種情況,則波形擷取的下一個迭代將被延遲,因為它無法在上一個迭代中的所有代碼完成之前開始。另外,這種架構將導致難以在不改變將電壓記錄到磁盤的速率的情況下改變擷取波形的速率。

此應用程式的標準“主/從”設計模式方法是將擷取程序置於兩個單獨的迴圈(“從”迴圈)中,兩者均由主迴圈驅動,該主迴圈輪詢用戶介面(UI)控制元件以查看參數是否已更改。為了與從屬迴圈通訊,主迴圈寫入局部變數(local variable)。這將確保每個獲取程序都不會影響彼此,並且確保由用戶介面引起的任何延遲(例如,彈出對話框)都不會延遲任何獲取程序的迭代。

建立主/從應用程式

主/從設計模式由多個平行迴圈組成。控制其他所有迴路的是主迴路,其餘迴路是從屬迴路。一個主迴路始終驅動一個或多個從屬迴路。由於這些迴圈之間直接進行資料通訊會中斷資料流程(data flow),因此必須通過寫入和讀取消息傳遞體系結構(即LabVIEW中的局部或全局變數,事件結構,通知器或隊列)來完成。下圖顯示如何使用共享資料將不同的環路彼此連接。

演示-同步迴圈

此應用程式具有以下要求:

  • 創建一個列隊的消息處理程式(Queued Message Handler) 來處理用戶介面。用戶介面應包含兩個帶LED的切換程序按鈕和一個退出按鈕。

  • 創建兩個單獨的程序,以不同的速率(間隔為100和200 ms)打開和關閉單個LED。這兩個程序將使用用戶介面進行控制。


我們的第一步將是確定哪個程序將成為主程序,哪個程序將成為從屬程序。在此演示中,用戶介面將放置在主迴圈中,並且兩個閃爍的LED程序將是兩個從屬迴圈。用戶介面將使用局部變數控制每個從屬迴圈的操作。

現在,我們準備開始LabVIEW Master / Slave應用程式。要查看最終的主/從應用程式,請打開附件 masterslave.zip 的 SynchLoops.vi

消息傳遞體系結構(共享資料)

問題:如果多個迴圈嘗試同時將資料寫入共享變數,則無法確定最終將寫入哪個值。這被稱為競爭條件。

解決方案:將“獲取/釋放信號量(Semaphore) ”配對放在寫入全局的任何程式碼段周圍。這樣可以確保多個迴圈不會嘗試同時寫入全局變數。 LabVIEW隨附的範例中有一對演示了信號量的用法。信號量將在寫入時鎖定全局資料,以避免出現競爭狀況。

同步化

問題:由於主/從設計模式不基於同步,所以從屬迴圈可能在主迴圈之前開始執行。因此,在從屬迴圈開始執行之前初始化主迴圈可能是一個問題。

解決方案:可以使用事件發生來解決這類同步問題。


要查找演示使用事件發生的範例,請參考LabVIEW附帶的範例。下圖給出了有關如何使用事件的例子。


 

 

Attachments