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

📄 tyopcclientdoc.cpp

📁 OPC Client 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -