2012年11月8日 星期四

連結與使用 Shared Variable

前一篇,我建立了一個叫作 Temperature 的 Network Shared Variable,它的完整路徑如下,其中 192.168.2.106 是我的電腦 IP Address:

\\192.168.2.106\NSV_Demo\Temperature

現在我們來連結並使用這個這個網路共用變數:

Step 1: 首先,建立一個新的專案,然後把它存起來:

image

Step 2: 在專案裏建立一個新的 VI,我打算用 Thermometer 來顯示 Temperature 網路共用變數的內容,所以設計如下一個很簡單的程式:

imageimage

Step 3: 接著在 Project Explorer 中,點 New > Variable:

image

Step 4: 輸入新的共用變數的屬性,然後按下 OK:

  • Name: 可以隨意取個變數名稱,例如 RemoteTemperature
  • Variable Type: 選擇 Network-Published
  • Enable Aliasing: 把它勾起來
  • Binding to: 選擇 PSP URL,並在右手邊的 TextBox 輸入我們前一篇建立的 Temperature 共用變數的完整路徑 \\192.168.2.106\NSV_Demo\Temperature

image

Step 5: 新的共用變數 RemoteTemperature 建立好後,接著從 Project Explorer 視窗中把共用變數拖曳放到 Block Diagram,順便把 RemoteTemperature 和 Thermometer 連起來,如下:

image

Step 6: 程式到這裏就算完成了,現在可以來測試這支程式,看它能否存取另一支程式的 Temperature 共用變數。方法很簡單,前一篇的程式和這一篇的程式,兩支程式只要一起跑就行了:

image  image

你會發現,當我在滑動左手邊視窗的 Temperature 時,右手邊視窗的 Thermometer 也會同步更新,這就是所謂的共用變數,它讓應用程式和遠端電腦可以透過網路傳遞與分享資料。

參考資料

建立 Network Shared Variables

傳統上,應用程式之間若要經由網路交換資料,要考慮的事情很多,例如選擇適合的網路協定、定義傳輸的資料格式、選擇程式庫等,這些工作會耗掉很多開發資源與時間。LabVIEW 提供了一個叫作 Network Shared Variables 的變數型別,顧名思義,Network Shared Variables 意思就是可以讓應用程式或是遠端電腦在網路上共用的一種變數,使用 Network Shared Variables 可以大大簡化應用程式之間傳遞資料的繁雜工作。在這篇,我將示範如何建立 Network Shared Variables,我所用的環境為 在 Windows 7 和 LabVIEW 2012。

由於建立 Network Shared Variables 必須使用專案來管理,所以我們從頭開始做起,先建立範例專案與範例 VI:

Step 1: 打開 LabVIEW,在 Startup Window 中點選 Create Project:

image

選擇 Blank Project 並按下 Finish 建立專案:

image

完成後,會產生一個未命名的專案 (如下圖左),我們先把專案存檔,本例將專案取名為 NSV_Demo.lvproj (如下圖右):

image  image

Step 2: 點擊選單 File > New VI 以建立一個新的 VI,然後設計如下的程式。如下圖左,在 Front Panel 上放置一個 Vertical Pointer Slide;如下圖右,在 Block Diagram 上放個 While Loop 迴路與 Timer。然後把 VI 檔儲存起來,本例將 VI 檔取名為 Temperature.vi:

image image

Step 3: 切到 Project Explorer 視窗,如下圖,在 My Computer 上按右鍵,並在右鍵選單上點擊 New > Variable 以建立共用變數:

image

Step 4: 接著要設定共用變數的屬性,參考下圖,把變數名稱設為 Temperature,變數型別 (Variable Type) 設定為 Network-Published,這代表新建立的 Temperature 變數會是一是網路共用的變數。至於 Data Type 有非常多選擇,例如 Boolean, Double, Integer, Variant 等等,而且還有 Arrary 變數可供選擇,此處我們使用預設的 Double 即可:

image

按下 OK 完成變數的建立工作。由於 LabVIEW 把共用變數納入 Library 管理,所以新建立的 Temperature 變數會放在未命名的 library 中,如下圖所示:

image

把 library 存檔,取名為 NSV_Demo.lvlib:

image

Step 5: 接著便可以使用共用變數來傳遞資料,方法很簡單,只要用滑鼠直接從專案視窗把 Temperature 變數拖曳到 Block Diagram 即可:

image

Step 6: 在 Temperature 共用變數上按右鍵,並點選 Access Mode > Write 把變數屬性改成 Write Mode:

image

Step 7: 參考下圖,把 Temperature Control 跟 Temperature 共用變數連接起來,程式即告完成:

image

Step 8: 接著切到 Front Panel,按下工具列的 Run 鈕執行程式,此時你會看到像下圖一樣的 Deployment Process 視窗,注意紅框表示處的 \\192.168.2.106\NSV_Demo\Temperature 便是網路共用變數的完整路徑,將來其它程式或遠端電腦要存取這個共用變數時,就要使用這個路徑:

image

按下 Close 鈕,這時候可能會跳出如下的安全性警訊,請按下「允許存取」:

image

Step 9: 現在,當你在 Front Panel 上滑動 Slide 改變溫度時,Temperature 共用變數的內容也會同步改變,要如何確認呢?請接著看下一步:

image

Step 10: 打開 Distributed System Manager (位置在 National Intruments 程式集裏),這時候可能會跳出如下的安全性警訊,請按下「允許存取」:

image

然後展開 localhost > NSV_Demo > Temperature,現在你應該會看到 Temperature 共用變數的即時讀值,試著切回 VI 程式,然後滑動 Slide 以改變溫度,然後你應該會發現 Distributed System Manager 上的 Temperature 變數值也會同步更新:

image

在這個範例裏面,我們用 Vertical Pointer Slide 當作共用變數的輸入,這是為了方便說明才這麼做,在真正的應用場合中,其實可以結合硬體擷取傳感器的資料,然後在遠端電腦或是行動裝置讀取共用變數作即時的監控,這樣應該會很方便很有幫助。

參考資料

2012年11月7日 星期三

Windows XP Firewall 如何一次開多個 Ports

微軟的 Windows 作業系統現在都內建 Windows Firewall,會幫電腦阻擋惡意軟體的網路攻擊。如下圖,Windows Firewall 的介面是視覺化的,它可以讓你開啟 Port,可是一次只能設定一個 Port (如下圖二)。如果你需要開很多個 Ports,可以在命令列下 (Command Prompt) 以指令的方式操作,底下說明怎麼做。

2012-11-07_14h32_46

2012-11-07_14h33_19

一次開多個 Ports

假設我們要開 UDP 1234 到 1238 這 5 個 ports,操作步驟如下:

Step 1: 點選 "開始 > 執行",輸入 cmd,然後按下確定打開命令列視窗:

2012-11-07_14h47_40

Step 2: 在命令列視窗輸入底下指令:

FOR /L %I IN (1234,1,1238) DO netsh firewall add portopening UDP %I "UDP "%I

輸入指令,按下 Enter 後,Windows Firewall 就會開啟 1234 到 1238 這 5 個 ports。如下圖,Windows 會顯示指令執行後的結果,回應 "確定" 表示 Port 有開啟成功:

image

Step 3: 打開 Windows Firewall,切到 "例外" 頁面,檢查例外清單,確認 1234 到 1238 這 5 個 ports 有沒有成功開啟:

image

如果要一次關掉多個 Port,例如把前面打開的 5 個 ports 全部關掉,則指令為:

FOR /L %I IN (1234,1,1238) DO netsh firewall del portopening UDP %I

執行畫面如下:

image

不只 UDP Ports,TCP Ports 也可以,只要把 Protocol 參數改為 TCP 即可:

一次開多個 TCP Ports:

FOR /L %I IN (1234,1,1238) DO netsh firewall add portopening TCP %I "TCP "%I

一次關閉多個 TCP Ports:

FOR /L %I IN (1234,1,1238) DO netsh firewall del portopening TCP %I

如果要開的 Ports 號碼是不連續的呢?也可以,把指令稍微調整一下就好:

一次開多個 UDP Ports,Port 號碼不連續:

FOR %I IN (1234, 5678, 8765, 4321) DO netsh firewall add portopening UDP %I "UDP "%I

一次關閉多個 UDP Ports,Port 號碼不連續:

FOR %I IN (1234, 5678, 8765, 4321) DO netsh firewall del portopening UDP %I

如果怕記不住,可以把指令儲存成 .bat 批次檔,下回你只要跑一下批次檔就行了。不過,要特別注意一件事!在批次檔中,變數的指定必須使用 %%variable,而不是用 %variable,像這樣:

FOR /L %%I IN (1234,1,1238) DO netsh firewall add portopening UDP %%I "UDP "%%I

Well, 同樣是變數的指定,在命令列下跟批次檔裏,寫法居然不一致,我知道,這很怪,但微軟 DOS 指令就是這麼設計的,儘管納悶也拿他沒法子!:-)

參考資料