-
VC++開發基于LNS的LonWorks網絡數據監控接口
- 發布時間:2008/11/23 7:51:57
修改時間:2008/11/22 10:14:39 瀏覽次數:2998
-
-
The data monitor and control interface development based on LNS LonWorks network by Visual C++
北京三維力控科技有限公司 林威漢
摘要:本文介紹了用Visual C++ 6.0開發工具,在LNS環境下,開發LonWorks網絡數據監控接口的方法,舉例闡述了軟件實現過程。對于相關系統的設計、開發具有一定的參考價值。
關鍵詞:LNS、LonkWorks網絡數據監控接口
Abstract:The data monitor and control interface development based on LNS LonWorks network by Visual C++ 6.0 is introduced .And sample programming code is shown. This article is referenced by people who are developing LNS system.
Key words:LNS、LonWorks network data monitor and control interface
1 引言
近年來,現場總線技術迅猛發展,取代傳統的集中式控制系統已成必然。LonWorks技術是美國ECHELON公司在1991年推出的一種控制局域網絡,它以其優秀的分布處理能力、開放性、互操作性、多媒介適應能力以及多網絡拓撲結構等特性適應了未來發展對測控網絡的要求,成為眾多總線中的佼佼者。與其它現場總線相比,它具有組網方便,通訊速率快,不局限于通訊介質等優點。目前其在國內的應用非常廣泛,工程實例遍及樓宇控制,智能小區,工廠,礦井監控等場合,是一種具有良好發展前景的總線。
2 LNS開發接口與開發工具
LNS(LonWorks Network Services)是ECHELON提供的一個專為LonWorks網絡服務的網絡操作系統。LNS封裝了對LonWorks網絡的各種操作,如:網絡安裝、網絡維護、變量連接等。在Windows環境下,LNS提供了基于ActiveX和COM組件方式的開發接口。這兩種方式在功能和性能上都沒有什么差異,而ActiveX使用起來更為簡便,一般也不需要開發 人員了解很多OLE方面的知識,因而更易于被接受。本文所列舉的實例采用的就是ActiveX方式。
采用ActiveX方式開發LonWorks網絡通信接口可選擇的開發工具十分豐富。Visual C++ 6.0目前仍然是開發自動化軟件的主流工具之一。當在VC環境下用ActiveX接口開發LonWorks網絡通信接口程序時,在實現過程和方法上與其它語言差別不大。只是在一些與VC語言特性相關的環節上,如果處理不當,就會影響接口程序的健壯性、穩定性?!?BR> LNS由LNS Server、LNS Object Server COM Component、Data Server和Network Interface幾個主要部分 組 成,提供了從網絡變量監測到網絡管理和維護等完整的功能接口。在開發LonWorks網絡數據監控接口程序時,涉及的只 是 其 中的數據監控部分的功能。
3 LNS實現監控的過程
LNS提供了兩種網絡監控方式,一種是監控集(Monitor set)方式,一種是單點(Single point)方式。兩種方式都是以監控點(Monitor points)為基本 單位。一個監控點對應一個網絡變量或應用消息。
監控集建立后就被保存在Data Sever中,即使應用程序關閉也仍然存在。單點方式每次都需要應用程序重新創建,退出時釋放。監控集方式適用于監控任務比較繁重的場合,單點方式適合監控任務較輕,點數較多的情況。
無論是監控集或是單點方式,都要使用監控點。監控點有以下幾種監控方式:顯式讀寫、隱式綁定、查詢、顯示綁定。
對于顯式讀寫方式,接口程序可以直接讀寫監控點的數值。在隱式綁定方式下,可以將一個監控點與一個節點的網絡變量綁定,當網絡變量變化時,會用事件NvMonitorUpdateEvent通知接口程序,接口程序根據消息參數可以取得更新的數據。當使用查詢方式時,每隔一個周期就觸發一次NvMonitorUpdateEvent事件。當使用顯式綁定方式時,對應設備結點的一個或多個網絡變量,要在上位機上創建并綁定一個網絡變量,而這個網絡變量又可以用其它三種方式進行監控。這種方式主要為了實現用一個監控點同時監測多個結點網絡變量。
這幾種方式分別適用于不同的場合。查詢方式適用于監控任務繁重,但對數據采集的實時性要求不高的場合。隱式綁定適用于監控任務較輕,但數據變化要求實時處理的場合。當現場數據變化頻繁時,用顯式讀寫或查詢方式會導致應用程序的運行速度緩慢。
本文列舉的實例采用的是監控集方式,監控點采用的是隱式綁定方式以獲得較好的實時性和較高的效率。
4 接口程序的設計與實現
在安裝了Echelon的LNS Application Developer's Kit開發包之后,就可以使用開發包中提供的lnsobjectserver控件了。最簡單的方法是在一個對話框資源上插入這個控件,然后用這個對話框創建一個類,將創建監測集、獲取監控點數據等各種操作全都封裝在這個類里,以供接口程序的其它模塊調用。本文實例中創建了一個名為CObjServerDlg的類。這個類提供實現以下幾個最主要的接口。
1)、對LNS對象服務器進行初始化的接口。
在這個接口時里,具體實現的內容包括:
設置對象服務的用戶模式(單用戶或多用戶);
設置遠程或本地方式;
打開服務器;
設置網絡接口,打開網絡;
設置系統;
設置網絡服務設備;
打開系統;
設置通道;
得到監控集對象;
設置監控集的屬性;
獲得包含要監控的網絡變量的設備對象;
將要監控的網絡變量添加到監控點中;
打開監控集。
調用lnsobjectserver控件方法可以逐步實現上述初始化過程。需要注意的是VC對異常情況的處理,不進行異?;蛱幚聿划敃е陆涌诔绦虺霈F各種莫名錯誤。下面舉例說明:
void CObjServerDlg::InitObjServer()
{
m_ObjSvr.SetRemoteFlag(FALSE);
m_ObjSvr.SetSingleUserMode(FALSE);
m_ObjSvr.Open();
if (!m_ObjSvr.GetIsOpen())
{
ShowEvent("創建LNS Server失敗!");
return;
}
//設置網絡
LcaNetworks Networks(m_ObjSvr.GetNetworks());
try
{
//在獲取網絡對象時要捕獲異常
m_ActiveNetwork = Networks.GetItem(COleVariant(m_csNetworkName));
ASSERT (m_ActiveNetwork.m_lpDispatch != NULL);
}
catch (COleDispatchException *pE)
{
//對異常的正確處理
if (LCA_ERR_RANGE_START+LCA_OBJECT_NOT_FOUND ==
pE->m_scError + OLE2LNS_CONVERSION)
{
CString csEvent;
csEvent.Format("網絡%s不存在!", m_csNetworkName);
ShowEvent(cs);
}
else
ShowEvent(pE->m_strDescription);
pE->Delete();
return;
}
......
//其它部分代碼
}
2)、處理NvMonitorUpdateEvent事件消息。當網絡變量變化時,LNS會發送NvMonitorUpdateEvent消息通知接口程序。在這個消息函數中會將數值變化的監控點、數據點、源地址以參數的形式傳遞過來。通過這些參數可以獲取變化數據的原始值和格式化值。這里需要注意的是如果LNS用的是VT_BSTR格式傳值,在獲取變化的數值后,必須正常釋放資源。否則接口程序就會持續不斷地占用系統內存,直至內存耗盡。下面舉例說明:
// 將格式化的變化值賦給一個VARIANT型變量
VARIANT NvFmtValue = UpdateDataPoint.GetFormattedValue();
if (NvFmtValue.vt == VT_BSTR)
{
CString csNvFmtValue = NvFmtValue.bstrVal;
ShowVaule(csNvFmtValue);
SysFreeString(NvFmtValue.bstrVal); // 必須正確釋放內存資源
}
3)、實現對監控點進行寫操作的接口。
寫操作和讀操作的過程一樣,也涉及使用原始數值格式和格式化數值格式的選擇。
按照格式化數值格式進行寫入時過程比較簡單,示例代碼如下:
LcaDataPoint DataPoint = NvMonitorPoint.GetDataPoint();//得到要寫入的數據點對象
ASSERT(DataPoint.m_lpDispatch != NULL);
DataPoint.SetFormattedValue(COleVariant(csWriteData));
//csWriteData是一個CString類型的變量,代表寫入的數值
如果按照原始格式進行寫操作,要注意的是LNS要求使用一種"VT_ARRAY | VT_UI1"型的VARIANT變量作為寫入值,示例代碼如下:
LcaDataPoint DataPoint = NvMonitorPoint.GetDataPoint();//得到要寫入的數據點對象
ASSERT(DataPoint.m_lpDispatch != NULL);
SAFEARRAY SafeArray;
SafeArray.cDims = 1;
SafeArray.fFeatures = 128;
SafeArray.cbElements = 1;
SafeArray.cLocks = 0;
SafeArray.rgsabound[0].cElements = nWrtDataLen;
SafeArray.rgsabound[0].lLbound = 1;
SafeArray.pvData = pszWriteData;//表示寫入值的字符串指針
VARIANT NvRawValue;
NvRawValue.vt = VT_ARRAY | VT_UI1;
NvRawValue.parray = &SafeArray;
DataPoint.SetRawValue(NvRawValue);
if(!DataPoint.GetAutoWrite())
DataPoint.Write();
5 結束語
本文介紹了在LNS環境下,開發LonWorks網絡數據監控接口的方法。并結合VC編程語言的特點,著重說明在一些關鍵環節上的處理方法??蔀槠渌O計、開發相關系統的開發人員提供參考。
參考文獻
[1] ECHELON公司。LNS for Windows Programmer's Guide,2000。
[2] 雷剛,呂國強?;贚NS和COM的LonWorks網絡監控軟件開發