久久精品人妻一区二区蜜桃-欧美精品人妻一区二区免费视频-久久精品免费一区二区喷潮-久久精品中文闷骚内射-精品bbw-精品久久无码中文字幕-小小水蜜桃3视频高清在线观看-日韩免费一级aaa片毛太久-欧美激情肉欲高潮无码鲁大师-欧美影片一区二区三区-亚洲精品无码av无码专区一本,波多野吉衣一区二区三区在线观看,囯精品人妻无码一区二区三区99,包哟哟在线观看免费观看

產(chǎn)品分類

當(dāng)前位置: 首頁(yè) >

類型分類:
科普知識(shí)
數(shù)據(jù)分類:

基于LNS的LonWorks網(wǎng)絡(luò)數(shù)據(jù)監(jiān)控接口開(kāi)發(fā)

發(fā)布日期:2022-04-18 點(diǎn)擊率:117

  • 關(guān)鍵詞: VC++ LonWorks
  • 摘要:本文介紹了用Visual C++ 6.0開(kāi)發(fā)工具,在LNS環(huán)境下,開(kāi)發(fā)LonWorks網(wǎng)絡(luò)數(shù)據(jù)監(jiān)控接口的方法,舉例闡述了軟件實(shí)現(xiàn)過(guò)程。對(duì)于相關(guān)系統(tǒng)的設(shè)計(jì)、開(kāi)發(fā)具有一定的參考價(jià)值。

1  引言
    近年來(lái),現(xiàn)場(chǎng)總線技術(shù)迅猛發(fā)展,取代傳統(tǒng)的集中式控制系統(tǒng)已成必然。LonWorks技術(shù)是美國(guó)ECHELON公司在1991年推出的一種控制局域網(wǎng)絡(luò),它以其優(yōu)秀的分布處理能力、開(kāi)放性、互操作性、多媒介適應(yīng)能力以及多網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)等特性適應(yīng)了未來(lái)發(fā)展對(duì)測(cè)控網(wǎng)絡(luò)的要求,成為眾多總線中的佼佼者。與其它現(xiàn)場(chǎng)總線相比,它具有組網(wǎng)方便,通訊速率快,不局限于通訊介質(zhì)等優(yōu)點(diǎn)。目前其在國(guó)內(nèi)的應(yīng)用非常廣泛,工程實(shí)例遍及樓宇控制,智能小區(qū),工廠,礦井監(jiān)控等場(chǎng)合,是一種具有良好發(fā)展前景的總線。
