翻譯|使用教程|編輯:王香|2019-04-17 11:52:38.000|閱讀 3304 次
概述:如果從.NET訪問OPC Server,則需要交換COM和.NET的包裝器。 它解釋了C#.NET在這里使用RCW(Runtime Callble Wrapper)訪問OPC服務(wù)器的實現(xiàn)。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
OPC Server是一套利用微軟的COM/DCOM技術(shù)實現(xiàn)工業(yè)自動化資料獲取的架構(gòu)。OPC Server提供OPC接口,它將與之相連的物理設(shè)備(PLC)的信息值通過接口返回到客戶端應(yīng)用程序。也就是說,客戶端通過這些接口,可以獲得與OPC Server連接的物理設(shè)備的信息。對于集成應(yīng)用程序,只要支持OPC接口,就能輕易訪問物理設(shè)備,而無需相關(guān)的技術(shù)信息。 程序設(shè)計者可以使用相同的程序代碼,操作不同的硬件裝置,充分達成軟件復用的目的。
如果從.NET訪問OPC Server,則需要交換COM和.NET的包裝器。 它解釋了C#.NET在這里使用RCW(Runtime Callble Wrapper)訪問OPC服務(wù)器的實現(xiàn)。
創(chuàng)建COM連接的實例,指定OPC服務(wù)器的CLSID,您可以獲取OPC的每個接口指針,例如OPC服務(wù)器對象和瀏覽對象等。
IOPCServerList svrList = (IOPCServerList)CreateInstance(CLSID_SERVERLIST, null); Guid clsidList; svrList.CLSIDFromProgID(sSvrName, out clsidList); m_OPCServer = (IOPCServer)CreateInstance(clsidList, sNodeName); AddGroup(sGrpName, iUpdateRate); IOPCCommon m_com = (IOPCCommon)m_OPCServer;
需要在OPC服務(wù)器中創(chuàng)建組對象以從外部獲取實際數(shù)據(jù)。數(shù)據(jù)更新周期可以設(shè)置為組對象,并且通常將通過相同同步訪問的設(shè)備注冊到組。因為每個組的線程都是在OPC服務(wù)器中創(chuàng)建的,所以請注意CPU負載增加過多細分。
// Add OPCGroup guidGroupStateMgt = Marshal.GenerateGuidForType(typeof(IOPCGroupStateMgt2)); m_OPCServer.AddGroup(sGrpName, (bActive) ? 1 : 0, iUpdateRate, iClientGroup, ptrTimeBias, ptrDeadBand, iLCID, out m_iServerGroup, out iRevisedUpdateRate, ref guidGroupStateMgt, out group); m_OPCGroup2 = (IOPCGroupStateMgt2)group; m_OPCGroup2.SetKeepAlive(iKeepAliveTime, out iKeepAliveTime); m_OPCConnPointCntnr = (IConnectionPointContainer)m_OPCGroup2; guidDataCallback = Marshal.GenerateGuidForType(typeof(IOPCDataCallback)); m_OPCConnPointCntnr.FindConnectionPoint(ref guidDataCallback, out m_OPCConnPoint); // Add OPCItems for (i = 0; i < iItemCount; i++) { itemDef[i].szItemID = ItemName[i]; itemDef[i].bActive = 1; itemDef[i].hClient = ClientHd[i]; } m_OPCItem = (IOPCItemMgt)m_OPCGroup2; m_OPCItem.AddItems(iItemCount, itemDef, out ppResult, out ppErrors);
OPC有兩種數(shù)據(jù)訪問方式,Synchronize和Asynchronous。在Synchronize中,客戶端應(yīng)用程序必須等待完成服務(wù)器工作。但客戶端應(yīng)用程序可以確認服務(wù)器事務(wù)正常完成,因為OPC服務(wù)器在完成通信工作時返回結(jié)果。這是一種通常的程序。
在異步模式下,OPC服務(wù)器會在收到請求后立即將句柄轉(zhuǎn)為客戶端,并在后臺繼續(xù)執(zhí)行事務(wù)。完成此工作后,調(diào)用客戶端應(yīng)用程序的處理程序。異步模式減少了通信的等待時間,并能夠運行客戶端應(yīng)用程序。
提示:在建議模式下啟用異步訪問。
// Read by IOPCSyncIO OPCSyncIO2 = (IOPCSyncIO2)m_OPCGroup2; OPCSyncIO2.Read(OPC_DS_DEVICE /*OPC_DS_CACHE*/, iItemCount, ServerHd, out ppItemVal, out ppErrors); Marshal.Copy(ppErrors, Errors, 0, iItemCount); posItem = ppItemVal; for (i=0; i<iItemCount; i++) { ItemState = (OPCITEMSTATE)Marshal.PtrToStructure(posItem, typeof(OPCITEMSTATE)); if (Errors[i] == 0) { Values[i] = ItemState.vDataValue; TimeStamps[i] = ItemState.ftTimeStamp; Qualities[i] = ItemState.wQuality; } Marshal.DestroyStructure(posItem, typeof(OPCITEMSTATE)); posItem = new IntPtr(posItem.ToInt32() + Marshal.SizeOf(typeof(OPCITEMSTATE))); } // Write by IOPCSyncIO. OPCSyncIO2.Write(iItemCount, ServerHd, Value, out ppErrors); Marshal.Copy(ppErrors, errors, 0, iItemCount); Marshal.FreeCoTaskMem(ppErrors);
高速緩存讀取(OPC_DS_CACHE)立即返回服務(wù)器內(nèi)存中的最新數(shù)據(jù)值,而無需通信。OPC服務(wù)器根據(jù)每個組的注冊更新周期自動更新數(shù)據(jù)。當它可能不一定是最新數(shù)據(jù)時,可以進行高速訪問。
// Read by IOPCASyncIO OPCAsyncIO3 = (IOPCAsyncIO3)m_OPCGroup2; OPCAsyncIO3.Read(iItemCount, ServerHd, wTransID, out wCancelID, out ppErrors); // Write by IOPCASyncIO OPCAsyncIO3 = (IOPCAsyncIO3)m_OPCGroup2; OPCAsyncIO3.Write(iItemCount, ServerHd, Value, wTransID, out wCancelID, out ppErrors); Marshal.FreeCoTaskMem(ppErrors);
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn