一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

關(guān)于OPC Client 編寫|LinkPLC工控論壇|Link PLC Forum

 ThinkTank_引擎 2014-12-08

   昨天又有人問我 OPC Client 編寫,實(shí)際是他們不了解OPC 客戶端的工作原理,要想寫客戶端程序,必須知道OPC對象, OPC邏輯對象模型包括3類對象:OPC server對象、OPC group對象、OPC item對象,每類對象都包括一系列接口。
   OPC Server對象
   主要功能為:1、創(chuàng)建和管理OPC Group對象;
               2、管理服務(wù)器內(nèi)部的狀態(tài)信息;
   OPC Group對象
   主要功能為:1、管理OPC Group對象的內(nèi)部狀態(tài)信息;
               2、創(chuàng)建和管理Items對象。
               3、OPC服務(wù)器內(nèi)部的實(shí)時數(shù)據(jù)存取服務(wù)(同步與異步方式)。
   OPC組中有以下幾個主要屬性:Name :組的名字 ;Active:組的激活狀態(tài)標(biāo)志 ;Update Rate OPC:服務(wù)器向客戶程序提交數(shù)據(jù)變化的刷新速率;Percent Dead band:數(shù)據(jù)死區(qū),即能引起數(shù)據(jù)變化的最小數(shù)值百分比。
   OPC ITEM 是非COM對象,在OPC標(biāo)準(zhǔn)中用來描述實(shí)時數(shù)據(jù),是客戶端不可見的對象。代表了與服務(wù)器中的數(shù)據(jù)的連接,它并不是數(shù)據(jù)源,而僅僅是與數(shù)據(jù)源的連接。每個項(xiàng)都有以下主要屬性: Active項(xiàng)的激活狀態(tài)、Value項(xiàng)的數(shù)值、類型為VARIANT、Quality項(xiàng)的品質(zhì),代表數(shù)值的可信度,類型為SHORT、TimeStamp時間戳,代表數(shù)據(jù)的存取時間。
   你不管用什么開發(fā)語言只要了解上面幾個對象,就會寫程序了
   下面舉個VC的例子
   HRESULT  r1;
 CLSID  clsid;
 LONG  TimeBias = 0;
 FLOAT  PercentDeadband = 0.0;
 DWORD  RevisedUpdateRate;
 LPWSTR  ErrorStr;
 char  str[100];
 CString  szErrorText;

m_pItemResult = NULL;
客戶端程序必須對DCOM進(jìn)行初始化設(shè)置,以保證OPC服務(wù)器端回調(diào)函數(shù)不會被堵塞。
 r1 = CoInitialize(NULL);
 if (r1 != S_OK)
 { if (r1 == S_FALSE)
  { MessageBox("COM Library already initialized",
              "Error CoInitialize()", MB_OK+MB_ICONEXCLAMATION);
  }
  else
  { szErrorText.Format("Initialisation of COM Library failed. Error Code= %4x", r1);
   MessageBox(szErrorText,"Error CoInitialize()", MB_OK+MB_ICONERROR);
   SendMessage(WM_CLOSE);
   return;
  }
 }
 
 通過OPC服務(wù)器的ProgID查詢注冊表中相關(guān)CLSID。每個COM服務(wù)器都有一個字符串型的ProgID,通過ProgID可以得到全球惟一的CLSID,使用CLSIDFromProgID( )函數(shù)實(shí)現(xiàn)ProgID到CLSID的轉(zhuǎn)換。 r1 = CLSIDFromProgID(L"OPC.SimaticNET", &clsid);
 if (r1 != S_OK)
 { MessageBox("Retrival of CLSID failed",
       "Error CLSIDFromProgID()", MB_OK+MB_ICONERROR);
  CoUninitialize();
  SendMessage(WM_CLOSE);
  return;
 }

