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

📄 mainfrm.cpp

📁 OPC和modbus详解odbus 协议是应用于电子控制器上的一种通用语言。通过此协议
💻 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 + -