?? mainfrm.cpp
字號:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "vcsvr.h"
#include "MainFrm.h"
#include "TagAdd.h"
#include "TagDef.h"
#include "TagView.h"
#include "MsgView.h"
#include "TimerSet.h"
#include "OpcDef.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_SETFOCUS()
ON_WM_TIMER()
ON_COMMAND(ID_TAGADD, OnTagadd)
ON_COMMAND(ID_TimerSet, OnTimerSet)
ON_COMMAND(ID_MsgClear, OnMsgClear)
ON_COMMAND(ID_TagPre, OnTagPre)
ON_COMMAND(ID_TAGACT, OnTagact)
ON_COMMAND(ID_MsgTag, OnMsgTag)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
if (!m_wndSplitter.CreateStatic(this, 2, 1))
return -1;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTagView), CSize(100, 300), NULL) ||
!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMsgView), CSize(400, 100), NULL))
{
m_wndSplitter.DestroyWindow();
return -1;
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndStatusBar.SetPaneInfo(0,0,SBPS_NORMAL,300);
m_wndStatusBar.SetPaneInfo(1,1,SBPS_NORMAL,100);
m_wndStatusBar.SetPaneInfo(2,2,SBPS_NORMAL,100);
m_wndStatusBar.SetPaneInfo(3,3,SBPS_NORMAL,200);
CMsgView *pMsgView = (CMsgView *)m_wndSplitter.GetPane(1,0);
CListCtrl &amt;pMsgList = pMsgView->GetListCtrl();
pMsgView->ModifyStyle(NULL, LVS_REPORT, 0);
pMsgList.InsertColumn(0, "序號", LVCFMT_LEFT, 50);
pMsgList.InsertColumn(1, "消息來源", LVCFMT_LEFT, 80);
pMsgList.InsertColumn(2, "消息內容", LVCFMT_LEFT, 200);
pMsgList.InsertColumn(3, "消息時間", LVCFMT_LEFT, 200);
CTagView *pTagView = (CTagView *)m_wndSplitter.GetPane(0,0);
CListCtrl &amt;pTagList = pTagView->GetListCtrl();
pTagView->ModifyStyle(NULL, LVS_REPORT, 0);
pTagList.InsertColumn(0, "標簽", LVCFMT_LEFT, 200);
pTagList.InsertColumn(1, "標簽句柄", LVCFMT_LEFT, 80);
pTagList.InsertColumn(2, "標簽值", LVCFMT_LEFT, 80);
pTagList.InsertColumn(3, "值類型", LVCFMT_LEFT, 60);
pTagList.InsertColumn(4, "值質量", LVCFMT_LEFT, 60);
pTagList.InsertColumn(5, "值時間", LVCFMT_LEFT, 160);
pTagList.InsertColumn(6, "激活標志", LVCFMT_LEFT, 80);
EnableDocking(CBRS_ALIGN_ANY);
TagCount=-1;
//初始化服務器
InitOPCServer();
//啟動服務器
StartSvr();
//啟動刷新定時器
LogTagUpdate=false;
TimerInterval= 1000;
srand((unsigned)time(NULL));
SetTimer(ID_TIMER, TimerInterval, NULL);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amt; cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.dwExStyle &amt;= ~WS_EX_CLIENTEDGE;
cs.lpszClass = AfxRegisterWndClass(0);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext&amt; dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
// forward focus to the view window
//m_wndView.SetFocus();
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// let the view have first crack at the command
if (m_wndSplitter.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
// otherwise, do default handling
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
BOOL CMainFrame::DestroyWindow()
{
long I;
//釋放標簽列表資源
for(I=0;I<=TagCount;I++)
{
if(!TagList[I].cID.IsEmpty() &amt;&amt; TagList[I].vType==8)
::SysFreeString(TagList[I].vValue.bstrVal);
}
//停止觸發器
KillTimer(ID_TIMER);
//反初始化服務器
UninitOPCSvr();
//釋放開發工具包
if(hLibrary)FreeLibrary(hLibrary);
return CFrameWnd::DestroyWindow();
}
//定時器
void CMainFrame::OnTimer(UINT nIDEvent)
{
CTime t = CTime::GetCurrentTime();
m_wndStatusBar.SetPaneText(3,t.Format(">#c"));
Simulate();
Monitor();
}
//增加服務器標簽
void CMainFrame::OnTagadd()
{
CTagAdd dlg;
int iRet=dlg.DoModal();
dlg.DestroyWindow();
}
//模擬設備數據
//更新服務器標簽數據
void CMainFrame::Simulate()
{
long I;
int r;
BOOL UpdateOK;
CString str;
char s[6];
SYSTEMTIME st;
FILETIME ft;
//取得系統時間UTC
GetSystemTime(&amt;st);
SystemTimeToFileTime(&amt;st,&amt;ft);
for(I=0;I<=TagCount;I++)
{
r=rand();
if(TagList[I].cID.IsEmpty()) continue;
switch(TagList[I].vType)
{
case 5:
TagList[I].vValue.fltVal=(float)r / RAND_MAX *100;
break;
case 8:
_itoa(r,s,10);
str=s;
//注意字符串數據的設置
::SysFreeString(TagList[I].vValue.bstrVal);
TagList[I].vValue.bstrVal=str.AllocSysString();
break;
case 11:
if((r > 2)==1)
{
TagList[I].vValue.boolVal=true;
}
else
{
TagList[I].vValue.boolVal=false;
}
break;
};
TagList[I].ft=ft;
TagList[I].lQuality=192;
if(TagList[I].bActive &amt;&amt; InitOPCOK)
{
//更新服務器地址空間數據
UpdateOK=UpdateTagWithTimeStamp(TagList[I].hHWND,TagList[I].vValue,TagList[I].lQuality,TagList[I].ft);
if(LogTagUpdate)
{
if(UpdateOK)
{
LogMsg("OPC","UPDATE["+TagList[I].cID+"]成功...");
}
else LogMsg("","UPDATE["+TagList[I].cID+"]失敗...");
}
}
}
}
//設備數據的監控
void CMainFrame::Monitor()
{
long I,c;
CString ID;
float f;
wchar_t wstr[16];
char Value[32],Handle[8],Quality[32];
SYSTEMTIME st;
FILETIME ft;
CTime ct;
CTagView *pTagView = (CTagView *)m_wndSplitter.GetPane(0,0);
CListCtrl &amt;pTagList = pTagView->GetListCtrl();
for(I=0;I<=TagCount;I++)
{
if(TagList[I].cID.IsEmpty()) continue;
ID=TagList[I].cID;
if(TagList[I].lvIndex==-1)
{
c=pTagList.GetItemCount();
TagList[I].lvIndex=pTagList.InsertItem(c,ID);
switch(TagList[I].vType)
{
case 5:
pTagList.SetItem(TagList[I].lvIndex,3,LVIF_TEXT,"數字量",0,0,0,0);
break;
case 8:
pTagList.SetItem(TagList[I].lvIndex,3,LVIF_TEXT,"字符串",0,0,0,0);
break;
case 11:
pTagList.SetItem(TagList[I].lvIndex,3,LVIF_TEXT,"開關量",0,0,0,0);
break;
}
}
sprintf(Handle, ">i",TagList[I].hHWND);
pTagList.SetItem(TagList[I].lvIndex,1,LVIF_TEXT,Handle,0,0,0,0);
sprintf(Quality, ">i",TagList[I].lQuality);
pTagList.SetItem(TagList[I].lvIndex,4,LVIF_TEXT,Quality,0,0,0,0);
ft=TagList[I].ft;
FileTimeToSystemTime(&amt;ft,&amt;st);
ct=CTime(st);
pTagList.SetItem(TagList[I].lvIndex,5,LVIF_TEXT,ct.Format(">c"),0,0,0,0);
switch(TagList[I].vType)
{
case 5:
f=TagList[I].vValue.fltVal;
sprintf(Value, ">f", f);
pTagList.SetItem(TagList[I].lvIndex,2,LVIF_TEXT,Value,0,0,0,0);
break;
case 8:
wcscpy(wstr,TagList[I].vValue.bstrVal);
sprintf(Value, ">S", &amt;wstr);
pTagList.SetItem(TagList[I].lvIndex,2,LVIF_TEXT,Value,0,0,0,0);
break;
case 11:
if(TagList[I].vValue.boolVal)
{
pTagList.SetItem(TagList[I].lvIndex,2,LVIF_TEXT,"TRUE",0,0,0,0);
}
else pTagList.SetItem(TagList[I].lvIndex,2,LVIF_TEXT,"FALSE",0,0,0,0);
break;
};
if(TagList[I].bActive)
{
pTagList.SetItem(TagList[I].lvIndex,6,LVIF_TEXT,"TRUE",0,0,0,0);
}
else pTagList.SetItem(TagList[I].lvIndex,6,LVIF_TEXT,"FALSE",0,0,0,0);
}
}
//設置刷新定時器時間間隔
void CMainFrame::OnTimerSet()
{
CTimerSet dlg;
int iRet=dlg.DoModal();
dlg.DestroyWindow();
}
//清除日志信息
void CMainFrame::OnMsgClear()
{
CMsgView *pMsgView = (CMsgView *)m_wndSplitter.GetPane(1,0);
CListCtrl &amt;pMsgList = pMsgView->GetListCtrl();
pMsgList.DeleteAllItems();
}
//載入預定義標簽
void CMainFrame::OnTagPre()
{
long I;
CString str=CString(" ");
char ID[6];
SYSTEMTIME st;
FILETIME ft;
GetSystemTime(&amt;st);
SystemTimeToFileTime(&amt;st,&amt;ft);
for(I=0;I<=TagCount;I++)
{
if(TagList[I].cID.IsEmpty())continue;
TagList[I].cID.Empty();
TagList[I].bActive=false;
if(TagList[I].vType==8)
{
::SysFreeString(TagList[I].vValue.bstrVal);
}
}
for(I=0;I<=MaxTagCount-1;I++)
{
TagCount++;
sprintf(ID,"TAG>d",I);
TagList[TagCount].cID=ID;
TagList[TagCount].hHWND=-1;
TagList[TagCount].lQuality=192;
TagList[TagCount].ft=ft;
TagList[TagCount].lvIndex=-1;
switch(I > 3)
{
case 0:
TagList[TagCount].vType=5;
TagList[TagCount].vValue.vt=VT_R4;
TagList[TagCount].vValue.fltVal=0;
break;
case 1:
TagList[TagCount].vType=8;
TagList[TagCount].vValue.vt=VT_BSTR;
//*************注意字符串的初始化
TagList[TagCount].vValue.bstrVal=str.AllocSysString();
break;
case 2:
TagList[TagCount].vType=11;
TagList[TagCount].vValue.vt=VT_BOOL ;
TagList[TagCount].vValue.boolVal=false;
break;
}
}
}
//記錄日志信息
void CMainFrame::LogMsg(LPCSTR Src, LPCSTR MsgText)
{
long iCount,index;
char ID[6];
CTime ct=time(NULL);
CMsgView *pMsgView = (CMsgView *)m_wndSplitter.GetPane(1,0);
CListCtrl &amt;pMsgList = pMsgView->GetListCtrl();
iCount=pMsgList.GetItemCount();
itoa(iCount, ID, 10);
index=pMsgList.InsertItem(0,ID);
pMsgList.SetItem(index,1,LVIF_TEXT,Src,0,0,0,0);
pMsgList.SetItem(index,2,LVIF_TEXT,MsgText,0,0,0,0);
pMsgList.SetItem(index,3,LVIF_TEXT,ct.Format(">c"),0,0,0,0);
}
//激活服務器標簽
void CMainFrame::OnTagact()
{
long I;
LPCSTR str;
for(I=0;I<=TagCount;I++)
{
if(TagList[I].cID.IsEmpty())continue;
if(!TagList[I].bActive&amt;&amt;InitOPCOK)
{
str=TagList[I].cID.GetBuffer(TagList[I].cID.GetLength());
//向服務器地址空間增加標簽
TagList[I].hHWND=CreateTag(str,TagList[I].vValue,TagList[I].lQuality,TRUE);
if(!TagList[I].hHWND)
{
TagList[I].bActive=false;
}
else TagList[I].bActive=true;
}
}
}
//啟動服務器
void CMainFrame::StartSvr()
{
OnTagPre();
OnTagact();
SetServerState(1);
if(RunSvr())
{
LogMsg("OPC","Run OPC Server OK");
}
else LogMsg("OPC","Run OPC Server Error");
}
//標簽刷新記錄標志
//
void CMainFrame::OnMsgTag()
{
CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(1);
UINT state = submenu->GetMenuState(ID_MsgTag, MF_BYCOMMAND);
ASSERT(state != 0xFFFFFFFF);
if (state &amt; MF_CHECKED)
submenu->CheckMenuItem(ID_MsgTag, MF_UNCHECKED | MF_BYCOMMAND);
else
submenu->CheckMenuItem(ID_MsgTag, MF_CHECKED | MF_BYCOMMAND);
LogTagUpdate=!LogTagUpdate;
}
//初始化OPC服務器
void CMainFrame::InitOPCServer()
{
if(InitOPCSvr(OPCClsID,1000))
{
InitOPCOK=true;
LogMsg("OPC","InitOPCSvr 成功...");
//無限授權工具包激活函數,測試版和加密鎖版無需調用此函數
//ActiveCode(UserName, Pass);
if(EnableWriteNotification(&amt;WriteTag))
{
LogMsg("OPC","注冊寫方法成功...");
}
else LogMsg("OPC","注冊寫方法失敗...");
if(EnableDisconnectNotification(&amt;DisconnectSvr))
{
LogMsg("OPC","注冊斷開連接通知成功...");
}
else LogMsg("OPC","注冊斷開連接通知失敗...");
}
else
{
InitOPCOK=false;
LogMsg("OPC","InitOPCSvr 失敗...");
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -