2012年3月1日 星期四

Shift Register

這篇我們將介紹 LabVIEW 的 Shift Register。

在 LabVIEW,Shift Register 可以加到 While Loop 和 For Loop 中。Shift Register 提供一個在迴圈迭代 (Loop Iteration) 之間傳遞資料的方法。讓我們從一個簡單的例子來認識 Shift Register。

認識 Shift Register

底下是一個簡單的 While Loop,迴圈裏只有一個 Wait (ms) 等待 1000 ms 的 function:

2012-01-29 01h03_25 2012-01-29 01h03_55

要建立 Shift Register,方法是在 Loop 的邊框上按右鍵,然後點選 Add Shift Register:

2012-01-29 01h04_31

這會建立一個 Shift Register,結果如下圖:

2012-01-29 01h18_37
▲ Shift Register 是由左右兩個 Terminals 組成,兩兩一對

簡單的說,你可以把一個輸出接到右邊的 terminal (簡稱 right terminal),然後在下一個 loop iteration 中透過左邊的 terminal (簡稱 left terminal) 取得結果。而且,你也可以在 left terminal 輸入端接個起始值。

所以我們可以建立這樣一個程式:

2012-01-29 01h53_45 2012-01-29 01h54_24

在這支程式中,While Loop 會不斷的執行直到使用者按下 Stop 鈕為止,而且會在結果上面顯示 left terminal 加 1 後的結果,所以當迴圈執行到第 5 圈時,結果上面就會顯示數字 5:

2012-01-29 01h59_31 

我們可以在 Block Diagram 的工具列點選 Highlight Execution 這個按鈕,方便觀察資料流的傳遞過程:

image 
▲ Highlight Execution 按鈕的位置

image

現在當我們再執行這支程式,LabVIEW 就會動態的逐一顯示每段資料流的實際執行過程,所以,當迴圈執行到第 1 圈時,得到的畫面如下:

image

注意上圖 Highlight 的部份,目前 left terminal 是 0,而 Add function 加 1 後的輸出為 1,因為輸出會接到 right terminal,所以這時 right terminal 也是 1。當迴圈執行到第 2 圈時,得到的畫面如下:

image

而第 3 圈如下:

image

由此,可以得知 Add function 的輸出會放到 right terminal,所以 right terminal 保存的是目前這個 iteration 的結果,而 left terminal 裏放的則是前一個 iteration 的結果。

初始化 Shift Register

在這篇的例子中,你應該有注意到 left terminal 上有設定一個起始值 0:

image
▲ 為了簡化圖形程式碼,我把 Add function 換成 Increment function

起始值是用來設定 left terminal 在第 1 圈的初始值。假如我們沒有給 left terminal 初始值的話,left terminal 會取得迴圈前一次的執行結果。

所以,如果我們現在拿掉 left terminal 的初始值:

2012-01-29 11h43_51

然後再跑這支程式,當迴圈執行到第 8 圈時得到的結果如下,其中 left terminal 是 7 而 right terminal 是 8:

image

假如這時我停止程式,然後在不關閉 LabVIEW 的情況下按 Run 鈕重新跑這支程式,那麼就會發現 left terminal 這次會從 8 開始,也就是取得前一次 right terminal 的結果,而不是從 0 開始:

image

所以,在使用 Shift Register 的時候,記得要替 Shift Register 設定初始值。

參考資料

0 意見: