在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++网络编程 → VC++电力规约调试工具源码(IEC104\IEC101\MODBUS)

VC++电力规约调试工具源码(IEC104\IEC101\MODBUS)

C/C++网络编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:13.31M
  • 下载次数:91
  • 浏览次数:896
  • 发布时间:2019-03-20
  • 实例类别:C/C++网络编程
  • 发 布 人:ljt8015
  • 文件格式:.zip
  • 所需积分:2
 相关标签: c++ c 调试工具 VC++ 源码

实例介绍

【实例简介】支持IEC104\IEC101\MODBUS规约,支持tcpserver、tcpclient、串口通信
【实例截图】

【核心代码】


// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "MaintTool.h"

#include "MainFrm.h"
#include "MaintToolDoc.h"
#include "MaintToolView.h"
////////////////
#include "YXData.h"
#include "YCData.h"
#include "YMData.h"
#include "YKData.h"
#include "SETData.h"

#include "SettingCmmDlg.h"
#include "SettingPrtDlg.h"
#include "DataMonitorDlg.h"
/////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_SET_CMMPORT, OnSetCmmPort)
	ON_COMMAND(ID_SET_PROTOCOL, OnSetProtocol)
	ON_COMMAND(ID_COMMAND_CONCMM, OnConnectCmm)
	ON_COMMAND(ID_COMMAND_DISCONCMM, OnDisconncmm)
	ON_COMMAND(ID_COMMAND_DATAMONITOR, OnDataMonitor)
	ON_UPDATE_COMMAND_UI(ID_COMMAND_CONCMM, OnUpdateConcmm)
	ON_UPDATE_COMMAND_UI(ID_COMMAND_DISCONCMM, OnUpdateDisconcmm)
	ON_WM_CLOSE()
	ON_COMMAND(ID_VIEW_DATA, OnViewData)
	ON_COMMAND(ID_VIEW_MESSAGE, OnViewMessage)
	ON_UPDATE_COMMAND_UI(ID_VIEW_DATA, OnUpdateViewData)
	ON_UPDATE_COMMAND_UI(ID_VIEW_MESSAGE, OnUpdateViewMessage)
	ON_COMMAND(ID_COMMAND_PAUSE_DSP, OnPauseDsp)
	ON_COMMAND(ID_COMMAND_REFLASH_DSP, OnReflashDsp)
	ON_UPDATE_COMMAND_UI(ID_COMMAND_PAUSE_DSP, OnUpdatePauseDsp)
	ON_UPDATE_COMMAND_UI(ID_COMMAND_REFLASH_DSP, OnUpdateReflashDsp)
	ON_COMMAND(ID_COMMAND_CLEAR_DSP, OnClearDsp)
	ON_WM_SIZE()
	//}}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()
{
	IsCmmConnect = false;
	IsReflashMsg = true;
	IsFrameCreat = false;
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

   HBITMAP hbm  = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
                  MAKEINTRESOURCE(IDB_TOOLBAR), //加载IDB_TOOLBAR
                  IMAGE_BITMAP, //按位图格式
                  0,0, // cx,cy
                  LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );

   HBITMAP hbm2 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
                  MAKEINTRESOURCE(IDB_GRAYTOOLBAR), //加载IDB_TOOLBAR
                  IMAGE_BITMAP, //按位图格式
                  0,0, // cx,cy
                  LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );


  CBitmap bm,bm2;
  bm.Attach(hbm); 
  bm2.Attach(hbm2);

  m_ToolBar.Create(24,24,ILC_COLOR16, 12, 0);
  m_ToolBar.Add(&bm,(CBitmap*)NULL);

  m_GrayToolBar.Create(24,24,ILC_COLOR16, 12, 0);
  m_GrayToolBar.Add(&bm2,(CBitmap*)NULL);
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
         
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

    m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ToolBar);
	m_wndToolBar.GetToolBarCtrl().SetDisabledImageList(&m_GrayToolBar);

	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
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable 
	//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	//EnableDocking(CBRS_ALIGN_ANY);
	//DockControlBar(&m_wndToolBar);
    ///////////////////
    if (!m_wndMyBar1.Create(_T("数字显示窗口"), this, CSize(500,360),TRUE,123))
	{
		TRACE0("Failed to create mybar\n");
			return -1;
	}
	if (!m_wndMyBar2.Create(_T("信息提示窗口"), this,CSize(300,300),TRUE,124))
	{
		TRACE0("Failed to create mybar\n");
			return -1;
	}
    //////////////////////////////////////
	m_wndToolBar.SetButtonText(0,"打开");
	m_wndToolBar.SetButtonText(1,"保存");
    m_wndToolBar.SetButtonText(3,"规约");
    m_wndToolBar.SetButtonText(4,"端口");
    m_wndToolBar.SetButtonText(6,"连接");
	m_wndToolBar.SetButtonText(7,"断开");
    m_wndToolBar.SetButtonText(9,"数据");
    m_wndToolBar.SetButtonText(10,"消息");
	m_wndToolBar.SetButtonText(12,"暂停");
    m_wndToolBar.SetButtonText(13,"刷新");
    m_wndToolBar.SetButtonText(14,"清空");
    m_wndToolBar.SetButtonText(16,"关于");
	/////////////调整工具条/////////////////
    CRect rc(0, 0, 0, 0);
	CSize sizeMax(0, 0);
	CToolBarCtrl& bar = m_wndToolBar.GetToolBarCtrl();
	for (int nIndex = bar.GetButtonCount() - 1; nIndex >= 0; nIndex--)
	{
		bar.GetItemRect(nIndex, rc);

		rc.NormalizeRect();
		sizeMax.cx = __max(rc.Size().cx, sizeMax.cx);
		sizeMax.cy = __max(rc.Size().cy, sizeMax.cy);
	}
	m_wndToolBar.SetSizes(sizeMax, CSize(24,24));
	////////////创建TAB Control,并把它加入到ControlBar中
	/// 需要注意的是:同一个ControlBar只能加入一个"一级子窗口"
	m_TabCtrl.Create(TCS_DOWN|WS_CHILD|WS_VISIBLE,CRect(0,0,100,100),&m_wndMyBar1,125);
	
	m_TabCtrl.AddPage(RUNTIME_CLASS(CYXData),IDD_YXDATA,"遥信",IDI_ICON_yx);
    m_TabCtrl.AddPage(RUNTIME_CLASS(CYCData),IDD_YCDATA,"遥测",IDI_ICON_yc);
	m_TabCtrl.AddPage(RUNTIME_CLASS(CYMData),IDD_YMDATA,"遥脉",IDI_ICON_ym);
	m_TabCtrl.AddPage(RUNTIME_CLASS(CYKData),IDD_YKDATA,"遥控",IDI_ICON_yk);
	m_TabCtrl.AddPage(RUNTIME_CLASS(CSETData),IDD_SETDATA,"设定",IDI_ICON_yk);
	m_TabCtrl.UpdateWindow();

	////////////创建LIST Control,并把它加入到ControlBar中LVS_REPORT
	m_MsgList.Create(WS_THICKFRAME | WS_VSCROLL | WS_CHILD | WS_VISIBLE | LVS_REPORT,CRect(0,0,0,0),&m_wndMyBar2,126);
    
	DWORD styles = m_MsgList.GetExtendedStyle();
	m_MsgList.SetExtendedStyle(styles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //整行选择和网格条纹	

  	LVCOLUMN  column[4];
	int i;
	for (i=0; i<4; i  )
	{
        column[i].mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
		column[i].fmt = LVCFMT_LEFT;
		column[i].iSubItem = i;
		column[i].iOrder = i;
	}
	column[0].pszText = "名称";
	column[1].pszText = "类型";
    column[2].pszText = "时间";
	column[3].pszText = "状态";
    column[0].cx = 300;
	column[1].cx = 100;
    column[2].cx = 200;
	column[3].cx = 200;

	for (i=0; i<4; i  )
	    m_MsgList.InsertColumn(i, column i);

	
 ///////////////两个WNDBAR的停靠控制///////////////////
	m_wndMyBar1.SetBarStyle(m_wndMyBar1.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
	m_wndMyBar2.SetBarStyle(m_wndMyBar2.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
	
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);     //使工具栏可停靠
	m_wndMyBar1.EnableDocking(CBRS_ALIGN_ANY);
	m_wndMyBar2.EnableDocking(CBRS_ALIGN_ANY);
	
	EnableDocking(CBRS_ALIGN_ANY);

	DockControlBar(&m_wndToolBar);                 //3个工具栏停靠方式
	DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_LEFT);
	DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_BOTTOM);
	/////////使浮动与停靠显示相同的头部////
	#ifdef _SCB_REPLACE_MINIFRAME
    m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd);
	#endif //_SCB_REPLACE_MINIFRAME
	///////////////////
    IsFrameCreat = true;

	return 0;
}

