贊助商連結

目前分類:Queue應用 (5)

瀏覽方式: 標題列表 簡短摘要

在早期的單元裡有介紹Queue 和 Producer and Consumer 的應用: LabVIEW_多重迴路架構-Producer & Consumer架構教學範例LabVIEW_Queue的教學_用法和範例 ,但在實務上這兩種用法可能又太簡單了,實際應用上,往往步驟複雜且多元,所以這篇用LabVIEW的template-Producer/Consumer Design Pattern (Events)作範例修改成以個彈性較大的模板。

程式碼可在這邊下載 如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

image

這個範例,有兩種模式分別的功能如下:

  • Start All : 打開 燈1、燈2、燈3
  • Start 3+1 : 打開 燈3、 燈1

可以看出這兩種模式有相同的功能: 燈1、燈3,但是順序不同,在第2種模式(Start 3+1)時必須先開燈3再開燈1,這樣子重複性高、順序跳躍的形式,使用State Machine並不適合,因為要使用太多的Case去區隔不同的模式。

這個範例使用Script(劇本)的概念來運作,將每個"功能"都當作劇本中的一個小章節,不同的模式則選用不同的章節來完成:

  • Script 1 : 打開燈1、打開燈2、打開燈3
  • Script 2 : 打開燈3、 打開燈1

實際上的程式:

當Start 3+1 的按鈕被啟動後。會觸發 Producer Loop(上 Loop) 的"Start 3+1 Script",而Consumer Loop(下 Loop) 會接收到做"Start 3+1 Script"劇本,並發出指令集"Off All"、"Light 3"、"Light 2"。

image

Function: Off All、Light 1、Light 2、Light 3、Stop

image

程式碼可在這邊下載 如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

 

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

這篇介紹Producer/Consumer是什麼、應用時機和範例使用。Producer/Consumer 設計模式以 Master/Slave 模式為基礎,旨在增強以不同速率運行的多重迴路之間的數據共享。與標準的Master/Slave設計模式一樣,Producer/Consumer 模式用於分解以不同速率生成和使用數據的進程

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

 

使用Producer/Consumer的時機是要處理多個流程時候,同時每項程序又有迭代效應(前後影響、依序執行)。

使用這種模式的好處是在每個應用程序之間,擁有Queue做緩衝通信當有多個進程以不同的速度運行時,進程之間的緩衝通信(Queue)是非常有效率的辦法。例如,一個應用程序有2個回圈。第一個迴圈執行數據採集,第二個迴圈取得該數據並將其放置在網絡上。第一道迴圈的速度是第二迴圈的三倍。如果Producer/Consumer設計模式用於實施這個應用程序,數據採集過程將作為Prosucer,網絡處理為消費者(Consumer)。通過足夠大的Queue(緩衝區),Consumer可以依序處理網路數據的上載動作,這種緩衝數據的能力將使數據丟失最小化。

下面使用圖檔來做解釋:

Producer用較快的處理,Consumer為較慢的應用

簡而言之,總結: Producer/Consumer建議使用在兩個Loop有時間差的應用,舉例(1)Producer相機快速的照相,Consumer慢速存檔 (2)Producer快速資料擷取,Consumer慢速人機整理呈現...等

Producer /Consumer 架構可以直接New...-->From Template-->Producer/Consumer Design Pattern中呼叫既有的模板來使用。

LabVIEW 內建的模板有兩種,

一種是使用單純資料在Producer/Consumer中傳遞的Data類

另外一種是搭配Event強調人機互動的偵測(Event)。

 

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(1) 人氣()

這篇介紹基本LabVIEW Queue的功能用法,Queue可以搭配其他功能發展成專案的架構使用。例如之前介紹過的: LabVIEW_Queued Enum Handler + Variant 架構介紹範例分享LabVIEW_Queue State Machine with User Event程式架構介紹 都是利用Queue的FIFO特性發展成的不同架構。這篇介紹幾個基本的Queue功能: (Obtain Queue、Dequeue Element、Enqueue Element、Enqueue Element At Oppsite End、Release Queue) 。並有簡單的應用範例可以下載。

程式碼可在這邊下載 如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

Obtain Queue:

Obtain Queue必填的為Queue的資料型態(Element data type),這個是整個Queue中傳遞的資料型態,可以是任意型態,例如說Boolean、String、Numeric...,最為通用的還是使用Variant做為傳遞資料,讓資料型態不受限制,關於使用Variant 方法可以參考: LabVIEW_Queue State Machine with User Event程式架構介紹 。

Max Queue Size 在初設時是不限制數量大小,可以自由設定數字作為佇列大小的限制。

Name 填入這個Queue的命名,在同一個程式中若使用許多Queue可以用Name來區隔,值得一提的是,若是在不同的VI 中使用同一個名字的Queue,LabVIEW會認定為同一個Queue,可以使用同個Name的Queue來做跨VI中資料的傳遞。如下圖,Main VI做Enqueue的動作將資料放入佇列,而SubVI做Dequeue將資料從佇列取出。

 

Enqueue、Dequeue Element、Enqueue Element At Opposite End

Enqueue是將資料放入佇列中,而Dequeue是遵循(先入先出)FIFO的順序將資料取出,也就是說如下圖,Enqueue Element時從號碼1、2、3、4依序放入,1號是最先進入佇列的資料,則在Dequeue時也會是1號最先被解出,這就是FIFO的資料流型態。

有些應用,例如說要強制停住程式時,會使用到Enqueue Element At Opposite End,剛剛提到Dequeue遵循先入先出(FIFO)的資料流型態,Dequeue時也會是1號最先被解出,若這時候要將資料5變成優先解出,這時候就會需要Enqueue Element At Opposite End 將資料從反方向放入佇列,讓資料強行的優先被取出


Release Queue

Release Queue通常用在程式的最後,也就是程式要關閉的時候,Release 後的Queue就無法作用,這時候做Enqueue、Dequeue或是其他功能都會出現Error訊息。但是有一種情況例外,就是在Obtain Queue時提到,Queue可以用同個名字在不同地方呼叫,使用Release Queue只能釋放其中一支的Queue,除非將Force Destory改成True,才會將全部的Queue釋放。

 

Example:

下載範例可以參考如何使用這些元件;包含如何使用同名字呼叫同一個Queue、和使用Enqueue Element At Opposite End的方法和實作結果。

Enqueue Element At Opposite End:

Obtain Queue使用同名字

 

程式碼可在這邊下載 如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

在LabVIEW的Project Template中已經新增"Queued Message Handler"(簡稱QMH),QMH主要是利用Message Queue+Variant +User Event這些元素來架構而成,對於新手來看這個架構可能會讓人卻步,這篇介紹"簡易版"的QMH架構,去掉User Event,並單純化元件,讓初學者能夠了解QMH的架構精神和應用方法。在學習LabVIEW架構的起手式-State Machine後,Queue 架構是緊接著必學的程式架構技巧,這篇使用State Machine學習過的Enum元件搭配Queue使用,比起State Machine,Queue在Case輪轉中,增加架構的彈性,讓程式更為簡易好閱讀若對Queue的元件不是很熟悉,也可以參考之前的文章,只使用Queue+Event的架構:LabVIEW_Queue State Machine with User Event程式架構介紹

程式碼可在這邊下載 如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

範例人機介紹:

這篇範例使用類似CLD的範例題目Car Wash來做講解,人機畫面中,上半部是輸入的訊息,下半部是顯示訊息;為了展示Variant的彈性,特別增加了手動填入的"會員車號"的字元輸入。

功能方面,人機介面上使用者可以選擇"普通會員"或是"高級會員"選項然後選擇Start開始。若是為普通會員,會做的程序為"高壓沖水+泡沫洗車+全車擦乾";而高級會員則使比起普通會員多了"高級打蠟"。

