OPC工作记录整理——第五篇(添加组和添加项)

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

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

/*获取OPC服务器IUnknow接口指针*/

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

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;
}
    添加组:

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的数组分配内存:

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

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组和项已经添加完毕。



  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值