void CMainFrame::ListInsertEpdSoe(BYTE type, WORD dot, BYTE status, SOE_TIME *ptime)  //显示SOE,EPD
{
    int nRow;
    char ss[64];
	CTime time = CTime::GetCurrentTime();

	sprintf(ss, "遥信%d", dot);
	nRow = m_MsgList.InsertItem(0, ss);//插入行

    if(type == EPD)
	{
       m_MsgList.SetItemText(nRow, 1, "COS(单点)");//
       sprintf(ss,"%04d-%02d-%02d %02d:%02d:%02d", 
		          time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
	   m_MsgList.SetItemText(nRow, 2, ss);
	}
	else if(type == EPD2)
	{
       m_MsgList.SetItemText(nRow, 1, "COS(双点)");//
       sprintf(ss,"%04d-%02d-%02d %02d:%02d:%02d", 
		          time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
	   m_MsgList.SetItemText(nRow, 2, ss);
	}
	else if(type == SOE)
	{
       m_MsgList.SetItemText(nRow, 1, "SOE(单点)");//
       sprintf(ss,"%04d-%02d-%02d %02d:%02d:%02d.%03d", 
	   	          ptime->year 2000, ptime->month, ptime->day, ptime->hour, ptime->minute, (ptime->msh*256 ptime->msl)/1000, (ptime->msh*256 ptime->msl)%1000);
	   m_MsgList.SetItemText(nRow, 2, ss);      
	}
	else if(type == SOE2)
	{
       m_MsgList.SetItemText(nRow, 1, "SOE(双点)");//
       sprintf(ss,"%04d-%02d-%02d %02d:%02d:%02d.%03d", 
	   	          ptime->year 2000, ptime->month, ptime->day, ptime->hour, ptime->minute, (ptime->msh*256 ptime->msl)/1000, (ptime->msh*256 ptime->msl)%1000);
	   m_MsgList.SetItemText(nRow, 2, ss);      
	}
    sprintf(ss, "%d", status);
    m_MsgList.SetItemText(nRow, 3, ss);//设置数据
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


void CMainFrame::OnSetCmmPort() 
{
   SetCmmPort();
}

void CMainFrame::OnDataMonitor() 
{
   CDataMonitorDlg DMDlg;
   if (DMDlg.DoModal()==IDOK)
   {

   }
}

void CMainFrame::OnSetProtocol() 
{
   CSettingPrtDlg PrtDlg;
   if (PrtDlg.DoModal()==IDOK)   // TODO: 保存通讯对话框设置的参数
	{
	  CMaintToolDoc* pDoc;
	  pDoc  = (CMaintToolDoc*)GetActiveDocument();  
	  ASSERT_VALID(pDoc);
    
	    switch (PrtDlg.m_PrtType)    //选中通讯规约
		{
	      case 0:
             pDoc->m_PrtType    = pDoc->IEC104_M;
			 pDoc->m_MasterFlag = true;
		     break;
	      case 1:
             pDoc->m_PrtType    = pDoc->IEC101_M;
			 pDoc->m_MasterFlag = true;
		     break;
          case 2:
             pDoc->m_PrtType    = pDoc->IEC101_S;
			 pDoc->m_MasterFlag = false;
		     break;
          case 3:
             pDoc->m_PrtType    = pDoc->Modbus_M;
			 pDoc->m_MasterFlag = true;
		     break;
          case 4:
             pDoc->m_PrtType    = pDoc->Modbus_S;
			 pDoc->m_MasterFlag = false;
		     break;
	      default:
             pDoc->m_PrtType    = pDoc->IEC104_M;
			 pDoc->m_MasterFlag = true;
		     break;
		}

	  //信息体寄存器地址、数量情况	 
	  pDoc->m_YXAddr = PrtDlg.m_YXAddr;   
	  pDoc->m_YCAddr = PrtDlg.m_YCAddr;
	  pDoc->m_YMAddr = PrtDlg.m_YMAddr;
	  pDoc->m_YXNum  = PrtDlg.m_YXNum;
	  pDoc->m_YCNum  = PrtDlg.m_YCNum;
	  pDoc->m_YMNum  = PrtDlg.m_YMNum;

	  pDoc->m_PrtIEC101.m_CallInterval = PrtDlg.m_IEC101CallInterval;
	  pDoc->m_PrtIEC101.m_CallYMInterval = PrtDlg.m_IEC101CallYMInterval;
	  pDoc->m_PrtIEC101.m_SyncTimeInterval = PrtDlg.m_IEC101SyncTimeInterval;

	  pDoc->m_PrtIEC101.m_CheckCallYMEn = PrtDlg.m_ctrlCheckCallYM;
	  pDoc->m_PrtIEC101.m_SyncTimeEn =  PrtDlg.m_ctrlCheckTime;

	  pDoc->m_CallIntvs = PrtDlg.m_CallIntvs;
     

      //if ((pDoc->m_PrtType == pDoc->IEC101_M) || (pDoc->m_PrtType == pDoc->IEC101_S))
	  {//保存IEC101规约参数
	    pDoc->m_PrtIEC101.m_Addr           = PrtDlg.m_IEC101Addr;
		pDoc->m_PrtIEC104.m_Addr           = PrtDlg.m_IEC101Addr;
	    pDoc->m_PrtIEC101.m_CauseOfTranLen = PrtDlg.m_IEC101CauseLen;
	    pDoc->m_PrtIEC101.m_CommAddrLen    = PrtDlg.m_IEC101ASDULen;
	    pDoc->m_PrtIEC101.m_MsgAddrLen     = PrtDlg.m_IEC101MsgLen;
	  }
      //else
	  {//保存MODBUS规约参数
        pDoc->m_PrtModbus.m_Addr     = PrtDlg.m_ModbusAddr;
        pDoc->m_PrtModbus.m_CallIntv = PrtDlg.m_ModbusCallInt;
	    pDoc->m_PrtModbus.m_YXFunc   = PrtDlg.m_ModbusYXFunc;
        pDoc->m_PrtModbus.m_YCFunc   = PrtDlg.m_ModbusYCFunc;
        pDoc->m_PrtModbus.m_YCSize   = PrtDlg.m_ModbusYCSize;
	  }
	 
      pDoc->NewStackAddr();       //生成实时库空间
	  DrawGrid();                 //绘制电子表格
      
	  if (pDoc->m_pYXData != NULL)
        UpdateYXGrid();
      if (pDoc->m_pYCData != NULL)
        UpdateYCGrid();
	  if (pDoc->m_pYMData != NULL)
        UpdateYMGrid();	
	  
	}
}

void CMainFrame::OnConnectCmm() 
{
	CMaintToolDoc*  pDoc  = (CMaintToolDoc*)GetActiveDocument();  //文档指针  主框架类函数;
	CMaintToolView* pView = (CMaintToolView*)GetActiveView();     //视图指针;
	// OnDisconncmm(); 
	if (pDoc->m_PrtType == pDoc->Blank)         //若协议为空,先选中可用协议
		OnSetProtocol();  
	
	if (pDoc->m_PrtType == pDoc->Blank)         //如协议对话框中,按‘取消’,仍未选中协议
	{
        AfxMessageBox("请先选择/设置通讯协议");
		return;
	}
	
	if(pDoc->m_PrtType == pDoc->IEC104_M)
	{
        pView->m_pPrtObj = &(pDoc->m_PrtIEC104);  //协议对象指向IEC101协议
	}
	else if ( (pDoc->m_PrtType == pDoc->IEC101_M) || ((pDoc->m_PrtType == pDoc->IEC101_S)) )
	{
		pView->m_pPrtObj = &(pDoc->m_PrtIEC101);  //协议对象指向IEC101协议
	}
	else
	{
		pView->m_pPrtObj = &(pDoc->m_PrtModbus);  //协议对象指向MODBUS协议
	}
	
    pView->m_pPrtObj->InitPrt();    //规约初始化
	
	if (pDoc->m_CmmPortType == pDoc->CommPort)      
	{   //串口通讯方式
		pDoc->m_ComObj.m_hOwner = pView->GetSafeHwnd(); //串口消息发到该句柄的窗口
		
		if (pDoc->m_ComObj.OpenPort())
		{
			if ( (pView->m_pPrtObj != NULL) && (pDoc->m_MasterFlag) ) //主站时启动召唤定时器 
			{
				pView->m_pPrtObj->StartTimer();	
			}

			IsCmmConnect = true;
		}
		else
		{
			AfxMessageBox("无法打开"   pDoc->m_ComObj.m_szPortName   "\r\n"   "请选择其它端口");
			return;
		}	   
	}
	else
	{   //网口通讯方式
		switch (pDoc->m_NetParam.TCPPrtType)
		{
		case pDoc->m_NetParam.TCPServer:
			pDoc->m_pSrvSocketObj = new CDAServerSocket(pView->GetSafeHwnd());//当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数
			if ( pDoc->m_pSrvSocketObj->OpenPort(pDoc->m_NetParam.LocalIPPort,pDoc->m_NetParam.LocalIPAddr) )
				IsCmmConnect = true;
			else
			{    
				AfxMessageBox("无法创建 "   pDoc->m_NetParam.LocalIPAddr   "服务端口");
				return;
			}
			break;
			
		case pDoc->m_NetParam.TCPClient:
			
			if(pDoc->m_pCltSocketObj != NULL)
			{
				pDoc->m_pCltSocketObj->ClosePort();
				delete pDoc->m_pCltSocketObj;
				pDoc->m_pCltSocketObj = NULL;
			}
			
			pDoc->m_pCltSocketObj = new CDAClientSocket(pView->GetSafeHwnd());

			if (pDoc->m_pCltSocketObj->OpenPort(pDoc->m_NetParam.RemoteIPPort,pDoc->m_NetParam.RemoteIPAddr))
			{
			}
			else
			{
				AfxMessageBox("无法创建网络端口");
				return;
			}
			break;
			
		case pDoc->m_NetParam.UDP:
			pDoc->m_pUDPSocketObj = new CDAUDPSocket(pView->GetSafeHwnd());
			if ( pDoc->m_pUDPSocketObj->OpenPort(pDoc->m_NetParam.LocalIPPort) )
			{
				IsCmmConnect = true;
				pView->m_pSocketObj = (CAsyncSocket*)pDoc->m_pUDPSocketObj;
				if ( (pView->m_pPrtObj != NULL) && (pDoc->m_MasterFlag) ) //主站时启动召唤定时器 
					pView->m_pPrtObj->StartTimer();
			}
			else
			{ 
				AfxMessageBox("无法打开网络端口,请重试 ");
				return;
			}
			break;
			
		default:
			break;
		}
	}	
}

//绘制各页的电子表格;  及遥控对话窗口
void CMainFrame::DrawGrid()
{
  CYXData* pYXDlg;
  CYCData* pYCDlg;
  CYMData* pYMDlg;
  CYKData* pYKDlg;
  
  //获取各页的指针
  pYXDlg = (CYXData*)m_TabCtrl.GetPagePoint(0);
  pYCDlg = (CYCData*)m_TabCtrl.GetPagePoint(1);
  pYMDlg = (CYMData*)m_TabCtrl.GetPagePoint(2);
  pYKDlg = (CYKData*)m_TabCtrl.GetPagePoint(3);
  
  //各页绘制表格
  pYXDlg->DrawYXGrid();
  pYCDlg->DrawYCGrid();
  pYMDlg->DrawYMGrid();

  //加载各页控件参数
  pYXDlg->UpdateYXChara(FALSE);
  pYKDlg->UpdateYKChara(FALSE);
}

//更新YX电子表格数据
void CMainFrame::UpdateYXGrid()
{
  CYXData* pYXDlg;
  pYXDlg = (CYXData*)m_TabCtrl.GetPagePoint(0);
  pYXDlg->UpdateYXGrid();
}

void CMainFrame::UpdateYCGrid()
{
  CYCData* pYCDlg;
  pYCDlg = (CYCData*)m_TabCtrl.GetPagePoint(1);
  pYCDlg->UpdateYCGrid();
}

void CMainFrame::UpdateYMGrid()
{
  CYMData* pYMDlg;
  pYMDlg = (CYMData*)m_TabCtrl.GetPagePoint(2);
  pYMDlg->UpdateYMGrid();
}

//断开通讯连接
void CMainFrame::OnDisconncmm() 
{
	CMaintToolDoc*  pDoc  = (CMaintToolDoc*)GetActiveDocument();  //文档指针  主框架类函数;
	CMaintToolView* pView = (CMaintToolView*)GetActiveView();     //视图指针;
	   
    if ( (pView->m_pPrtObj != NULL) && (pDoc->m_MasterFlag) ) //主站时关闭召唤定时器
	pView->m_pPrtObj->CloseTimer();

    pView->m_pSocketObj = NULL;

	if (pDoc->m_CmmPortType == pDoc->CommPort)      
		pDoc->m_ComObj.ClosePort();
	else
	{ //网口通讯方式
	    if(pDoc->m_pSrvSocketObj != NULL)
		{ 
		   pDoc->m_pSrvSocketObj->ClosePort();
		   delete pDoc->m_pSrvSocketObj;
		   pDoc->m_pSrvSocketObj = NULL;
		}
	    if(pDoc->m_pCltSocketObj != NULL)
		{
		   pDoc->m_pCltSocketObj->ClosePort();
		   delete pDoc->m_pCltSocketObj;
		   pDoc->m_pCltSocketObj = NULL;
		}
	    if(pDoc->m_pUDPSocketObj != NULL)
		{
		   pDoc->m_pUDPSocketObj->ClosePort();
		   delete pDoc->m_pUDPSocketObj;
		   pDoc->m_pUDPSocketObj = NULL;
		}
	}

	IsCmmConnect = false;
}

void CMainFrame::OnUpdateConcmm(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(!IsCmmConnect);
}

void CMainFrame::OnUpdateDisconcmm(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(IsCmmConnect);
}

void CMainFrame::OnClose() 
{
    CMaintToolDoc* pDoc;
	pDoc = (CMaintToolDoc*)GetActiveDocument();  

    if (IsCmmConnect)
	   OnDisconncmm();

	  ASSERT_VALID(pDoc);

	if (pDoc != NULL)
	   pDoc->SetModifiedFlag(FALSE);  //屏蔽文件保存提示

	CFrameWnd::OnClose();
}

//底部消息窗口显示信息
void CMainFrame::DisplayEvent(UINT nflag, CString s2)
{
    CTime t = CTime::GetCurrentTime();
	CString s0;
	CString s1;

	s0 = t.Format("%y-%m-%d %H:%M:%S");

	if (nflag == 1)
		s1 = "主站操作";
	else if (nflag == 2)
		s1 = "子站应答";
	else if (nflag == 3)
		s1 = "通道事件";
	else
	    s1 = "其它类型";

    
	m_MsgList.InsertItem(LVIF_TEXT|LVIF_STATE, 0, s0, 0, LVIS_SELECTED,0, 0);
	m_MsgList.SetItemText(0,1,s1);
    m_MsgList.SetItemText(0,2,s2);
    
	int i;
	i = m_MsgList.GetItemCount();
    if (i>8)     
		 m_MsgList.DeleteItem(i-1);
}

void CMainFrame::OnViewData() 
{
	ShowControlBar(&m_wndMyBar1, !m_wndMyBar1.IsVisible(), FALSE);	
}

void CMainFrame::OnViewMessage() 
{
	ShowControlBar(&m_wndMyBar2, !m_wndMyBar2.IsVisible(), FALSE);	
}

void CMainFrame::OnUpdateViewData(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable();
	pCmdUI->SetCheck(m_wndMyBar1.IsVisible());		
}

void CMainFrame::OnUpdateViewMessage(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable();
	pCmdUI->SetCheck(m_wndMyBar2.IsVisible());		
}

void CMainFrame::OnPauseDsp() 
{
    IsReflashMsg = false;	
}

void CMainFrame::OnReflashDsp() 
{
	IsReflashMsg = true;
}

void CMainFrame::OnUpdatePauseDsp(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(IsReflashMsg);	
}

void CMainFrame::OnUpdateReflashDsp(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(!IsReflashMsg);
}

void CMainFrame::OnClearDsp() 
{	
	CMaintToolView* pView = (CMaintToolView*)GetActiveView();     //视图指针;
	pView->ClearMsg();	
}

void CMainFrame::SetCmmPort()
{
    CSettingCmmDlg CmmDlg;
	if (CmmDlg.DoModal()==IDOK)   // TODO: 保存通讯对话框设置的参数
	{
	  CMaintToolDoc* pDoc;
	  pDoc = (CMaintToolDoc*)GetActiveDocument();  
	  ASSERT_VALID(pDoc);

  	   if (CmmDlg.m_CmmType == 0)
	   {  // 串口参数 dcb
		   pDoc->m_CmmPortType = pDoc->CommPort;

           pDoc->m_ComObj.m_szPortName = CmmDlg.m_sPortName ;
		   pDoc->m_ComObj.m_nParity    = CmmDlg.m_Parity ;
	       pDoc->m_ComObj.m_nDataBits  = CmmDlg.m_ByteSize 4 ;
           pDoc->m_ComObj.m_nStopBits  = CmmDlg.m_StopBits ;
		   switch (CmmDlg.m_BaudRate) 
		   {
		   case 0:
			   pDoc->m_ComObj.m_nBaudRate =  CBR_300;
			   break;
		   case 1:
               pDoc->m_ComObj.m_nBaudRate =  CBR_600;
			   break;
		   case 2:
			   pDoc->m_ComObj.m_nBaudRate =  CBR_1200;
			   break;
		   case 3:
               pDoc->m_ComObj.m_nBaudRate =  CBR_2400;
			   break;
           case 4:
			   pDoc->m_ComObj.m_nBaudRate =  CBR_4800;
			   break;
		   case 5:
               pDoc->m_ComObj.m_nBaudRate =  CBR_9600;
			   break;
		   case 6:
			   pDoc->m_ComObj.m_nBaudRate =  CBR_14400;
			   break;
		   case 7:
               pDoc->m_ComObj.m_nBaudRate =  CBR_19200;
			   break;
		   case 8:
			   pDoc->m_ComObj.m_nBaudRate =  CBR_38400;
			   break;
		   case 9:
               pDoc->m_ComObj.m_nBaudRate =  CBR_56000;
			   break;
		   case 10:
			   pDoc->m_ComObj.m_nBaudRate =  CBR_57600;
			   break;
		   case 11:
               pDoc->m_ComObj.m_nBaudRate =  CBR_115200;
			   break;
		   default:
			   pDoc->m_ComObj.m_nBaudRate =  CBR_9600;
			   break;
		   }
	   }
	   else
       {  // 网口参数
		   pDoc->m_CmmPortType = pDoc->NetPort;

		   switch (CmmDlg.m_TCPIPPrtType)
		   {
		   case 0:
               pDoc->m_NetParam.TCPPrtType = pDoc->m_NetParam.TCPServer;
			   break;
		   case 1:
			   pDoc->m_NetParam.TCPPrtType = pDoc->m_NetParam.TCPClient;
			   break;
		   case 2:
			   pDoc->m_NetParam.TCPPrtType = pDoc->m_NetParam.UDP;
			   break;
		   default:
               pDoc->m_NetParam.TCPPrtType = pDoc->m_NetParam.TCPServer;
			   break;
		   }

           pDoc->m_NetParam.RemoteIPPort = CmmDlg.m_RemoteIPPort;
           pDoc->m_NetParam.LocalIPPort  = CmmDlg.m_LocalIPPort;
           pDoc->m_NetParam.RemoteIPAddr = CmmDlg.m_sRemoteIPAddr;
           pDoc->m_NetParam.LocalIPAddr  = CmmDlg.m_sLocalIPAddr;
	   }

	}
}

void CMainFrame::OnSize(UINT nType, int cx, int cy) 
{
	CFrameWnd::OnSize(nType, cx, cy);
	
	if (!IsFrameCreat)
		return;
	else
	{	
		CYXData* pYXDlg;
		CYCData* pYCDlg;
		CYMData* pYMDlg;
		// CYKData* pYKDlg;
		
		//获取各页的指针
		pYXDlg = (CYXData*)m_TabCtrl.GetPagePoint(0);
		pYCDlg = (CYCData*)m_TabCtrl.GetPagePoint(1);
		pYMDlg = (CYMData*)m_TabCtrl.GetPagePoint(2);
		// pYKDlg = (CYKData*)m_TabCtrl.GetPagePoint(3);
		
		//各页绘制表格
		pYXDlg->ReDrawCtr();
		pYCDlg->ReDrawCtr();
		pYMDlg->ReDrawCtr();
	}	
}




实例下载地址

VC++电力规约调试工具源码(IEC104\IEC101\MODBUS)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警