當(dāng)前位置: 首頁 >
發(fā)布日期:2022-04-18 點(diǎn)擊率:81
1 引言 近年來,現(xiàn)場總線技術(shù)迅猛發(fā)展,取代傳統(tǒng)的集中式控制系統(tǒng)已成必然。LonWorks技術(shù)是美國ECHELON公司在1991年推出的一種控制局域網(wǎng)絡(luò),它以其優(yōu)秀的分布處理能力、開放性、互操作性、多媒介適應(yīng)能力以及多網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)等特性適應(yīng)了未來發(fā)展對(duì)測控網(wǎng)絡(luò)的要求,成為眾多總線中的佼佼者。與其它現(xiàn)場總線相比,它具有組網(wǎng)方便,通訊速率快,不局限于通訊介質(zhì)等優(yōu)點(diǎn)。目前其在國內(nèi)的應(yīng)用非常廣泛,工程實(shí)例遍及樓宇控制,智能小區(qū),工廠,礦井監(jiān)控等場合,是一種具有良好發(fā)展前景的總線。 2 LNS開發(fā)接口與開發(fā)工具 LNS(LonWorks Network Services)是ECHELON提供的一個(gè)專為LonWorks網(wǎng)絡(luò)服務(wù)的網(wǎng)絡(luò)操作系統(tǒng)。LNS封裝了對(duì)LonWorks網(wǎng)絡(luò)的各種操作,如:網(wǎng)絡(luò)安裝、網(wǎng)絡(luò)維護(hù)、變量連接等。在Windows環(huán)境下,LNS提供了基于ActiveX和COM組件方式的開發(fā)接口。這兩種方式在功能和性能上都沒有什么差異,而ActiveX使用起來更為簡便,一般也不需要開發(fā)人員了解很多OLE方面的知識(shí),因而更易于被接受。本文所列舉的實(shí)例采用的就是ActiveX方式。 采用ActiveX方式開發(fā)LonWorks網(wǎng)絡(luò)通信接口可選擇的開發(fā)工具十分豐富。Visual C++ 6.0目前仍然是開發(fā)自動(dòng)化軟件的主流工具之一。當(dāng)在VC環(huán)境下用ActiveX接口開發(fā)LonWorks網(wǎng)絡(luò)通信接口程序時(shí),在實(shí)現(xiàn)過程和方法上與其它語言差別不大。只是在一些與VC語言特性相關(guān)的環(huán)節(jié)上,如果處理不當(dāng),就會(huì)影響接口程序的健壯性、穩(wěn)定性。 LNS由LNS Server、LNS Object Server COM Component、Data Server和Network Interface幾個(gè)主要部分組成,提供了從網(wǎng)絡(luò)變量監(jiān)測到網(wǎng)絡(luò)管理和維護(hù)等完整的功能接口。在開發(fā)LonWorks網(wǎng)絡(luò)數(shù)據(jù)監(jiān)控接口程序時(shí),涉及的只是其中的數(shù)據(jù)監(jiān)控部分的功能。 3 LNS實(shí)現(xiàn)監(jiān)控的過程 LNS提供了兩種網(wǎng)絡(luò)監(jiān)控方式,一種是監(jiān)控集(Monitor set)方式,一種是單點(diǎn)(Single point)方式。兩種方式都是以監(jiān)控點(diǎn)(Monitor points)為基本單位。一個(gè)監(jiān)控點(diǎn)對(duì)應(yīng)一個(gè)網(wǎng)絡(luò)變量或應(yīng)用消息。 監(jiān)控集建立后就被保存在Data Sever中,即使應(yīng)用程序關(guān)閉也仍然存在。單點(diǎn)方式每次都需要應(yīng)用程序重新創(chuàng)建,退出時(shí)釋放。監(jiān)控集方式適用于監(jiān)控任務(wù)比較繁重的場合,單點(diǎn)方式適合監(jiān)控任務(wù)較輕,點(diǎn)數(shù)較多的情況。 無論是監(jiān)控集或是單點(diǎn)方式,都要使用監(jiān)控點(diǎn)。監(jiān)控點(diǎn)有以下幾種監(jiān)控方式:顯式讀寫、隱式綁定、查詢、顯示綁定。 對(duì)于顯式讀寫方式,接口程序可以直接讀寫監(jiān)控點(diǎn)的數(shù)值。在隱式綁定方式下,可以將一個(gè)監(jiān)控點(diǎn)與一個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)變量綁定,當(dāng)網(wǎng)絡(luò)變量變化時(shí),會(huì)用事件NvMonitorUpdateEvent通知接口程序,接口程序根據(jù)消息參數(shù)可以取得更新的數(shù)據(jù)。當(dāng)使用查詢方式時(shí),每隔一個(gè)周期就觸發(fā)一次NvMonitorUpdateEvent事件。當(dāng)使用顯式綁定方式時(shí),對(duì)應(yīng)設(shè)備結(jié)點(diǎn)的一個(gè)或多個(gè)網(wǎng)絡(luò)變量,要在上位機(jī)上創(chuàng)建并綁定一個(gè)網(wǎng)絡(luò)變量,而這個(gè)網(wǎng)絡(luò)變量又可以用其它三種方式進(jìn)行監(jiān)控。這種方式主要為了實(shí)現(xiàn)用一個(gè)監(jiān)控點(diǎn)同時(shí)監(jiān)測多個(gè)結(jié)點(diǎn)網(wǎng)絡(luò)變量。 這幾種方式分別適用于不同的場合。查詢方式適用于監(jiān)控任務(wù)繁重,但對(duì)數(shù)據(jù)采集的實(shí)時(shí)性要求不高的場合。隱式綁定適用于監(jiān)控任務(wù)較輕,但數(shù)據(jù)變化要求實(shí)時(shí)處理的場合。當(dāng)現(xiàn)場數(shù)據(jù)變化頻繁時(shí),用顯式讀寫或查詢方式會(huì)導(dǎo)致應(yīng)用程序的運(yùn)行速度緩慢。 本文列舉的實(shí)例采用的是監(jiān)控集方式,監(jiān)控點(diǎn)采用的是隱式綁定方式以獲得較好的實(shí)時(shí)性和較高的效率。 4 接口程序的設(shè)計(jì)與實(shí)現(xiàn) 在安裝了Echelon的LNS Application Developers Kit開發(fā)包之后,就可以使用開發(fā)包中提供的lnsobjectserver控件了。最簡單的方法是在一個(gè)對(duì)話框資源上插入這個(gè)控件,然后用這個(gè)對(duì)話框創(chuàng)建一個(gè)類,將創(chuàng)建監(jiān)測集、獲取監(jiān)控點(diǎn)數(shù)據(jù)等各種操作全都封裝在這個(gè)類里,以供接口程序的其它模塊調(diào)用。本文實(shí)例中創(chuàng)建了一個(gè)名為CObjServerDlg的類。這個(gè)類提供實(shí)現(xiàn)以下幾個(gè)最主要的接口。 1)、對(duì)LNS對(duì)象服務(wù)器進(jìn)行初始化的接口。 在這個(gè)接口時(shí)里,具體實(shí)現(xiàn)的內(nèi)容包括: 設(shè)置對(duì)象服務(wù)的用戶模式(單用戶或多用戶); 設(shè)置遠(yuǎn)程或本地方式; 打開服務(wù)器; 設(shè)置網(wǎng)絡(luò)接口,打開網(wǎng)絡(luò); 設(shè)置系統(tǒng); 設(shè)置網(wǎng)絡(luò)服務(wù)設(shè)備; 打開系統(tǒng); 設(shè)置通道; 得到監(jiān)控集對(duì)象; 設(shè)置監(jiān)控集的屬性; 獲得包含要監(jiān)控的網(wǎng)絡(luò)變量的設(shè)備對(duì)象; 將要監(jiān)控的網(wǎng)絡(luò)變量添加到監(jiān)控點(diǎn)中; 打開監(jiān)控集。 調(diào)用lnsobjectserver控件方法可以逐步實(shí)現(xiàn)上述初始化過程。需要注意的是VC對(duì)異常情況的處理,不進(jìn)行異常或處理不當(dāng)會(huì)導(dǎo)致接口程序出現(xiàn)各種莫名錯(cuò)誤。下面舉例說明: void CObjServerDlg::InitObjServer() { m_ObjSvr.SetRemoteFlag(FALSE); m_ObjSvr.SetSingleUserMode(FALSE); m_ObjSvr.Open(); if (!m_ObjSvr.GetIsOpen()) { ShowEvent("創(chuàng)建LNS Server失敗!"); return; } //設(shè)置網(wǎng)絡(luò) LcaNetworks Networks(m_ObjSvr.GetNetworks()); try { //在獲取網(wǎng)絡(luò)對(duì)象時(shí)要捕獲異常 m_ActiveNetwork = Networks.GetItem(COleVariant(m_csNetworkName)); ASSERT (m_ActiveNetwork.m_lpDispatch != NULL); } catch (COleDispatchException *pE) { //對(duì)異常的正確處理 if (LCA_ERR_RANGE_START+LCA_OBJECT_NOT_FOUND == pE->m_scError + OLE2LNS_CONVERSION) { CString csEvent; csEvent.Format("網(wǎng)絡(luò)%s不存在!", m_csNetworkName); ShowEvent(cs); } else ShowEvent(pE->m_strDescription); pE->Delete(); return; } ...... //其它部分代碼 } 2)、處理NvMonitorUpdateEvent事件消息。當(dāng)網(wǎng)絡(luò)變量變化時(shí),LNS會(huì)發(fā)送NvMonitorUpdateEvent消息通知接口程序。在這個(gè)消息函數(shù)中會(huì)將數(shù)值變化的監(jiān)控點(diǎn)、數(shù)據(jù)點(diǎn)、源地址以參數(shù)的形式傳遞過來。通過這些參數(shù)可以獲取變化數(shù)據(jù)的原始值和格式化值。這里需要注意的是如果LNS用的是VT_BSTR格式傳值,在獲取變化的數(shù)值后,必須正常釋放資源。否則接口程序就會(huì)持續(xù)不斷地占用系統(tǒng)內(nèi)存,直至內(nèi)存耗盡。下面舉例說明: // 將格式化的變化值賦給一個(gè)VARIANT型變量 VARIANT NvFmtValue = UpdateDataPoint.GetFormattedValue(); if (NvFmtValue.vt == VT_BSTR) { CString csNvFmtValue = NvFmtValue.bstrVal; ShowVaule(csNvFmtValue); SysFreeString(NvFmtValue.bstrVal); // 必須正確釋放內(nèi)存資源 } 3)、實(shí)現(xiàn)對(duì)監(jiān)控點(diǎn)進(jìn)行寫操作的接口。 寫操作和讀操作的過程一樣,也涉及使用原始數(shù)值格式和格式化數(shù)值格式的選擇。 按照格式化數(shù)值格式進(jìn)行寫入時(shí)過程比較簡單,示例代碼如下: LcaDataPoint DataPoint = NvMonitorPoint.GetDataPoint();//得到要寫入的數(shù)據(jù)點(diǎn)對(duì)象 ASSERT(DataPoint.m_lpDispatch != NULL); DataPoint.SetFormattedValue(COleVariant(csWriteData)); //csWriteData是一個(gè)CString類型的變量,代表寫入的數(shù)值 如果按照原始格式進(jìn)行寫操作,要注意的是LNS要求使用一種“VT_ARRAY | VT_UI1”型的VARIANT變量作為寫入值,示例代碼如下: LcaDataPoint DataPoint = NvMonitorPoint.GetDataPoint();//得到要寫入的數(shù)據(jù)點(diǎn)對(duì)象 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 結(jié)束語 本文介紹了在LNS環(huán)境下,開發(fā)LonWorks網(wǎng)絡(luò)數(shù)據(jù)監(jiān)控接口的方法。并結(jié)合VC編程語言的特點(diǎn),著重說明在一些關(guān)鍵環(huán)節(jié)上的處理方法。可為其他設(shè)計(jì)、開發(fā)相關(guān)系統(tǒng)的開發(fā)人員提供參考。 參考文獻(xiàn) [1] ECHELON公司。LNS for Windows Programmers Guide,2000。 [2] 雷剛,呂國強(qiáng)。基于LNS和COM的LonWorks網(wǎng)絡(luò)監(jiān)控軟件開發(fā) |
下一篇: PLC、DCS、FCS三大控
上一篇: 索爾維全系列Solef?PV