[訊息論壇] ICE Messaging Forum 塗能宇
<實作篇> 嵌入式裝置的遠端監控程式開發 ── 使用
iPush® Embedded
對傳統嵌入式裝置的操作或管理人員來說,嵌入式裝置部署之後,大部分只需要做定期維護,很少會每天檢查它的工作狀況。若是想要存取嵌入式裝置內的資料,
則是透過數據機或 RS-232 直接連線的方式,將嵌入式裝置內的資料擷取出來。
大部分的嵌入式裝置看起來都很穩定,想當然爾應該不會出什麼差錯。但嵌入式裝置往往還是逃不過莫非定律的主宰,「可能會出錯的地方一定都會出錯」,而且
,常常是無法彌補的大錯。
講一段小故事,小編以前唸的是土木水利相關科系,加上服役時又在某測量單位服役,常需要上山下海坐船漂流到外島去蒐集嵌入式測量儀器的資料。經常好不容易花了幾天到了現場,才發現外表看起來
固若金湯的「嵌入式」裝置已經被偉大的大自然力量 (風吹、日曬、雨淋) 摧殘的差不多了。
抱著最後一絲希望將嵌入式裝置接上筆記型電腦 RS-232 纜線,期待老天不要那麼不給面子。不過,通常跟買樂透彩一樣,天命注定,測量裝置裡面少則幾個禮拜、多則數月的資料,也一併回歸自然。於是統計數據上,就出現了短則數天,多則數百天的空白。然後祈禱因這些統計資料遺漏而產生的誤差,老天爺不會拿來做為來日開玩笑的藉口。
當然有數據機跟電話線的裝置就好一些,電話打通了,資料順利回來的機會就很高。不過問題在於:
-
電話打通後能不能不要中途斷線?
-
要打多少支電話?
-
會不會記得交電話費?
傳統嵌入式裝置的數據機,速度都在 9600 bps 或以下 (2400 bps 以下的,亦所在多有),跟現在大家唉聲嘆氣嫌貴嫌慢的寬頻,真是不可同日而語。若是儀器資料量多一些,資料點數多一些,除了祈禱傳資料時不要斷線,大概坐在電腦前面收資料可以收一整天。
那時候常常在想,以遠端方式存取嵌入式裝置內的資料,如果能夠跟區域網路存取資料的速度一樣,或是同等方便,那該有多好?除了歷史資料統計的精確度可以提高,更不用擔心哪一天嵌入式裝置被大自然強制退休後的資料遺失,也不用在電腦前面枯坐一整天,還怕數據機中途被不明原因斷線
,必須重頭再來。
當然 Internet 如野火一般的開始普及之後,許多 Internet 常見的服務也都加入到嵌入式裝置中。很多的嵌入式模組,已經提供乙太網路的介面,可以很方便的在區域網路中存取資料。而
以往存在桌上型電腦作業系統的檔案傳輸 (FTP) 與遠端登入 (Telnet) 功能,或近幾年的 Web 伺服器,也都被加入到嵌入式裝置系統中。
這些方式,雖然可以滿足大部分的需求,但是缺點是:每要一次資料,還是要對每一個嵌入式伺服器進行連線要求,而且,很難即時監控到所有點位的即時資料。
| iPush® Embedded
提供了一個遠距即時監控的解決方案 |
針對以上這些問題,iPush® Embedded 提供了一個透過 Internet
的遠距多點即時監控方案,除了補強 FTP、Telnet 和 Web 對即時性訊息的支援不足,更方便管理人員對數量眾多、分散各處嵌入式裝置上的資料進行即時監控。
|
圖一、iPush®
Embedded 提供一個遠距即時監控資料的機制 |
以這個範例來說,只要 WinCon-8000 連上 Internet 網路,不論監控端的距離有多遠,都可以即時監控到其所有
I/O 模組上的資料。同時,iPush® Embedded 還提供了遠端管理的能力,方便使用者進行「遠端」、或是「無螢幕
」的嵌入式系統設定。
| 使用 iPush® Embedded
ActiveX API + Visual Basic 進行遠端監控程式設計 |
在正式進入遠端監控程式設計實作課程之前,先簡單介紹一下我們將會用到的 WinCon-8000 相關 I/O 模組,以及相關的使用者設定。
輸入輸出設備簡介
我們在此使用的是泓格科技 WinCon-8000 上面的類比輸入模組
i-8024 及類比輸出模組 i-8017H,同時採用的是類比輸入輸出對接的方式,方便我們檢視相關的測試結果。
|
圖二、採用對接方式的類比輸入輸出模組
i-8024 (左) 與 i-8017H (右) |
由於類比值具有隨時間變動的特性,所以資料不斷地在變動,不斷地傳送出來。雖然我們可透過設定敏感度及頻率,來調整相關的資料擷取方式,但在這個範例中,我們直接套用系統預設的設定即可。
當要對 iPush® Embedded 下達相關的操作命令時,其實整個資訊流流程是像圖三這樣子的:
|
圖三、當一個命令由遠端
Application 下達給 iPush® Embedded (置於
WinCon-8000 內) 連接的裝置模組流程 |
我們以 ActiveX 元件使用為例,首先遠端的 Application (應用程式) 利用 iceHMsg.ocx
將資料編碼並包裝成一個 Variant 物件 ,然後利用 iPush® API (在此使用
iPushX.ocx 元件) 將資料送出。iPush® Embedded 收到後
,會將 Variant 物件傳送給 I/O 模組裝置介面,執行所需的動作。
在這裡,我們使用兩個 iceHMsg.ocx (iceHMsgIn.ocx 和 iceHMsgOut.ocx)
分別處理由 iPushX.ocx 傳送的輸入和輸出資料 。
下面圖四,說明了我們要為遠端存取所進行的設定作業。
在範例中,我們使用的 iPush® Embedded 預設帳號資料是:
Company: ice
Product: ice
Username: ice
Password: ice
預設的讀取權限 (Read Permission) 與寫入權限 (Write Permission) 都是「*」,代表可以讀寫任意的
Subject;而預設讀取權限 (Default Permission) 則是給予代表不能訂閱任何 Subject
的「- 」號:
|
圖四、利用遠端管理程式
Remote Administration 檢視與修改有關的使用者權限設定 |
前面提到 iPush® Embedded 會使用 iceHMsg.ocx 將訊息編碼包裝,然後交由
iPush® API 傳遞 給安裝在 WinCon-8000 上的 iPush®
Embedded。
所以就使用 Visual Basic 來說,程式設計前要先註冊 iPushX.ocx 及 iceHMsg.ocx
|
圖五、註冊
iPushX.ocx |
|
圖六、註冊
iceHMsg.ocx |
該二元件註冊成功之後,就可在 Visual Basic 建立專案時,引用此二元件,以便在表單中使用。
|
圖七、在
Visual Basic 中,引用此二元件 |
即使在微軟新的 .NET Framework 中,使用元件的方式也相當類似。我們將在下一期,做簡單的介紹。
在進行連線時,只要使用 iPushX.ocx 控制項,以及設定相關的連線參數:IP、Port、使用者名稱、密碼等,還有一些和
iPush® Embedded 相關的編解碼參數設定,我們都將實作在 [Connect]
按鈕事件中。
|
圖八、按下
[Connect] 鈕後會執行的連線程式碼 |
在 WinCon-8000 中,存取 I/O 模組即時資料所需的 Subject,其命名規則是依照「WC8K.系統名稱.模組名稱_插槽號碼.Tag
群組」來表示的。
我們的範例使用了兩個 I/O 模組,分別是在第 1 個插槽的類比輸出 i-8024 模組,以及在第 2 個插槽的類比輸入
i-8017H 模組。同時使用這兩個模組的第一組接頭 (Tag);所以兩個 Subject 分別是:
我們在範例中,只會用到這兩個 Subject;其中 Chobits 為出廠時的預設系統名稱。
在進行資料設定時,需要將要設定的資料類型及值,先用 iceHMsg.ocx 包裝成 Variant 物件,然後利用
iPush® API 將資料送出。舉例來說,若要將 i-8024 的輸出值設定成
+1.1 伏特,則可以用以下的敘述:
Dim floatValue as Double
floatValue=1.1
IceHMsgOut.setFloatProperty "AnalogOutput",
floatValue
varContext = IceHMsgOut.packSubjectMessage
iPushX1.ipushSendSubjectBin strSubjectFullString, varContext,
UBound
(varContext) + 1
在上面的敘述中,就是將 1.1 這個數值和 AnalogOutput 命令包裝在一起,然後使用 setFloatProperty
這個方法,將資料包裝進 variantObject 中。整個過程可分為下面幾個步驟:
-
取出使用者輸入在 Analog Out 文字方塊的數值。
-
利用 iceHMsg.ocx 包裝資料。
-
用 iPush® API
將資料送出。
整段傳送資料的程式碼如下圖九所示:
|
圖九、這一整段就是按下
[Publish] 按鈕後執行的資料傳送動作 |
而訂閱某一個模組上的某一組 I/O 點位資料時,也僅需要指定所要訂閱接收的對應 Subject 即可。
在此我們要接收的是 i-8017H 模組上第一組 I/O 點位資料,所以整段訂閱 Subject 的程式碼如下:
其中 iPushX1.usingSetData = 10 的意義是:
右邊的個位數代表
0 - 接收 DataReceived 事件
1 - 接收 SetData 事件
2 - 接收 SetData2 事件
左邊的十位數代表
0 - 接收 SubjectReceived 事件
1 - 接收 SubjectBinReceived 事件
在 iPush® API 中,傳送不同的資料種類時需要對 API 的屬性做一些調整。由於
iPush® Embedded 傳送的物件是 Variant 格式的 Byte Array,所以需要使用
Using SetData = 10。
關於更詳細的說明,請參閱 ICE Developer Center 內有關 iPush®
V1.5 SE ActiveX API 的說明文件,以獲得進一步資訊。
在 iPush® Embedded 中,資料的接收都是透過回呼函式 (Callback)
來完成,以便進行資料 接收後的邏輯處理。在這邊我們只做兩件事:
-
用 iceHMsg 解開編碼的資料。
-
將資料顯示在 Analog In 的方塊中。
這個範例程式完成後,可以在一般的 Windows 作業系統 (NT/2000/XP) 中執行。依序按下 [Connect]
鈕、[Subscribe Analog Input] 鈕後,即準備好 要接收來自
i-8017H 模組的即時資料了。
下圖是在 Analog Out 欄位輸入 5 (V) 值後,按下 [Publish to Analog Output]
鈕的操作結果:
|
圖十二、從
i-8024 送一個 5 V電壓訊號,再從 i-8017H 收到資料的結果 |
所有模組上的點位資料,都可以套用類似上例的遠端處理方式,完成資料即時傳送或是即時接收的工作。20 時鐘就解決了以前必須爬山涉水才能得到資料的辛勞。
在下一期的內容中,我們將進一步討論如何利用幾乎相同的程式碼,在 Excel、PDA 上展現即時的資料擷取。
|