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

📄 dlgopcserverlist.cpp

📁 OPC Client 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			//
			pOPCBrowse->m_strPCName =*pstrPC;
			pOPCBrowse->m_strPCIP =*pstrIP;

		}
	}catch(...)
	{
		return false;
	}
	return true;
}

void CDlgOPCServerList::QueryOPCServer(CMapStringToPtr& cMapOPC,IOPCServerList *gpOPC,CLSID clsIDVersion)
{
	if(NULL==gpOPC)
		return;

	// 查询OPC DA组件目录接口指针
	IOPCEnumGUID *pEnumGUID;
	try{
		HRESULT hr = gpOPC->EnumClassesOfCategories( 
			1, &clsIDVersion, 
			1, &clsIDVersion, 
			(IEnumGUID**)&pEnumGUID); 
		if(S_OK!=hr)
			return;

		//获得支持OPC DA数据服务器的CLSID
		CLSID clsid;
		clsid = CLSID_OpcServerList;	//在opcenum_i.c中定义
		unsigned long c;
		while (S_OK == pEnumGUID->Next(1, &clsid, &c)) 
		{
			LPOLESTR pszProgID;
			LPOLESTR pszUserType;
			hr = gpOPC->GetClassDetails(&clsid, &pszProgID, &pszUserType);

			//打印OPC数据服务器的有关信息
			TRACE("ProgID = %ls, UserType = %ls\n", pszProgID, pszUserType);
	#ifdef _UNICODE

			COPCInfo *pOPCInfo=new COPCInfo;

			pOPCInfo->m_strName =szProgID;
			pOPCInfo->m_strProgID =szProgID;
			pOPCInfo->m_strUserType =szUserType;
	#else
			TCHAR szProgID [DEFBUFFSIZE];
			TCHAR szUserType [DEFBUFFSIZE];

			_wcstombsz (szProgID, pszProgID, sizeof (szProgID) / sizeof (TCHAR));
			_wcstombsz (szUserType, pszUserType, sizeof (szUserType) / sizeof (TCHAR));
			
			COPCInfo *pOPCInfo=new COPCInfo;

			pOPCInfo->m_strName =szProgID;
			pOPCInfo->m_strProgID =szProgID;
			pOPCInfo->m_strUserType =szUserType;

			cMapOPC.SetAt (szProgID,pOPCInfo);
	#endif
			CoTaskMemFree(pszProgID);
			CoTaskMemFree(pszUserType);
		}

	}catch(...)
	{
		printf("\n创建组件异常错误!\n");
	}
}

