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

📄 das_cnetdemodlg.cpp

📁 OPC 开发工具包2.0 OPC工具包是用来简化OPC规范服务器开发的工具包
💻 CPP
字号:
// DAS_CNETDEMODlg.cpp : 实现文件
//

#include "stdafx.h"
#include "DAS_CNETDEMO.h"
#include "DAS_CNETDEMODlg.h"
#include "DASVRSDK.h"
#include "AboutDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CDAS_CNETDEMODlg 对话框



CDAS_CNETDEMODlg::CDAS_CNETDEMODlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDAS_CNETDEMODlg::IDD, pParent)
	, InitOPCOK(false)
	, Counter(0)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDAS_CNETDEMODlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TREE1, m_Tree);
	DDX_Control(pDX, IDC_LIST1, m_List);
}

BEGIN_MESSAGE_MAP(CDAS_CNETDEMODlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_FILE_REGISTERSERVER, OnFileRegisterserver)
	ON_COMMAND(ID_FILE_UNREGISTERSERVER, OnFileUnregisterserver)
	ON_COMMAND(ID_FILE_EXIT, OnFileExit)
	ON_WM_TIMER()
	ON_NOTIFY(LVN_ODSTATECHANGED, IDC_LIST1, OnLvnOdstatechangedList1)
	ON_WM_SHOWWINDOW()
	ON_WM_DESTROY()
	ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnTvnSelchangedTree1)
	ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)
END_MESSAGE_MAP()


// CDAS_CNETDEMODlg 消息处理程序

BOOL CDAS_CNETDEMODlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	
	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CDAS_CNETDEMODlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CDAS_CNETDEMODlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CDAS_CNETDEMODlg::OnFileRegisterserver()
{
	RegServer(OPCClsID, OPCProgID, OPCDesc,ExeName); 
}

void CDAS_CNETDEMODlg::OnFileUnregisterserver()
{
	UnregServer(OPCClsID, OPCProgID);
}

void CDAS_CNETDEMODlg::OnFileExit()
{
	DestroyWindow();
}

void CDAS_CNETDEMODlg::CreateOPCServer(void)
{
	if(CreateServer(OPCClsID,2000))
	{
		InitOPCOK=true;
		SetWriteCallback(WriteCallback);
		SetServerNotify(ServerNotify);
		SetReadCallback(ReadCallback);
		SetTagQualifier(44);
		AddTags();
		SetServerState(1);
		SetTimer(ID_TIMER, 2000, NULL);
	}
	else InitOPCOK=false;
}

void CDAS_CNETDEMODlg::FreeOPCServer(void)
{
	if (InitOPCOK)
	{
		long I;
		KillTimer(ID_TIMER);
		for(I=0;I<=TagCount;I++)
		{
			if(TagList[I].vType==8)
				::SysFreeString(TagList[I].vValue.bstrVal);
		}
		FreeServer();
		FreeOPCDef();
	}
}

void CDAS_CNETDEMODlg::AddTags(void)
{
	long I,h;
	FILETIME ft;
	_TREEITEM *rti;

	rti=m_Tree.InsertItem("VCDEMO",TVI_ROOT,TVI_LAST);
	m_Tree.InsertItem("Integer",rti,TVI_LAST);
	m_Tree.InsertItem("String",rti,TVI_LAST);
	m_Tree.InsertItem("Bool",rti,TVI_LAST);
	m_Tree.InsertItem("Float",rti,TVI_LAST);
	m_Tree.Expand(rti,TVE_EXPAND);

	GetSystemTimeAsFileTime(&ft);
	SetTagQualifier(46);
	TagCount=-1;

	h=RegTagEx(0,"Integer",VT_EMPTY,0);
	for(I=0;I<8;I++)
	{
		TagCount++;
		TagList[TagCount].cID.Format("TagInt%d",I);
		TagList[TagCount].lQuality=192;
		TagList[TagCount].ft=ft;
		TagList[TagCount].vType=VT_I4;
		TagList[TagCount].vValue.vt=VT_I4;
		TagList[TagCount].vValue.intVal=0;	
		TagList[TagCount].hHWND=RegTagEx(h,TagList[TagCount].cID,VT_I4,3);
	}

	h=RegTagEx(0,"String",VT_EMPTY,0);
	for(I=0;I<8;I++)
	{
		TagCount++;
		TagList[TagCount].cID.Format("TagString%d",I);
		TagList[TagCount].lQuality=192;
		TagList[TagCount].ft=ft;
		TagList[TagCount].vType=VT_BSTR;
		TagList[TagCount].vValue.bstrVal=CString("Agilewill").AllocSysString();
		TagList[TagCount].vValue.vt=VT_BSTR;
		TagList[TagCount].hHWND=RegTagEx(h,TagList[TagCount].cID,VT_BSTR,3);
	}

	h=RegTagEx(0,"Bool",VT_EMPTY,0);
	for(I=0;I<8;I++)
	{
		TagCount++;
		TagList[TagCount].cID.Format("TagBool%d",I);
		TagList[TagCount].lQuality=192;
		TagList[TagCount].ft=ft;
		TagList[TagCount].vType=VT_BOOL;
		TagList[TagCount].vValue.vt=VT_BOOL;
		TagList[TagCount].hHWND=RegTagEx(h,TagList[TagCount].cID,VT_BOOL,3);
	}

	h=RegTagEx(0,"Float",VT_EMPTY,0);
	for(I=0;I<8;I++)
	{
		TagCount++;
		TagList[TagCount].cID.Format("TagFloat%d",I);
		TagList[TagCount].lQuality=192;
		TagList[TagCount].ft=ft;
		TagList[TagCount].vType=VT_R4;
		TagList[TagCount].vValue.vt=VT_R4;
		TagList[TagCount].vValue.fltVal=0;
		TagList[TagCount].hHWND=RegTagEx(h,TagList[TagCount].cID,VT_R4,3);
	}
}

void CDAS_CNETDEMODlg::OnTimer(UINT nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	Simulate();
	CDialog::OnTimer(nIDEvent);
}

void CDAS_CNETDEMODlg::Simulate(void)
{
	long I;
	CString str;
	char s[6];
	FILETIME ft;
	GetSystemTimeAsFileTime(&ft);
	Counter++;
	for(I=0;I<=TagCount;I++)
	{
		if(I % 8<4)
		{
			switch(TagList[I].vType)
			{
			case VT_I4:
				TagList[I].vValue.intVal=TagList[I].vValue.intVal+1;
				break;
			case VT_R4:
				TagList[I].vValue.fltVal=TagList[I].vValue.fltVal+1;
				break;
			case VT_BSTR:
				_itoa(Counter,s,10);
				str=s;
				::SysFreeString(TagList[I].vValue.bstrVal);
				TagList[I].vValue.bstrVal=str.AllocSysString();
				break;
			case VT_BOOL:
				if((Counter % 2)==1)
				{
					TagList[I].vValue.boolVal=true;
				}
				else TagList[I].vValue.boolVal=false;
				break;
			};
			TagList[I].ft=ft;
			TagList[I].lQuality=192;
		}
		UpdateTagWithTimeStamp(TagList[I].hHWND,TagList[I].vValue, TagList[I].lQuality, TagList[I].ft);
	};
	Monitor();
}

void CDAS_CNETDEMODlg::Monitor(void)
{
	SYSTEMTIME st;
	FILETIME ft;
	wchar_t wstr[16];
	CTime ct;
	int I,J;
	_TREEITEM *pi;

	pi=m_Tree.GetSelectedItem();
	CString cs=m_Tree.GetItemText(pi);
	J=-1;
	if(cs=="Integer") J=0;
	if(cs=="String") J=8;
	if(cs=="Bool") J=16;
	if(cs=="Float") J=24;
	if(J==-1) return;


	m_List.DeleteAllItems();
	
	int Index;
	char Data[32];

	for(I=0; I<8;I++)
	{
		Index=m_List.InsertItem(I,TagList[I+J].cID);

		sprintf(Data, "%i",TagList[I+J].hHWND);
		m_List.SetItemText(Index,1,Data);

		sprintf(Data, "%i",TagList[I+J].vType);
		m_List.SetItemText(Index,2,Data);

		switch(TagList[I+J].vType)
		{
		case VT_I4:
			sprintf(Data, "%i",TagList[I+J].vValue.intVal);
			m_List.SetItemText(Index,1,Data);
			break;
		case VT_BSTR:
			wcscpy(wstr,TagList[I+J].vValue.bstrVal);
			sprintf(Data, "%S", &wstr);
			m_List.SetItemText(Index,1,Data);
			break;
		case VT_BOOL:
			if(TagList[I+J].vValue.boolVal) 
			{
				m_List.SetItemText(Index,1,"TRUE");
			}
			else m_List.SetItemText(Index,1,"FALSE");
			break;
		case VT_R4:
			sprintf(Data, "%f",TagList[I+J].vValue.fltVal);
			m_List.SetItemText(Index,1,Data);
			break;
		}
		sprintf(Data, "%i",TagList[I+J].lQuality);
		m_List.SetItemText(Index,2,Data);

		//ft=TagList[I+J].ft;
		FileTimeToLocalFileTime(&TagList[I+J].ft, &ft);
		FileTimeToSystemTime(&ft,&st);
		ct=CTime(st);
		m_List.SetItemText(Index,3,ct.Format("%c"));
	}
}

void CDAS_CNETDEMODlg::OnLvnOdstatechangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLVODSTATECHANGE pStateChanged = reinterpret_cast<LPNMLVODSTATECHANGE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;

}

void CDAS_CNETDEMODlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CDialog::OnShowWindow(bShow, nStatus);
	m_List.InsertColumn(0, "ID", LVCFMT_LEFT, 80); 
	m_List.InsertColumn(1, "VALUE", LVCFMT_LEFT, 80); 
	m_List.InsertColumn(2, "QUALITY", LVCFMT_LEFT, 60); 
	m_List.InsertColumn(3, "TIMESTAMP", LVCFMT_LEFT, 160);
	CreateOPCServer();
	// TODO: 在此处添加消息处理程序代码
}

void CDAS_CNETDEMODlg::OnDestroy()
{
	CDialog::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	FreeOPCServer();
}

void CDAS_CNETDEMODlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	Monitor();
	*pResult = 0;
}

void CDAS_CNETDEMODlg::OnHelpAbout()
{
	CAboutDialog aboutDlg;
	aboutDlg.DoModal();	
}

⌨️ 快捷键说明

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