OPC添加组和添加项--------OPC(第六篇)

来源:互联网 发布:怎么锻炼丁丁变粗 知乎 编辑:程序博客网 时间:2024/06/05 05:31

    上一篇讲到了OPC客户端已经成功连接了OPC服务器,下面就开始整理OPC开发的核心部分——组和项的管理。

    不多说了,直接上代码,首先是IUnkown接口获取:

[cpp] view plain copy
print?
  1. /*获取OPC服务器IUnknow接口指针*/  
  2.   
  3. pIUnknown = (IUnknown*)mqi[0].pItf;  //得到第三个指针  
  4. ASSERT(pIUnknown);  
    然后获取IOPCServer接口:

[cpp] view plain copy
print?
  1. LONG lTimeBias = 0;  
  2. FLOAT fTemp = 0.00;  
  3. OPCHANDLE hOPCServer1; //第一个OPC SERVER句柄  
  4. DWORD dwActualRate = 0;  
  5.   
  6. hr = pIUnknown->QueryInterface(IID_IOPCServer,/*OUT*/(void**)&pIServer); //得到第四个指针  
  7. ASSERT(pIServer);  
  8.   
  9. if (FAILED(hr)){  
  10.     cout << "未能获取IOPCServer接口..." << endl;  
  11.     CoTaskMemFree(&hOPCServer1);  
  12.     CoTaskMemFree(&clsid); //第四个内存释放  
  13.     CoTaskMemFree(&catID); //第三个内存释放  
  14.     CoTaskMemFree(&mqi); //第二个内存释放  
  15.     CoTaskMemFree(&si); //第一个内存释放  
  16.     if (pIServer) pIServer->Release(); //第四个内存释放  
  17.     pIServer = NULL;  
  18.     if (pIUnknown) pIUnknown->Release(); //第三个内存释放  
  19.     pIUnknown = NULL;  
  20.     if (pIEnumGUID) pIEnumGUID->Release(); //第二个指针释放  
  21.     pIEnumGUID = NULL;  
  22.     if (pIServerList) pIServerList->Release(); //第一个指针释放  
  23.     pIServerList = NULL;  
  24.     return 1;  
  25. }  
  26. else if (SUCCEEDED(hr))  
  27. {         
  28.     cout << "已获取IOPCServer接口" << endl;  
  29. }  
   添加组:

[cpp] view plain copy
print?
  1. hr = pIServer->AddGroup(L"Group", TRUE, 10, 1235, &lTimeBias, &fTemp, 0, /*OUT*/ &hOPCServer1,   
  2.         &dwActualRate, IID_IOPCItemMgt, /*OUT*/ (LPUNKNOWN*)&pIOPCItemMgt); //得到第五个指针  
  3. ASSERT(pIOPCItemMgt);  
  4. ASSERT(hOPCServer1);  
  5.   
  6. if (FAILED(hr)) {  
  7.     cout << "未能添加组..." << endl;  
  8.     CoTaskMemFree(&clsid); //第四个内存释放  
  9.     CoTaskMemFree(&catID); //第三个内存释放  
  10.     CoTaskMemFree(&mqi); //第二个内存释放  
  11.     CoTaskMemFree(&si); //第一个内存释放  
  12.     if (pIOPCItemMgt) pIOPCItemMgt->Release(); //第五个指针释放  
  13.     pIOPCItemMgt = NULL;  
  14.     if (pIServer) pIServer->Release(); //第四个指针释放  
  15.     pIServer = NULL;  
  16.     if (pIUnknown) pIUnknown->Release(); //第三个指针释放  
  17.     pIUnknown = NULL;  
  18.     if (pIEnumGUID) pIEnumGUID->Release(); //第二个指针释放  
  19.     pIEnumGUID = NULL;  
  20.     if (pIServerList) pIServerList->Release(); //第一个指针释放  
  21.     pIServerList = NULL;  
  22.     return 1;  
  23. }  
  24. else if (SUCCEEDED(hr)) {  
  25.     cout << "已添加组..." << endl;  
  26. }  
    为存放Item的数组分配内存:

[cpp] view plain copy
print?
  1. itemArray = (OPCITEMDEF*)CoTaskMemAlloc(sizeof(OPCITEMDEF)); //第五个内存 指向存放数据项  
    为组添加项:

[cpp] view plain copy
print?
  1. CString str = "xxxxxx";  
  2. BSTR bstr = str.AllocSysString();  
  3. itemArray[0].szAccessPath = L"";  
  4. itemArray[0].szItemID = bstr;  
  5. itemArray[0].bActive = true// active state  
  6. itemArray[0].hClient = (OPCHANDLE)0; // our handle to item  
  7. itemArray[0].dwBlobSize = 0; // no blob support  
  8. itemArray[0].pBlob = NULL;  
  9. itemArray[0].vtRequestedDataType = VT_R4;  
  10. itemArray[0].wReserved = 0;   
  11. <pre name="code" class="cpp">hOPCServer2 = (OPCHANDLE*)CoTaskMemAlloc(119 * sizeof(OPCHANDLE));  
hr = pIOPCItemMgt->AddItems(1, itemArray,<span style="white-space:pre"> </span>(OPCITEMRESULT**)&pItemResult, (HRESULT**)&pErrors);ASSERT(pItemResult);ASSERT(pErrors);</span><pre name="code" class="cpp">if (FAILED(hr)){cout << "未能为组添加数据项..." << endl;if (pItemResult) CoTaskMemFree(pItemResult);if (pErrors) CoTaskMemFree(pErrors);CoTaskMemFree(&hOPCServer1);CoTaskMemFree(&hOPCServer2); //第六个内存释放CoTaskMemFree(&itemArray); //第五个内存释放CoTaskMemFree(&clsid); //第四个内存释放CoTaskMemFree(&catID); //第三个内存释放CoTaskMemFree(&mqi); //第二个内存释放CoTaskMemFree(&si); //第一个内存释放if (pIOPCItemMgt) pIOPCItemMgt->Release(); //第五个指针释放pIOPCItemMgt = NULL;if (pIServer) pIServer->Release(); //第四个指针释放pIServer = NULL;if (pIUnknown) pIUnknown->Release(); //第三个指针释放pIUnknown = NULL;if (pIEnumGUID) pIEnumGUID->Release(); //第二个指针释放pIEnumGUID = NULL;if (pIServerList) pIServerList->Release(); //第一个指针释放pIServerList = NULL;return 1;}else if (SUCCEEDED(hr)) {cout << "已经为组添加数据项..." << endl;}

    至此,OPC组和项已经添加完毕。



0 0
原创粉丝点击