void CDlgOPCServerList::ShowOPCPC(COPCBrowse *pOPCBrowse)
{
	HTREEITEM hParent;
	HTREEITEM hOPCParent;
	HTREEITEM hOPCItem;

	UINT nMask=TVIF_IMAGE | TVIF_SELECTEDIMAGE |TVIF_TEXT| TVIF_PARAM;
//	hParent = m_ctrlTreeOPC.InsertItem (pOPCBrowse->m_strPCName , ILI_REMPC, ILI_REMPC,TVI_ROOT);
//	m_ctrlTreeOPC.SetItemData (hOPCParent,(DWORD)pOPCBrowse);
	//插入一个新的OPC Server PC
	hParent = m_ctrlTreeOPC.InsertItem (
		nMask,
		pOPCBrowse->m_strPCName,
		ILI_REMPC,
		ILI_REMPC,
		0,
		0,
		(LPARAM)pOPCBrowse,
		TVI_ROOT,
		TVI_SORT
		);

	CString strKey;
	COPCInfo* pOPCInfo;
	POSITION pos;
	//*
	//OPC1.0
//	hOPCParent = m_ctrlTreeOPC.InsertItem (lpszDataAccessServers10,ILI_CATAGORY, ILI_CATAGORY,hParent);
	hOPCParent = m_ctrlTreeOPC.InsertItem (
		nMask,
		lpszDataAccessServers10,
		ILI_CATAGORY,
		ILI_CATAGORY,
		0,
		0,
		(LPARAM)OPC_VER_10,
		hParent,
		TVI_LAST
		);

	pos=pOPCBrowse->m_cMapOPC10 .GetStartPosition ();
	while(pos)
	{
		pOPCBrowse->m_cMapOPC10.GetNextAssoc (pos,strKey,(void*&)pOPCInfo);
//		hOPCItem=m_ctrlTreeOPC.InsertItem (pOPCInfo->m_strProgID ,ILI_COMPONENT, ILI_COMPONENT,hOPCParent);
//		m_ctrlTreeOPC.SetItemData (hOPCItem,(DWORD)pOPCInfo);
		hOPCItem = m_ctrlTreeOPC.InsertItem (
			nMask,
			pOPCInfo->m_strProgID,
			ILI_COMPONENT,
			ILI_COMPONENT,
			0,
			0,
			(LPARAM)pOPCInfo,
			hOPCParent,
			TVI_SORT
			);
	}

	//OPC2.0
//	hOPCParent = m_ctrlTreeOPC.InsertItem (lpszDataAccessServers20,ILI_CATAGORY, ILI_CATAGORY,hParent);
	hOPCParent = m_ctrlTreeOPC.InsertItem (
		nMask,
		lpszDataAccessServers20,
		ILI_CATAGORY,
		ILI_CATAGORY,
		0,
		0,
		(LPARAM)OPC_VER_20,
		hParent,
		TVI_LAST
		);

	pos=pOPCBrowse->m_cMapOPC20 .GetStartPosition ();
	while(pos)
	{
		pOPCBrowse->m_cMapOPC20.GetNextAssoc (pos,strKey,(void*&)pOPCInfo);
//		hOPCItem=m_ctrlTreeOPC.InsertItem (pOPCInfo->m_strProgID  ,ILI_COMPONENT, ILI_COMPONENT,hOPCParent);
//		m_ctrlTreeOPC.SetItemData (hOPCItem,(DWORD)pOPCInfo);
		hOPCItem = m_ctrlTreeOPC.InsertItem (
			nMask,
			pOPCInfo->m_strProgID,
			ILI_COMPONENT,
			ILI_COMPONENT,
			0,
			0,
			(LPARAM)pOPCInfo,
			hOPCParent,
			TVI_SORT
			);
	}
	//OPC3.0
//	hOPCParent = m_ctrlTreeOPC.InsertItem (lpszDataAccessServers30,ILI_CATAGORY, ILI_CATAGORY,hParent);
	hOPCParent = m_ctrlTreeOPC.InsertItem (
		nMask,
		lpszDataAccessServers30,
		ILI_CATAGORY,
		ILI_CATAGORY,
		0,
		0,
		(LPARAM)OPC_VER_30,
		hParent,
		TVI_LAST
		);

	pos=pOPCBrowse->m_cMapOPC30 .GetStartPosition ();
	while(pos)
	{
		pOPCBrowse->m_cMapOPC30.GetNextAssoc (pos,strKey,(void*&)pOPCInfo);
//		hOPCItem=m_ctrlTreeOPC.InsertItem (pOPCInfo->m_strProgID ,ILI_COMPONENT, ILI_COMPONENT,hOPCParent);
//		m_ctrlTreeOPC.SetItemData (hOPCItem,(DWORD)pOPCInfo);
		hOPCItem = m_ctrlTreeOPC.InsertItem (
			nMask,
			pOPCInfo->m_strProgID,
			ILI_COMPONENT,
			ILI_COMPONENT,
			0,
			0,
			(LPARAM)pOPCInfo,
			hOPCParent,
			TVI_SORT
			);
	}
//*/
}

void CDlgOPCServerList::OnModify() 
{
	// TODO: Add your control notification handler code here

	//判断是否修改
	if(m_bNameChanged)
	{
		UpdateData (TRUE);
		if(m_nSelItem==OPC_SERVER)
		{
			m_pSelOPCInfo->m_strName =m_strOPCName;
		}
		else if(m_nSelItem==OPC_PC)
		{
			m_pSelOPCBrowse->m_strPCName =m_strOPCName;
		}
		else
		{
			TRACE("m_nSelItem=OPC_NULL\n");
		}
		m_bNameChanged=FALSE;
	}
	CWnd* pBtn;
	pBtn=GetDlgItem (IDC_MODIFY);
	pBtn->EnableWindow (FALSE);
}

void CDlgOPCServerList::OnChangeEditName() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	m_bNameChanged=TRUE;
	CWnd* pBtn;
	pBtn=GetDlgItem (IDC_MODIFY);
	pBtn->EnableWindow (TRUE);
}

//增加OPC SERVER PC
void CDlgOPCServerList::OnAddOPCPC() 
{
	// TODO: Add your control notification handler code here
	CDlgOPCPC dlg;
	if(dlg.DoModal ()==IDOK)
	{
		if(!dlg.m_strIPAddr.IsEmpty())
		{
			COPCBrowse* pOPCBrowse=NULL;
			if(QueryOPCServer(&dlg.m_strPCName,&dlg.m_strIPAddr ,pOPCBrowse))
			{
				m_pcMapOPCBrowse->SetAt (dlg.m_strPCName,pOPCBrowse);
				
				BeginWaitCursor();

				ShowOPCPC(pOPCBrowse);

				EndWaitCursor();

			}
			else
			{
				CString strTip;
				strTip.Format(_T("%s[%s]没有查询到OPC Server"),dlg.m_strPCName,dlg.m_strIPAddr);
				AfxMessageBox(strTip);
			}
		}	
	}
}


//重新搜索OPC PC中的OPC SERVER
void CDlgOPCServerList::OnReflash() 
{
	// TODO: Add your control notification handler code here
	BeginWaitCursor();

	ASSERT(m_hSelItem);
	ASSERT(m_pSelOPCBrowse);
	
	m_ctrlTreeOPC.DeleteItem (m_hSelItem);

	CString strName=m_pSelOPCBrowse->m_strPCName ;
	CString strIP=m_pSelOPCBrowse->m_strPCIP ;
	m_pcMapOPCBrowse->RemoveKey (strName);
	delete m_pSelOPCBrowse;
	m_pSelOPCBrowse=NULL;

	COPCBrowse* pOPCBrowse=NULL;
	if(QueryOPCServer(&strName,&strIP,pOPCBrowse))
	{
		m_pcMapOPCBrowse->SetAt (strName,pOPCBrowse);
		ShowOPCPC(pOPCBrowse);
	}

	EndWaitCursor();
}

void CDlgOPCServerList::OnOK() 
{
	// TODO: Add extra validation here
	NameChanged();

	//1.OPC PC   计算机名称
	m_strRemPC=m_pSelOPCBrowse->m_strPCName ;

	//2.OPC PC IP Address  计算机名称
	m_strIPAddr=m_pSelOPCBrowse->m_strPCIP ;

	//3.OPC Server ProgID
	m_strProgID=m_pSelOPCInfo->m_strProgID ;

	//4.OPC Server  Name
	m_strOPCServerName=m_pSelOPCInfo->m_strName ;

	//5.OPC Version	不同的版本有不同的接口
//	m_unOPCVersion;	
	

	CDialog::OnOK();
}

void CDlgOPCServerList::NameChanged()
{
	if(m_bNameChanged)
	{
		UpdateData (TRUE);
		CString strTip;
		strTip.Format(_T("名称:%s被修改为%s\n\n是否保存"),m_strOldOPCName,m_strOPCName);
		if(AfxMessageBox(strTip,MB_OKCANCEL| MB_ICONQUESTION)==IDOK)
		{
			if(m_nSelItem==OPC_SERVER)
			{
				m_pSelOPCInfo->m_strName =m_strOPCName;
			}
			else if(m_nSelItem==OPC_PC)
			{
				m_pSelOPCBrowse->m_strPCName =m_strOPCName;
			}
			else
			{
				TRACE("m_nSelItem=OPC_NULL\n");
			}
		}
		m_bNameChanged=FALSE;
	}
}

void CDlgOPCServerList::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(WM_TIMER_OPCBROWSE_EVENT==nIDEvent)
	{
		//
		KillTimer(WM_TIMER_OPCBROWSE_EVENT);

		//
		BeginWaitCursor();

		//
		ASSERT(m_pcMapOPCBrowse);
		if(m_pcMapOPCBrowse->GetCount ()<=0)	//读取OPCSerer PC
		{
			//读取本地OPC
			CString strLoacalName=LOACAL_PC_NAME;
			//获取本地IP
			CString strLoacalIP=LOACAL_PC_NAME;
			//
			COPCBrowse* pOPCBrowse=NULL;
			if(QueryOPCServer(&strLoacalName,&strLoacalIP,pOPCBrowse))
				m_pcMapOPCBrowse->SetAt (strLoacalName,pOPCBrowse);

		}

		POSITION pos=m_pcMapOPCBrowse->GetStartPosition ();
		while(pos)
		{
			COPCBrowse* pOPCBrowse;
			CString strPCName;
			m_pcMapOPCBrowse->GetNextAssoc (pos,strPCName,(void*&)pOPCBrowse);

			ShowOPCPC(pOPCBrowse);
		}
	/*
		HTREEITEM hParent;

		//增加OPCDA1.0服务器
 		TRACE("\n%s\n",lpszDataAccessServers10);
		hParent = m_ctrlTreeOPC.InsertItem (lpszDataAccessServers10, ILI_CATAGORY, ILI_CATAGORY);
		BrowsOPCServer (hParent, CATID_OPCDAServer10);

		//增加OPCDA2.0服务器
 		TRACE("\n%s\n",lpszDataAccessServers20);
		hParent = m_ctrlTreeOPC.InsertItem (lpszDataAccessServers20, ILI_CATAGORY, ILI_CATAGORY);
		BrowsOPCServer (hParent, CATID_OPCDAServer20);

		//增加OPCDA3.0服务器
 		TRACE("\n%s\n",lpszDataAccessServers30);
		hParent = m_ctrlTreeOPC.InsertItem (lpszDataAccessServers30, ILI_CATAGORY, ILI_CATAGORY);
		BrowsOPCServer (hParent, CATID_OPCDAServer30);
		
		//增加OPC服务器----
	//	hParent = m_ctrlTreeOPC.InsertItem (lpszOPCServers, ILI_CATAGORY, ILI_CATAGORY);
	//	DisplayGeneralOPCServers (hParent);
	//*/
		EndWaitCursor();

	}

	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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