2  LNS開(kāi)發(fā)接口與開(kāi)發(fā)工具
    LNS(LonWorks Network Services)是ECHELON提供的一個(gè)專為L(zhǎng)onWorks網(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組件方式的開(kāi)發(fā)接口。這兩種方式在功能和性能上都沒(méi)有什么差異,而ActiveX使用起來(lái)更為簡(jiǎn)便,一般也不需要開(kāi)發(fā)人員了解很多OLE方面的知識(shí),因而更易于被接受。本文所列舉的實(shí)例采用的就是ActiveX方式。
    采用ActiveX方式開(kāi)發(fā)LonWorks網(wǎng)絡(luò)通信接口可選擇的開(kāi)發(fā)工具十分豐富。Visual C++ 6.0目前仍然是開(kāi)發(fā)自動(dòng)化軟件的主流工具之一。當(dāng)在VC環(huán)境下用ActiveX接口開(kāi)發(fā)LonWorks網(wǎng)絡(luò)通信接口程序時(shí),在實(shí)現(xiàn)過(guò)程和方法上與其它語(yǔ)言差別不大。只是在一些與VC語(yǔ)言特性相關(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)測(cè)到網(wǎng)絡(luò)管理和維護(hù)等完整的功能接口。在開(kāi)發(fā)LonWorks網(wǎng)絡(luò)數(shù)據(jù)監(jiān)控接口程序時(shí),涉及的只是其中的數(shù)據(jù)監(jiān)控部分的功能。
3  LNS實(shí)現(xiàn)監(jiān)控的過(guò)程
   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ù)比較繁重的場(chǎng)合,單點(diǎn)方式適合監(jiān)控任務(wù)較輕,點(diǎn)數(shù)較多的情況。
   無(wú)論是監(jiān)控集或是單點(diǎn)方式,都要使用監(jiān)控點(diǎn)。監(jiān)控點(diǎn)有以下幾種監(jiān)控方式:顯式讀寫(xiě)、隱式綁定、查詢、顯示綁定。
   對(duì)于顯式讀寫(xiě)方式,接口程序可以直接讀寫(xiě)監(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)測(cè)多個(gè)結(jié)點(diǎn)網(wǎng)絡(luò)變量。
   這幾種方式分別適用于不同的場(chǎng)合。查詢方式適用于監(jiān)控任務(wù)繁重,但對(duì)數(shù)據(jù)采集的實(shí)時(shí)性要求不高的場(chǎng)合。隱式綁定適用于監(jiān)控任務(wù)較輕,但數(shù)據(jù)變化要求實(shí)時(shí)處理的場(chǎng)合。當(dāng)現(xiàn)場(chǎng)數(shù)據(jù)變化頻繁時(shí),用顯式讀寫(xiě)或查詢方式會(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開(kāi)發(fā)包之后,就可以使用開(kāi)發(fā)包中提供的lnsobjectserver控件了。最簡(jiǎn)單的方法是在一個(gè)對(duì)話框資源上插入這個(gè)控件,然后用這個(gè)對(duì)話框創(chuàng)建一個(gè)類,將創(chuàng)建監(jiān)測(cè)集、獲取監(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)程或本地方式;
打開(kāi)服務(wù)器;
設(shè)置網(wǎng)絡(luò)接口,打開(kāi)網(wǎng)絡(luò);
設(shè)置系統(tǒng);
設(shè)置網(wǎng)絡(luò)服務(wù)設(shè)備;
打開(kāi)系統(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)中;
打開(kāi)監(jiān)控集。
    調(diào)用lnsobjectserver控件方法可以逐步實(shí)現(xiàn)上述初始化過(guò)程。需要注意的是VC對(duì)異常情況的處理,不進(jìn)行異常或處理不當(dāng)會(huì)導(dǎo)致接口程序出現(xiàn)各種莫名錯(cuò)誤。下面舉例說(shuō)明:
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ù)的形式傳遞過(guò)來(lái)。通過(guò)這些參數(shù)可以獲取變化數(shù)據(jù)的原始值和格式化值。這里需要注意的是如果LNS用的是VT_BSTR格式傳值,在獲取變化的數(shù)值后,必須正常釋放資源。否則接口程序就會(huì)持續(xù)不斷地占用系統(tǒng)內(nèi)存,直至內(nèi)存耗盡。下面舉例說(shuō)明:
//  將格式化的變化值賦給一個(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)行寫(xiě)操作的接口。
    寫(xiě)操作和讀操作的過(guò)程一樣,也涉及使用原始數(shù)值格式和格式化數(shù)值格式的選擇。
按照格式化數(shù)值格式進(jìn)行寫(xiě)入時(shí)過(guò)程比較簡(jiǎn)單,示例代碼如下:
LcaDataPoint DataPoint = NvMonitorPoint.GetDataPoint();//得到要寫(xiě)入的數(shù)據(jù)點(diǎn)對(duì)象
ASSERT(DataPoint.m_lpDispatch != NULL);
DataPoint.SetFormattedValue(COleVariant(csWriteData));
                //csWriteData是一個(gè)CString類型的變量,代表寫(xiě)入的數(shù)值
    如果按照原始格式進(jìn)行寫(xiě)操作,要注意的是LNS要求使用一種“VT_ARRAY | VT_UI1”型的VARIANT變量作為寫(xiě)入值,示例代碼如下:
LcaDataPoint DataPoint = NvMonitorPoint.GetDataPoint();//得到要寫(xiě)入的數(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;//表示寫(xiě)入值的字符串指針
VARIANT NvRawValue;
NvRawValue.vt = VT_ARRAY | VT_UI1;
NvRawValue.parray = &SafeArray;
DataPoint.SetRawValue(NvRawValue);
if(!DataPoint.GetAutoWrite())
        DataPoint.Write();
5  結(jié)束語(yǔ)
    本文介紹了在LNS環(huán)境下,開(kāi)發(fā)LonWorks網(wǎng)絡(luò)數(shù)據(jù)監(jiān)控接口的方法。并結(jié)合VC編程語(yǔ)言的特點(diǎn),著重說(shuō)明在一些關(guān)鍵環(huán)節(jié)上的處理方法。可為其他設(shè)計(jì)、開(kāi)發(fā)相關(guān)系統(tǒng)的開(kāi)發(fā)人員提供參考。
  
參考文獻(xiàn)
[1]  ECHELON公司。LNS for Windows Programmers Guide,2000。
[2]  雷剛,呂國(guó)強(qiáng)。基于LNS和COM的LonWorks網(wǎng)絡(luò)監(jiān)控軟件開(kāi)發(fā)
  



下一篇: PLC、DCS、FCS三大控

上一篇: 索爾維全系列Solef?PV

推薦產(chǎn)品

更多