人機下面的顯示目前進行中的程序。

範例程式重點介紹:

在程式一開始使用Enqueue Element加入Initialize的程序,讓程式可以在一開始跑的時候就執行初始化程式,確保人機介面、傳遞值還原到初始值。

Producer Loop:

Producer Loop使用Event偵測觸發事件,將須傳遞/顯示的項目轉變為Variant傳遞到下方的Consumer Loop做運算/顯示,轉換成Variant後,讓Queue的格式統一為Variant,讓傳遞的資料更為彈性

特別說明一下,將資料傳遞到Consumer做顯示可能在這範例顯得多此一舉,但是若是應用複雜時,就顯得特別重要,例如,不同觸發條件都需要更新項目,若是不使用Cosumer做統以元件的更新,就會需要使用到多個Local Variable,又或是需要更新大量的資料,造成更新時Event無法做偵測 (因為Event Case沒有完成不會繼續一下一個case)...等情況。

結束程序使用 "Enqueue Element At Oppsite End"元件,讓End程序可以優先被處理

在Queue中Enqueue從左加入Queue的程序,Deque從右取出程序,這是依照FIFO的處理程序,也就是先進先出程序。

而Enqueue Element At Oppsite End,是將程序從右邊加入,這樣Dequeue時就會先拿到新加入的項目

Consumer Loop:

將傳遞的資料依照Case做不同的資料拆解,Vairant to Data即是將資料依照定義的資料型態做轉換,這範例根據資料轉換成文字、Ring

根據使否為高級會員而給不同的Queue 程序,這裡是為了強調Queue的好處,使用Array增加Queue的程序,簡易的新增、減少程序的步驟

 

程式碼可在這邊下載 如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(1) 人氣()

這篇延續上一篇的State machine程式架構介紹(LabVIEW_State Machine(狀態機)程式架構介紹),State machine眾所皆知是LabVIEW初學中很重要的程式架構之一,但是他卻有些限制,最主要的就是他每次都只能輪轉一個case。在中小型複雜的程式需求中,會慢慢發現state machine在此彈性上的不足,使用Queue+State machine的搭配,可以一次增加或減少數個case到Queue的buffer中,這樣序列的程序堆疊,可以讓程式活用度更高

這篇的進階為LabVIEW_Queued Enum Handler + Variant 架構介紹範例分享介紹並分享一個Queue搭配Variant的用法,讓架構更為彈性,若這篇已經學習會了就可以以學習搭配Variant使用

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

和State Machine一樣,Queue State Machine 的重要元素有: While loop、Shift Register、Case Satement、Case Selector

另外加上:

  • Queue
  • Concumer loop

比起原本經典的State machine架構,Queue State Machine,更強調人機的互動性,強調人機觸發事件。而事件產生Queue堆疊功能

這裡找到一個由 Wes P  在NI的官方論壇中發表的一篇文章Queued State Machine with User Input,有一個Queue State Machine的程式給大家參考程式如何撰寫,建議直接下載這個範例,實際跑一次比較懂接下來解釋的項目。

程式碼:

上面的Producer Loop主要負責Event的事件觸發,觸發後將Queue傳到下方的Consumer Loop,而下面的Consumer LOOP則是依照先進先出(FIFO)的原則,解析Queue的動作項目

Queue的FIFO先進先出原則,如下圖,Enqueue時程序從左邊進入佇列,Dequeue時,從右邊解析佇列。所以先進入的"1"佇列會先被Dequeue出來

在這範例中,有幾個要注意的地方提醒一下:

為了讓程式能及時停下,這裡作者使用Flush讓程式強制清掉Queue中的buffer;但是在較為複雜的程式中,Enqueue的地方更多,要先確保Queue中沒有Buffer才能增加shutdown的Queue,確保除了Shutdown的其他case都已經被清除掉了。

 

其他參考資料:

 

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

 

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