杜曉克 魏運均
樓宇自動化系統(Building Automation System,BAS)是智能建筑的主要組成部分之一,智能建筑通過樓宇自動化系統實現建筑物內設備與建筑環境的全面監控與管理[1]。
樓宇自動化系統應屬過程控制范疇,在樓宇自動化技術發展過程中,由于歷史的原因,各個設備制造廠商封閉地發展自己的系統,長期以來沒有建立國際性的標準通信協議,使得各個設備或子系統不能無縫地集成到一個操作平臺上來。這種局面嚴重阻礙了智能建筑技術的發展。在這種情況下,要把不同廠家的設備和控制系統連接到一起是非常困難的。OPC就是在這種情況下產生的,它提供了一個標準接口,使得樓宇自控各子系統通過OPC客戶接口與具有標準OPC服務器接口的現場設備實現數據交互,這種軟件數據集成使得樓宇自控在真正意義上實現了開放化、集成化、信息化。
OPC以OLE/COM機制作為應用程序級的通信標準,采用客戶/服務器模式,把開發訪問接口的任務放在硬件生產廠家或第三方廠家,以OPC服務器的形式提供給用戶,解決了軟、硬件廠商的矛盾,完成了系統的集成,提高了系統的開放性和互操作性[2]。
OPC技術是以Microsoft的OLE/COM技術為基礎建立的一項技術規范與標準,它以組件對象模型和分布式組件對象模型COM/DCOM技術為基礎,采用客戶/服務器模型,定義了一組COM對象及其雙接口。
OPC對象主要包括服務器(Server)、組(Group)和項(Item)。OPC服務器對象除了維護自身信息外,還作為組對象的容器,可動態地創建或釋放組對象;而組對象相對于項而言也是一個包容器,它提供一套管理項的機制;OPC項則表示了與OPC服務器中數據的連接,包括:值(Value)、品質(Quality)、時間戳(Timer Stamp)三個基本屬性。圖1為OPC服務器結構圖。
OPC標準中的接口主要有兩種:客戶端和服務器程序員所使用的OPC自定義接口(OPC COM Custom Interfaces)和支持用高端商業應用(如用Visual Basic,Delphi,Excel等)開發的客戶程序的OPC自動化接口(OPC OLE Automation Interfaces)。OPC自定義接口是OPC服務器必須提供的,而OPC自動化接口則不一定提供。利用這兩種接口與OPC服務器通信的方式見圖2。


兩種接口的OPC服務器通信方式對于客戶端應用程序的開發,采用自定義接口的方式運行效率高,但開發難度大;采用自動化接口的方式運行效率低,但開發簡單。本文采用Visual C++高級編程語言通過定制接口的形式編寫了OPC客戶端軟件。
OPC客戶程序訪問OPC服務器,實際上就是一個典型的客戶訪問進程外組件的過程。編寫OPC客戶程序的步驟可以概括為:指定服務器、建立OPC組、添加OPC項、接收數據、斷開連接。
//創建OPC服務器對象,并查詢對象的IID_IOPCServer接口
r1=CoCreateInstance(clsid,NULL,
CLSCTX_LOCAL_SERVER,IID_IOPCServer,
(void**)&m_IOPCServer);
//添加一個group對象,并查詢IOPCItemMgt接口
r1=m_IOPCServer->AddGroup(L"grp1",//[in]組名字
TRUE,//[in]是否活動狀態
500,//[in]刷新率(毫秒)
1,//[in]客戶句柄
&TimeBias,//[in]
&PercentDeadband,//[in]死區參數
LOCALE_ID,//[in]語言
&m_GrpSrvHandle,//[out]服務器句柄
&RevisedUpdateRate,//[out]服務器返回的刷新率
IID_IOPCItemMgt,//[in]需要的接口指針
(LPUNKNOWN*)&m_IOPCItemMgt);//[out]返回的需要的接口指針
//為AddItem定義item表的參數
m_Items[0].szAccessPath=L"";// 不需要 Accesspath
m_Items[0].szItemID=szItemID;//ItemID
m_Items[0].bActive=TRUE;
m_Items[0].hClient=1;
m_Items[0].dwBlobSize=0;
m_Items[0].pBlob=NULL;
m_Items[0].vtRequestedDataType=0;// 數據類型
r1=m_IOPCItemMgt->AddItems(1,//[in]添加1個 item m_Items,//[in]前面定義
&m_ItemResult,//[out]結果信息指針
&m_pErrors);//[out]錯誤碼
//接收數據
OPCHANDLE*phServer;
OPCITEMSTATE*pItemValue;
HRESULT*pErrors;
HRESULT r1;
UINT qnr;
if(m_pErrors[0]!=S_OK)//Item 不可用
{
AfxMessageBox("OPC Item不可用,不能用同步讀功能!");
return;
}
//內存分配
phServer=new OPCHANDLE[1];
//通過server句柄選擇item(由AddItem得到的)
phServer[0] =m_ItemResult[0].hServer;
r1=m_IOPCSyncIO->Read(OPC_DS_DEVICE,1,phServer,
&pItemValue,&pErrors);
//釋放內存
delete[]phServer;
//釋放OPC服務器
m_IOPCServer->Release();
m_IOPCServer=NULL;
應用Visual C++編寫的OPC客戶端程序,此程序即可與樓宇自控各子系統OPC服務器接口實現現場設備數據交互以及數據信息化集成。
OPC技術的出現使得樓宇自動化系統各子系統之間實現了開放的無縫連接,在提高系統互操作性的同時,簡化了系統集成環境,從軟件層面解決了不同廠家的各種子系統和設備往往由于不具備標準的接口而存在可集成性的問題[3]。隨著OPC規范的不斷推出和完善,其在智能樓宇系統集成中的應用將會越來越廣泛。
[1] 周 鳴,曲 凌.基于OPC技術的樓宇自動化系統集成[J].現代電子技術,2006(9):99-101.
[2] 蔡翔云,鄭小虎,姜 麟.OPC規范及開發應用[J].昆明理工大學學報,2002(6):73-74.
[3] 陳 丹,徐利梅.OPC技術在樓宇自動化系統集成中的應用[J].樓宇自動化,2007(2):62-63.