⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asynopcdlg.cpp

📁 最简单的VC编写的OPC客户端程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	r1=m_IOPCItemMgt->QueryInterface(IID_IOPCGroupStateMgt, (void**) &m_IOPCGroupStateMgt);

	if (r1 != S_OK) 
	{	
		AfxMessageBox("IOPCGroupStateMgt接口没有找到");
		CoTaskMemFree(m_ItemResult);
		m_IOPCItemMgt->Release();
		m_IOPCItemMgt = 0;
		m_GrpSrvHandle = 0;
		m_IOPCServer->Release();
		m_IOPCServer = NULL;
		CoUninitialize();		
		return;
	}
	OnCheckActivategroup();
	// 建立异步回调
	CComObject<COPCDataCallback>* pCOPCDataCallback;	// 回调对象的指针

	//通过ATL模板创建回调对象的实例
    CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);
    
    // 查询IUnknown接口
	LPUNKNOWN pCbUnk;
    pCbUnk = pCOPCDataCallback->GetUnknown();

    // 建立一个服务器的连接点与客户程序接收器之间的连接
	HRESULT hRes = AtlAdvise(	m_IOPCGroupStateMgt, // [in] IUnknown Interface of the Connection Point
								pCbUnk,				 // [in] IUnknown Interface of the Callback object
								IID_IOPCDataCallback,// [in] Connection Point ID: The OPC Data Callback 
								&m_dwAdvise			 // [out] Cookie that that uniquely identifies the connection
							);

	if (hRes != S_OK) 
	{	
		AfxMessageBox("Advise失败!");
		CoTaskMemFree(m_ItemResult);
		m_IOPCItemMgt->Release();
		m_IOPCItemMgt = 0;
		m_GrpSrvHandle = 0;
		m_IOPCServer->Release();
		m_IOPCServer = NULL;
		CoUninitialize();
        return;
	}
		
}
/*异步读*/
void CAsynOpcDlg::OnRead() 
{
	// TODO: Add your control notification handler code here
	readFlag=1;
	OPCHANDLE		*phServer;
	DWORD			dwCancelID;
	HRESULT			*pErrors;
	HRESULT			r1;
	CString			szOut;
	
    if (m_pErrors[0] != S_OK) // //Item不可用

	{	
		AfxMessageBox("OPC Item 不可用,不能用同步读功能!");
		return;
	}
    
    //内存分配
	phServer = new OPCHANDLE[1];
	//通过server句柄选择item(由AddItem得到的)
	phServer[0] = m_ItemResult[0].hServer;

	r1 = m_IOPCAsyncIO2->Read(1,				// [in] Read 1 Item
							phServer,		// [in] Item defined in this array
							1,				// [out] Clients Transaction ID, not used in this sample
							&dwCancelID,	// [out] Servers Cancel ID, not used in this sample
							&pErrors		// [out] Errors for each item, returned by OPC Server
						);
	
	delete[] phServer;
		
	if (r1 == S_FALSE)
	{	
		AfxMessageBox("Read()错误");
    } 

	if (FAILED(r1)) 
	{	
		AfxMessageBox("异步读失败!");
	}
	else
	{	
		//释放内存,如果操作成功
		CoTaskMemFree(pErrors);
	}	
}
/*异步写,将写结果显示在对话框*/
void CAsynOpcDlg::OnWrite() 
{
	// TODO: Add your control notification handler code here
	writeFlag=1;
	OPCHANDLE		*phServer;
	DWORD			dwCancelID;
	VARIANT			values[1];
	HRESULT			*pErrors;
	HRESULT			r1;
	LPWSTR			ErrorStr;
	CString			szOut;

	if (m_pErrors[0] != S_OK) // Item not available
	{
		AfxMessageBox("OPC Item 不可用,不能用同步读功能!");
		return;
	}

	//通过server句柄选择item(由AddItem得到的)
	phServer = new OPCHANDLE[1];
	phServer[0] = m_ItemResult[0].hServer;
	
	//	从对话框获得数据
	UpdateData(TRUE);
	//	设置Variant变量的数据类型和数值
	values[0].vt = VT_R8;
	values[0].dblVal = m_writeValue;


	r1 = m_IOPCAsyncIO2->Write(	1,			// [in] Write 1 Item
							phServer,	// [in] Item defined in this array
							values,		// [in] Values defined in an array of Variants
							2,			// [in] Clients transaction ID, not used in this sample
							&dwCancelID,// [out] Servers Cancel ID for this transaction, not used 
							&pErrors	// [out] Errors for each item, returned by OPC Server
						);
	delete[] phServer;
	
	if (r1 == S_FALSE)
	{	
		m_IOPCServer->GetErrorString(pErrors[0], LOCALE_ID, &ErrorStr);
		m_writeResult = ErrorStr;
		UpdateData(FALSE);
    } 

	if (FAILED(r1)) 
	{	
		AfxMessageBox("异步写Item错误");
	}
	else
	{	// release [out] parameter in case of not failed
		CoTaskMemFree(pErrors);
	}
	
}

void CAsynOpcDlg::OnCheckActivategroup() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);

	DWORD dwRevUpdateRate;
	HRESULT	r1=	m_IOPCGroupStateMgt->SetState(NULL,	// [in] RequestedUpdateRate
						&dwRevUpdateRate,	// [out] RevisedUpdateRate
						&m_bChkGroupAct,//[in] ActiveFlag for Group
						NULL,				// [in] TimeBias
						NULL,				// [in] PercentDeadband
						NULL,				// [in] LCID
						NULL);				// [in] Handle ClientGroup

	if (FAILED(r1))
	{	MessageBox("Set State failed",
	           "Error", MB_OK+MB_ICONERROR);
		return;
	}
}
/*停止服务器*/
void CAsynOpcDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	HRESULT		r1;
	OPCHANDLE	*phServer;
	HRESULT		*pErrors;
	
	// Unadvise Callback
	HRESULT hRes = AtlUnadvise(m_IOPCGroupStateMgt, IID_IOPCDataCallback, m_dwAdvise);
	m_IOPCGroupStateMgt->Release();

	// Remove Items
	phServer = new OPCHANDLE[1];
	phServer[0] = m_ItemResult[0].hServer;

	r1 = m_IOPCItemMgt->RemoveItems(	1,		// [in] Remove two Items
								phServer,	// [in] Identified in by Server Handle
								&pErrors	// [out] Errors for each item, returned by OPC Server
							  );

	if ( (r1 != S_OK) && (r1 != S_FALSE) )
	{	MessageBox("RemoveItems failed!",
			       "Error RemoveItems()", MB_OK+MB_ICONERROR);
	}

	delete[] phServer; 
	CoTaskMemFree(pErrors);


	CoTaskMemFree(m_ItemResult);
	m_ItemResult=NULL;
	CoTaskMemFree(m_pErrors);
	m_pErrors=NULL;

	//Release Interface for async calls
	m_IOPCAsyncIO2->Release();
	m_IOPCAsyncIO2 = NULL;

	// Release ItemManagement Interface
	m_IOPCItemMgt->Release();
	m_IOPCItemMgt = NULL;
	
	// Remove Group
	r1=m_IOPCServer->RemoveGroup(m_GrpSrvHandle, TRUE);
	if (r1 != S_OK)
	{	MessageBox("RemoveGroup failed!",
			       "Error RemoveGroup()", MB_OK+MB_ICONERROR);
	}
	m_GrpSrvHandle = NULL;

	// Release OPC-Server
	m_IOPCServer->Release();
	m_IOPCServer = NULL;
	
	// Uninit COM
	CoUninitialize();	
}

void CAsynOpcDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	LPWSTR			ErrorStr;
	if(changeFlag==1)
	{
		m_dataValue=value[0];
		m_dataTS=timestamp[0];
		m_dataQulity=quility[0];
		changeFlag=0;
		UpdateData(FALSE);
	}
	if(readFlag==1)
	{
		m_readTS=readTS[0];
		m_readValue=readValue[0];
		m_readQulity=readQulity[0];
		readFlag=0;
		UpdateData(FALSE);
	}
	if(writeFlag==1)
	{
		m_IOPCServer->GetErrorString(writeRes[0], LOCALE_ID, &ErrorStr);
		m_writeResult=ErrorStr;
		writeFlag=0;
		UpdateData(FALSE);
	}	
	CDialog::OnTimer(nIDEvent);
}

void CAsynOpcDlg::OnRadioGroup1() 
{
	// TODO: Add your control notification handler code here
	ChangeGroup(L"grp1");	
	CallBack();
}

