📄 tyopcclientdoc.cpp
字号:
// TYOPCClientDoc.cpp : implementation file
//
#include "stdafx.h"
#include "tyopcclient.h"
#include "TYOPCClientDoc.h"
#include "DlgOPCServerList.h"
#include "DlgOPCGroup.h"
#include "DlgOPCItemAdd.h"
#include "DlgOPCItemWrite.h"
#include "DlgModifyName.h"
#include "DlgOPCServerProperty.h"
#include "DlgPropertyOPCItem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern void LogMsg(UINT unEventID,CObject * pObject);
static LPCTSTR lpszRegSection = _T("Atuo Open File");
static LPCTSTR lpszName = _T("Name");
static LPCTSTR lpszNameID = _T("NameID");
/////////////////////////////////////////////////////////////////////////////
// CTYOPCClientDoc
IMPLEMENT_DYNCREATE(CTYOPCClientDoc, CDocument)
CTYOPCClientDoc::CTYOPCClientDoc()
{
EnableAutomation();
AfxOleLockApp();
m_dwSelBranch=SEL_BRANCH_NULL;
m_bAutoOpenFile=FALSE;
}
CTYOPCClientDoc::~CTYOPCClientDoc()
{
AfxOleUnlockApp();
CString strFileName=GetPathName ();
if(strFileName.IsEmpty ())
return;
AfxGetApp ()->WriteProfileString(lpszRegSection, lpszName, strFileName.operator LPCTSTR());
AfxGetApp ()->WriteProfileInt (lpszRegSection,lpszNameID, m_bAutoOpenFile);
}
void CTYOPCClientDoc::OnFinalRelease()
{
// When the last reference for an automation object is released
// OnFinalRelease is called. The base class will automatically
// deletes the object. Add additional cleanup required for your
// object before calling the base class.
CDocument::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CTYOPCClientDoc, CDocument)
//{{AFX_MSG_MAP(CTYOPCClientDoc)
ON_COMMAND(ID_OPCREMPC_ADD, OnOPCRemPCAdd)
ON_COMMAND(ID_OPCREMPC_DEL, OnOPCRemPCDel)
ON_COMMAND(ID_OPCREMPC_PROPER, OnOPCRemPCProperty)
ON_COMMAND(ID_OPCSERVER_ADD, OnOPCServerAdd)
ON_COMMAND(ID_OPCSERVER_DEL, OnOPCServerDel)
ON_COMMAND(ID_OPCSERVER_PROPER, OnOPCServerProperty)
ON_COMMAND(ID_OPCGROUP_ADD, OnOPCGroupAdd)
ON_COMMAND(ID_OPCGROUP_DEL, OnOPCGroupDel)
ON_COMMAND(ID_OPCITEM_ADD, OnOPCItemAdd)
ON_COMMAND(ID_OPCITEM_DEL, OnOPCItemDel)
ON_COMMAND(ID_OPCITEM_ASYNC20_READ, OnOPCItemAsync20Read)
ON_COMMAND(ID_OPCITEM_ASYNC20_REFRESH_CACHE, OnOPCItemAsync20RefreshCache)
ON_COMMAND(ID_OPCITEM_ASYNC20_REFRESH_DEVICE, OnOPCItemAsync20RefreshDevice)
ON_COMMAND(ID_OPCITEM_ASYNC20_WRITE, OnOPCItemAsync20Write)
ON_COMMAND(ID_OPCITEM_SET_ACTIVE, OnOPCItemSetActive)
ON_COMMAND(ID_OPCITEM_SET_INACTIVE, OnOPCItemSetInactive)
ON_COMMAND(ID_OPCGROUP_PROPER, OnOPCGroupProperty)
ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
ON_COMMAND(ID_AUTO_OPENFILE, OnAutoOpenFile)
ON_UPDATE_COMMAND_UI(ID_AUTO_OPENFILE, OnUpdateAutoOpenFile)
ON_COMMAND(ID_OPCITEM_PROPER, OnOPCGroupProperty)
//}}AFX_MSG_MAP
ON_UPDATE_COMMAND_UI_RANGE (ID_OPC_MSG_BEGIN, ID_OPC_MSG_END, OnUpdateCmdUI)
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CTYOPCClientDoc, CDocument)
//{{AFX_DISPATCH_MAP(CTYOPCClientDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
// Note: we add support for IID_ITYOPCClientDoc to support typesafe binding
// from VBA. This IID must match the GUID that is attached to the
// dispinterface in the .ODL file.
// {DE64F505-0EAC-4920-8FAA-BA75AFF94DAB}
static const IID IID_ITYOPCClientDoc =
{ 0xde64f505, 0xeac, 0x4920, { 0x8f, 0xaa, 0xba, 0x75, 0xaf, 0xf9, 0x4d, 0xab } };
BEGIN_INTERFACE_MAP(CTYOPCClientDoc, CDocument)
INTERFACE_PART(CTYOPCClientDoc, IID_ITYOPCClientDoc, Dispatch)
END_INTERFACE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTYOPCClientDoc diagnostics
#ifdef _DEBUG
void CTYOPCClientDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CTYOPCClientDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
BOOL CTYOPCClientDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
UpdateAllViews (NULL, HINT_NEW_DOCUMENT, NULL);
m_dwSelBranch=SEL_BRANCH_NULL;
m_cOPCMgt.DelAll();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CTYOPCClientDoc serialization
void CTYOPCClientDoc::Serialize(CArchive& ar)
{
//
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
CString strFileName=ar.GetFile()->GetFilePath ();
CString strTip;
// strTip.Format ("打开加载文件<%s>",this->GetPathName ());
strTip.Format ("打开加载文件<%s>",strFileName);
LogMsg(HINT_LOAD_PROJECT,(CObject *)&strTip);
// 打开文件------关闭旧文件
UpdateAllViews (NULL, HINT_OPEN_DOCUMENT, NULL);
m_dwSelBranch=SEL_BRANCH_NULL;
m_cOPCMgt.DelAll();
}
m_cOPCMgt.Serialize (ar);
}
/////////////////////////////////////////////////////////////////////////////
// CTYOPCClientDoc commands
/////////////////////////////////////////////////////////////////////////////
// CTYOPCClientDoc commands
//选择OPC服务器
void CTYOPCClientDoc::OnOPCServerConnect()
{
// TODO: Add your command handler code here
m_cOPCMgt.GetSelOPCServer ()->Connect ();
SetModifiedFlag (TRUE);
}
void CTYOPCClientDoc::SetSelOPC(COPCRemoteMachine* pOPCRM,COPCServer *pOPCServer,COPCGroup* pOPCGroup)
{
// if(m_cOPCMgt.GetSelOPCGroup ()!=pOPCGroup)
// UpdateAllViews (NULL,HINT_GROUP_SELECT,(CObject*)pOPCGroup);
m_cOPCMgt.SetSelOPC(pOPCRM,pOPCServer,pOPCGroup);
}
void CTYOPCClientDoc::SetSelOPCItem(CStringArray& strSelOPCItem)
{
m_strSelOPCItem.RemoveAll ();
m_strSelOPCItem.Append (strSelOPCItem);
}
//*
void CTYOPCClientDoc::OnOPCServerAdd()
{
//调用OPCServer列表
CDlgOPCServerList Dlg;
Dlg.SetOPCBrowse (&m_cOPCMgt);
if(IDOK==Dlg.DoModal ())
{ //得到OPC服务器
// CString strProgID=Dlg.m_strProgID;//Takebishi.Modbus.1
//调试
// strProgID="Takebishi.Modbus.1";
// CString strRemotePCName=Dlg.m_strRemotePCName;
// strRemotePCName=LOACAL_PC_NAME;
BeginWaitCursor();
COPCServer* pOPCServer=new COPCServer;
//OPC SERVER PC
pOPCServer->m_strRemoteMachine =Dlg.m_strRemPC ;
pOPCServer->m_strRemoteIP=Dlg.m_strIPAddr ;
//OPC SERVER PROGID
pOPCServer->m_strProgID=Dlg.m_strProgID;
//OPC SERVER NAME
pOPCServer->m_strName =Dlg.m_strOPCServerName ;
//OPC SERVER VERSION
pOPCServer->m_unOPCVersion =Dlg.m_unOPCVersion ;
//检查是否已经存在远程计算机
COPCRemoteMachine* pRemPC=NULL;
if(!m_cOPCMgt.IsBeingRemPC (pOPCServer->m_strRemoteMachine,pRemPC))
{
pRemPC=new COPCRemoteMachine;
pRemPC->AddOPCServer (pOPCServer);
//OPC SERVER PC IP ADDRESS
pRemPC->SetIPAddr (Dlg.m_strIPAddr);
pRemPC->SetName (Dlg.m_strRemPC);
m_cOPCMgt.AddOPCRemPC (pRemPC);
//更新视
this->UpdateAllViews (NULL,HINT_REMPC_ADD,(CObject*)pRemPC);
}
else
{
pRemPC->AddOPCServer (pOPCServer);
}
//连接 OPC Server
pOPCServer->Connect ();
//更新视
this->UpdateAllViews (NULL,HINT_SERVER_ADD,(CObject*)pOPCServer);
//
EndWaitCursor();
SetModifiedFlag (TRUE);
}
}
//*/
void CTYOPCClientDoc::OnOPCGroupAdd()
{
// TODO: Add your command handler code here
// interface:
CDlgOPCGroup dlg(m_cOPCMgt.GetSelOPCServer ());
if (dlg.DoModal () == IDOK)
{
BeginWaitCursor();
COPCServer* pOPCServer=m_cOPCMgt.GetSelOPCServer ();
CString strGroupName;
FLOAT fDeadband;
DWORD dwLanguageID;
DWORD dwUpdateRate;
long lTimeBias;
BOOL bActive;
strGroupName=dlg.GetOPCGroupName ();
dlg.GetOPCGroupState(
dwUpdateRate,
bActive,
lTimeBias,
fDeadband,
dwLanguageID);
int nAddOK=pOPCServer->AddGroup(
strGroupName,
lTimeBias, //时差(时间差)
fDeadband, //死区(百分数表示)
dwUpdateRate, //更新速率
dwLanguageID, //语言
bActive //是否活动状态
);
//更新相关视图
this->UpdateAllViews (NULL,HINT_GROUP_ADD,(CObject*)pOPCServer->GetSelGroup ());
//
EndWaitCursor();
SetModifiedFlag (TRUE);
}
}
void CTYOPCClientDoc::OnOPCGroupProperty()
{
// TODO: Add your command handler code here
CDlgOPCGroup dlg(m_cOPCMgt.GetSelOPCServer ());
COPCGroup* pGroup=m_cOPCMgt.GetSelOPCGroup ();
ASSERT(pGroup);
//设定标题
dlg.SetCaption (_T("组属性"));
//设定组名
dlg.SetOPCGroupName (pGroup->GetName ());
//设定组状态
dlg.SetOPCGroupState(
pGroup->GetUpdateRate (), //更新速率
pGroup->IsActive (), //是否活动状态
pGroup->GetTimeBias (), //时差(时间差)
pGroup->GetDeadband (), //死区(百分数表示)
pGroup->GetLanguageID ()); //语言
if (dlg.DoModal () == IDOK)
{
CString strGroupName;
FLOAT fDeadband;
DWORD dwLanguageID;
DWORD dwUpdateRate;
long lTimeBias;
BOOL bActive;
//等待处理...
BeginWaitCursor();
strGroupName=dlg.GetOPCGroupName ();
if(strGroupName!=pGroup->GetName ())
{
pGroup->SetName(strGroupName);
//通知树视刷新
UpdateAllViews (NULL, HINT_GROUP_RENAME, (CObject *)&strGroupName);
}
//
DWORD* pUpdateRate=NULL;
LONG* pTimeBias=NULL;
FLOAT* pDeadband=NULL;
BOOL* pActive=NULL;
strGroupName=dlg.GetOPCGroupName ();
dlg.GetOPCGroupState(
dwUpdateRate,
bActive,
lTimeBias,
fDeadband,
dwLanguageID);
if(dwUpdateRate!=pGroup->GetUpdateRate ())
pUpdateRate=&dwUpdateRate;
if(lTimeBias!=pGroup->GetTimeBias ())
pTimeBias=&lTimeBias;
if(fDeadband!=pGroup->GetDeadband ())
pDeadband=&fDeadband;
if(bActive!=pGroup->IsActive ())
pActive=&bActive;
if(pUpdateRate
||pTimeBias
||pDeadband
||pActive)
{
pGroup->SetState (pUpdateRate,
pActive,
pTimeBias,
pDeadband
);
//通知树视刷新
UpdateAllViews (NULL, HINT_GROUP_SET_STATE, (CObject *)pGroup);
}
//处理结束
EndWaitCursor();
SetModifiedFlag (TRUE);
}
}
void CTYOPCClientDoc::OnOPCItemAdd()
{
// TODO: Add your command handler code here
COPCGroup* pSelGroup=NULL;
// Get pointer to server that selected group belongs to:
// COPCServer *pServer = pSelGroup->GetParentServer ();
// ASSERT (pServer != NULL);
//调试使用
if(NULL==m_cOPCMgt.GetSelOPCGroup())
m_cOPCMgt.AddOPCGroup("opc01",TRUE);
// Create an item add dialog. Pass it a pointer to the group object
// items are to be added to, and the associated OPC Server's browser
// interface:
CDlgOPCItemAdd dlg (m_cOPCMgt.GetSelOPCServer ());
// Show as modal dialog. If user hits "OK", we need to add items to
// project:
if (dlg.DoModal () == IDOK)
{
//等待处理...
BeginWaitCursor();
//得到新增加的数据项
CObArray* pAddItems=dlg.GetAddItems();
COPCGroup * pGroup=m_cOPCMgt.GetSelOPCServer ()->GetSelGroup();
ASSERT(pGroup);
pGroup->AddItem(pAddItems);
//处理结束
EndWaitCursor();
UpdateAllViews (NULL, HINT_ITEM_ADD, pAddItems);
SetModifiedFlag (TRUE);
//
/* // Get the number of items to add specified in dialog:
int cnItems = dlg.GetItemCount ();
// If number of items is non-zero, then add them to project:
if (cnItems > 0)
{
// Get an object array containing the list of items to be added:
CObArray &cList = dlg.GetItemList ();
// If the number of items is large, then use a worker thread
// to add them:
if (cnItems > LARGE_ADDITEM_COUNT)
{
// Update status bar to indicate that we are adding items:
CKStatusBarText cText (IDS_ADDING_ITEMS);
// Create and fill a structure to pass to worker thread that
// contains the items to add and specifies the "add items" task:
WORKERTHREADARG tArg;
tArg.eTask = WORKERTHREADARG::ADD_ITEMS;
tArg.pvObjectA = (void *)&cList;
tArg.pvObjectB = (void *)&cnItems;
// Run a worker thread to add the items:
RunWorkerThread (&tArg);
}
// Else if number of items is small, add them directly:
else
pGroup->AddItems (cList, cnItems);
// Notify all views that item has been added:
UpdateAllViews (NULL, HINT_ITEM_ADD, &cList);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -