📄 das_cnetdemodlg.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 + -