void CAsynOpcDlg::OnRadioGroup2() 
{
	// TODO: Add your control notification handler code here
	ChangeGroup(L"grp2");
	CallBack();
}

BOOL CAsynOpcDlg::ChangeGroup(LPWSTR szName)
{
	DWORD dwRevUpdateRate;BOOL m_bActivateGroup=FALSE;HRESULT r1;
	if(m_dwAdvise)
	{
	r1 = AtlUnadvise(m_IOPCGroupStateMgt, IID_IOPCDataCallback, m_dwAdvise);
	if(r1!=S_OK)
	{
		return FALSE;
	}

	r1=	m_IOPCGroupStateMgt->SetState(NULL,	// [in] RequestedUpdateRate
						&dwRevUpdateRate,	// [out] RevisedUpdateRate
						&m_bActivateGroup,//[in] ActiveFlag for Group
						NULL,				// [in] TimeBias
						NULL,				// [in] PercentDeadband
						NULL,				// [in] LCID
						NULL);		
	if (FAILED(r1))
	{	;
		return FALSE;
	}

	m_IOPCGroupStateMgt->Release();
	}
	
	r1=m_IOPCServer->GetGroupByName(szName,IID_IOPCItemMgt,(LPUNKNOWN*)&m_IOPCItemMgt);
	r1=m_IOPCItemMgt->QueryInterface(IID_IOPCGroupStateMgt, (void**) &m_IOPCGroupStateMgt);
	m_bActivateGroup=TRUE;
	r1=	m_IOPCGroupStateMgt->SetState(NULL,	// [in] RequestedUpdateRate
						&dwRevUpdateRate,	// [out] RevisedUpdateRate
						&m_bActivateGroup,  //[in] ActiveFlag for Group
						NULL,				// [in] TimeBias
						NULL,				// [in] PercentDeadband
						NULL,				// [in] LCID
						NULL);		
	if (FAILED(r1))
	{	;
		return FALSE;
	}
	if (r1 != S_OK) 
	{
		CoTaskMemFree(m_ItemResult);
		m_IOPCItemMgt->Release();
		m_IOPCItemMgt = 0;
		m_GrpSrvHandle = 0;
		return FALSE;
	}
	return TRUE;	
}

int CAsynOpcDlg::CallBack()
{
	HRESULT       r1; 
	r1=m_IOPCItemMgt->QueryInterface(IID_IOPCGroupStateMgt, (void**) &m_IOPCGroupStateMgt);

	if (r1 != S_OK) 
	{	
		CoTaskMemFree(m_ItemResult);
		m_IOPCItemMgt->Release();
		m_IOPCItemMgt = 0;
		m_GrpSrvHandle = 0;
		m_IOPCServer->Release();
		m_IOPCServer = NULL;
		CoUninitialize();
		return -1;
	}
    r1 = m_IOPCItemMgt->QueryInterface(IID_IOPCAsyncIO2, (void**)&m_IOPCAsyncIO2);
	if (r1 < 0)
	{
		CoTaskMemFree(m_ItemResult);
		m_IOPCItemMgt->Release();
		m_IOPCItemMgt = 0;
		m_GrpSrvHandle = 0;
		m_IOPCServer->Release();
		m_IOPCServer = NULL;
		CoUninitialize();
	    return -1;
	}
// Establish Callback for all async operations
	CComObject<COPCDataCallback>* pCOPCDataCallback;	// Pointer to Callback Object

	// Create Instance of Callback Object using an ATL template
    CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);

	LPUNKNOWN pCbUnk;
    pCbUnk = pCOPCDataCallback->GetUnknown();

    // Creates a connection between the OPC servers's connection point and 
	// this client's sink (the callback object). 
	HRESULT hRes = AtlAdvise(	m_IOPCGroupStateMgt,			 // [in] IUnknown Interface of the Connection Point
								pCbUnk,				 // [in] IUnknown Interface of the Callback object
								IID_IOPCDataCallback,// [in] Connection Point ID: The OPC Data Callback 
								&m_dwAdvise			 // [out] Cookie that that uniquely identifies the connection
							);

	if (hRes != S_OK) 
	{	
		CoTaskMemFree(m_ItemResult);
		m_IOPCItemMgt->Release();
		m_IOPCItemMgt = 0;
		return -1;
	}
	return 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -