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

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

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

  1. /*获取OPC服务器IUnknow接口指针*/  
  2.   
  3. pIUnknown = (IUnknown*)mqi[0].pItf;  //得到第三个指针  
  4. ASSERT(pIUnknown);  
/*获取OPC服务器IUnknow接口指针*/

pIUnknown = (IUnknown*)mqi[0].pItf;  //得到第三个指针
ASSERT(pIUnknown);
    然后获取IOPCServer接口:

  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. }  
LONG lTimeBias = 0;
FLOAT fTemp = 0.00;
OPCHANDLE hOPCServer1; //第一个OPC SERVER句柄
DWORD dwActualRate = 0;

hr = pIUnknown->QueryInterface(IID_IOPCServer,/*OUT*/(void**)&pIServer); //得到第四个指针
ASSERT(pIServer);

if (FAILED(hr)){
	cout << "未能获取IOPCServer接口..." << endl;
	CoTaskMemFree(&hOPCServer1);
	CoTaskMemFree(&clsid); //第四个内存释放
	CoTaskMemFree(&catID); //第三个内存释放
	CoTaskMemFree(&mqi); //第二个内存释放
	CoTaskMemFree(&si); //第一个内存释放
	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 << "已获取IOPCServer接口" << endl;
}
    添加组:

  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. }  
hr = pIServer->AddGroup(L"Group", TRUE, 10, 1235, &lTimeBias, &fTemp, 0, /*OUT*/ &hOPCServer1, 
		&dwActualRate, IID_IOPCItemMgt, /*OUT*/ (LPUNKNOWN*)&pIOPCItemMgt); //得到第五个指针
ASSERT(pIOPCItemMgt);
ASSERT(hOPCServer1);

if (FAILED(hr)) {
	cout << "未能添加组..." << endl;
	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;
}
    为存放Item的数组分配内存:

  1. itemArray = (OPCITEMDEF*)CoTaskMemAlloc(sizeof(OPCITEMDEF)); //第五个内存 指向存放数据项  
itemArray = (OPCITEMDEF*)CoTaskMemAlloc(sizeof(OPCITEMDEF)); //第五个内存 指向存放数据项
    为组添加项:

  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));  
CString str = "xxxxxx";
BSTR bstr = str.AllocSysString();
itemArray[0].szAccessPath = L"";
itemArray[0].szItemID = bstr;
itemArray[0].bActive = true; // active state
itemArray[0].hClient = (OPCHANDLE)0; // our handle to item
itemArray[0].dwBlobSize = 0; // no blob support
itemArray[0].pBlob = NULL;
itemArray[0].vtRequestedDataType = VT_R4;
itemArray[0].wReserved = 0;	
<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组和项已经添加完毕。



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值