📄 dlgopcserverlist.cpp
字号:
//
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 + -