連接OPC服務(wù)器,查詢對象的IID_IOPCServer接口。在連接OPC服務(wù)器前,OPC客戶端需要事先指定計算機(jī)名和OPC數(shù)據(jù)訪問服務(wù)器名,建立連接后,創(chuàng)建OPC組并添加OPC數(shù)據(jù)項(xiàng)。
r1 = CoCreateInstance (clsid, NULL, CLSCTX_LOCAL_SERVER ,IID_IOPCServer, (void**)&m_pIOPCServer);
 if (r1 != S_OK)
 { MessageBox("Creation of IOPCServer-Object failed",
             "Error CoCreateInstance()", MB_OK+MB_ICONERROR);
  m_pIOPCServer = NULL;
  CoUninitialize();
  SendMessage(WM_CLOSE);
  return;
 }

創(chuàng)建OPC組,查詢IOPCItemMgt接口。IOPCServer接口的AddGroup()方法可以創(chuàng)建一個有指定名稱和屬性的OPC組。
r1=m_pIOPCServer->AddGroup(L"grp1",   // [in] group name
      TRUE,     // [in] active
      500,     // [in] request this Update Rate from Server
      1,      // [in] Client handle
      &TimeBias,    // [in] no time interval to system UTC time
      &PercentDeadband,   // [in] no deadband, so all data changes are reported
      LOCALE_ID,    // [in] Server uses English language for text values
      &m_GrpSrvHandle,  // [out] Server handle to identify this group in later calls
      &RevisedUpdateRate,  // [out] the answer form the Server to the requested update rate
         IID_IOPCItemMgt,  // [in] requested interface type of the group object
      (LPUNKNOWN*)&m_pIOPCItemMgt); // [out] pointer to the requested interface
 
 if (r1 == OPC_S_UNSUPPORTEDRATE)
 {
  szErrorText.Format ("Revised Update Rate %d is different from Requested Update Rate 500",RevisedUpdateRate );
  AfxMessageBox(szErrorText);
 }
 else
  if (FAILED(r1)){
   MessageBox("Can't add Group to Server!", "Error AddGroup()", MB_OK+MB_ICONERROR);
   m_pIOPCServer->Release();
   m_pIOPCServer = NULL;
   CoUninitialize();
   SendMessage(WM_CLOSE);
   return;
  }
添加OPC數(shù)據(jù)項(xiàng)。使用IOPCItemMgt接口的AddItem()方法可以添加具有特殊屬性的指定數(shù)量的數(shù)據(jù)項(xiàng)。

// define an item table with one item as in-paramter for AddItem
 m_Items[0].szAccessPath    = L"";  

m_Items[0].szItemID     = szItemID;  // 影響數(shù)據(jù)類型
 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;    
             // defined by the item itself

r1 = m_pIOPCItemMgt->AddItems(1,    // [in] add one item
       m_Items,    // [in] see above
       &m_pItemResult,   // [out] array with additional information about the item
       &m_pErrors);   // [out] tells which of the items was successfully added.
             // For any item which failed it provides a reason


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    色婷婷丁香激情五月天| 国产精品激情对白一区二区| 亚洲另类欧美综合日韩精品| 亚洲熟妇av一区二区三区色堂| 日韩中文字幕人妻精品| 99久久国产综合精品二区| 国产精品尹人香蕉综合网| 国产精品人妻熟女毛片av久| 草草视频福利在线观看| 精品久久综合日本欧美| 国产午夜福利在线观看精品| 欧美日韩国产午夜福利| 欧美一区日韩一区日韩一区| 日本加勒比在线观看不卡| 欧美一级日韩中文字幕| 99国产一区在线播放| 欧美成人免费一级特黄| 精品推荐国产麻豆剧传媒| 日韩精品免费一区二区三区| 日本欧美三级中文字幕| 国产精品欧美激情在线| 极品少妇嫩草视频在线观看| 蜜桃传媒在线正在播放| 免费午夜福利不卡片在线 视频| 日本精品理论在线观看| 国产原创中文av在线播放| 国产99久久精品果冻传媒| 大香蕉大香蕉手机在线视频| 99视频精品免费视频播放| 大胆裸体写真一区二区| 五月婷日韩中文字幕四虎| 日本男人女人干逼视频| 国产精品蜜桃久久一区二区| 久久精品a毛片看国产成人| 激情亚洲一区国产精品久久| 日本免费一级黄色录像| 日本丁香婷婷欧美激情| 亚洲最新的黄色录像在线| 欧洲日韩精品一区二区三区| 国产欧美日韩精品自拍| 国产成人午夜在线视频|