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

📄 fert2000dlg.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Fert2000Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "Fert2000.h"
#include "Fert2000Dlg.h"
#include "process.h"
#include "ChanDialog.h"
#include "RtuPara1.h"
#include "SystemDialog.h"
#include "YcDataDialog.h"
#include "ChangePassword.h"
#include "CommStateDialog.h"
#include "UserManage.h"
#include "PasswordDialog.h"
#include "SysParaSet.h"
#include "SortShow.h"
#include "DebugDialog.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////
extern bool bStopFlag;
extern CHANNEL Channels[MAX_CHANNEL_NUM];
extern RTU Rtus[MAX_RTU_NUM];
extern SYSTEMCOUNT SystemCount;
//extern CDatabase Database;
extern BYTE DebugCommand[0x23];//当前调试的命令数组
extern char DebugRtuNo;
extern EVENT Events;
extern RecSendThread RecSendThread1;
extern long ProgramStartTime;
extern NetProcess NetProcess1;
extern char YKEchoFlag[MAX_RTU_NUM];
extern BYTE YKEcho[MAX_RTU_NUM][6];//?
extern BYTE YKReserved[24];//?
extern unsigned char TBCH0[];   
extern CFert2000App theApp;
extern BYTE GpsSendBuf[100];
extern BYTE GpsRecBuf[100];
extern BYTE SwitchSendBuf[100];
extern BYTE SwitchRecBuf[100];
int  nFaultTime[64];

///////////////////////////////////////////////////

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFert2000Dlg dialog

CFert2000Dlg::CFert2000Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFert2000Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFert2000Dlg)
		// NOTE: the ClassWizard will add member initialization here
	m_Disp = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	SysLock = true;
	CurSendCol = 0;
	CurSendRow = 0;
	CurRecCol = 0;
	CurRecRow = 0;
	m_CurRtuNo = 0;
	m_CurChNo = 0;
	m_ChSelNo = 0;
	m_RtuSelNo = 0;
	bShowPause = false;
	DispartRow = 0;
	CheckOkShow = 1;
	ShowType = 0;
	ShowStartCode = 0;
	ShowEndCode = 0xff;
	ConfirmShow = false;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	for(int i=0;i<64;i++)
		nFaultTime[i]=0;
}

void CFert2000Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFert2000Dlg)
	DDX_Control(pDX, IDC_COMBO_CHAN, m_ChNo);
	DDX_Control(pDX, IDC_COMBO_RTUNO, m_RtuNo);
	DDX_Text(pDX, IDC_EDIT2, m_Disp);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CFert2000Dlg, CDialog)
	//{{AFX_MSG_MAP(CFert2000Dlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CLOSE()
	ON_WM_TIMER()
	ON_WM_RBUTTONUP()
	ON_COMMAND(IDM_CHAN_VAR, OnChanvar)
	ON_COMMAND(IDM_SYS_VAR, OnSysVar)
	ON_COMMAND(IDM_YC_DATA, OnYcData)
	ON_COMMAND(IDM_CHECK_CHAN, OnCheckChan)
	ON_COMMAND(IDM_USER_MANAGE, OnUserManage)
	ON_COMMAND(IDM_SYS_LOCK, OnSysLock)
	ON_WM_SIZE()
	ON_BN_CLICKED(IDC_BUTTON_PAUSE, OnButtonPause)
	ON_COMMAND(IDM_RECWINDOW, OnRecwindow)
	ON_COMMAND(IDM_SENDWINDOW, OnSendwindow)
	ON_COMMAND(IDM_ALLWINDOW, OnAllwindow)
	ON_BN_CLICKED(IDC_KYBIT, OnKybit)
	ON_COMMAND(IDM_ALL_SHOW, OnAllShow)
	ON_COMMAND(IDM_CHECK_SHOW, OnCheckShow)
	ON_COMMAND(IDM_NOROWSHOW, OnNorowshow)
	ON_COMMAND(IDM_ROWSHOW, OnRowshow)
	ON_COMMAND(IDM_RTU_CANSHU, OnRtuCanshu)
	ON_COMMAND(IDM_SORT_SHOW, OnSortShow)
	ON_BN_CLICKED(IDC_BUTTON_DEBUG, OnButtonDebug)
	ON_CBN_SELCHANGE(IDC_COMBO_CHAN, OnSelchangeComboChan)
	ON_CBN_SELCHANGE(IDC_COMBO_RTUNO, OnSelchangeComboRtuno)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFert2000Dlg message handlers

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

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	CenterWindow();
	
	RecSendThread1.g_EventEndCDTProtocolProcess=CreateEvent(NULL,TRUE,FALSE,NULL);
//	RecSendThread1.g_hEndEventGpsPro=CreateEvent(NULL,TRUE,FALSE,NULL);
//	RecSendThread1.g_hEndEventPro = CreateEvent(NULL,TRUE,FALSE,NULL);
	RecSendThread1.g_hEndEventMoxaReadProc = CreateEvent(NULL,TRUE,FALSE,NULL);
	RecSendThread1.g_hEndEventUdpRX=CreateEvent(NULL,TRUE,FALSE,NULL); 
	RecSendThread1.g_hEndEventUdpRXProc=CreateEvent(NULL,TRUE,FALSE,NULL);
	RecSendThread1.g_hEndEventNetSendFlag=CreateEvent(NULL,TRUE,FALSE,NULL);
	RecSendThread1.g_hEndEventNetSendFrame=CreateEvent(NULL,TRUE,FALSE,NULL);
	RecSendThread1.g_hEndEventMnRtuProc = CreateEvent(NULL,TRUE,FALSE,NULL);

	RecSendThread1.g_hThreadCDTProtocolProcess=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)Process,NULL,NULL,&RecSendThread1.dwThreadID[0]);
	//RecSendThread1.g_hThreadGpsPro=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)GpsProc,NULL,NULL,&RecSendThread1.dwThreadID[5]);
//	RecSendThread1.g_hThreadEventPro = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)EventProc,NULL,NULL,&RecSendThread1.dwThreadID[2]);
	RecSendThread1.g_hThreadMoxaReadProc = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)MoxaReadProc,NULL,NULL,&RecSendThread1.dwThreadID[3]);
	RecSendThread1.g_hThreadUdpRX=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)UdpRx,NULL,NULL,&RecSendThread1.dwThreadID[1]);
	RecSendThread1.g_hThreadUdpRXProc=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)UdpRxPro,NULL,NULL,&RecSendThread1.dwThreadID[2]);
	RecSendThread1.g_hThreadNetSendFlag=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)NetSendFlag,NULL,NULL,&RecSendThread1.dwThreadID[4]);
	RecSendThread1.g_hThreadNetSendFrame=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)NetSendFrame,NULL,NULL,&RecSendThread1.dwThreadID[5]);
	RecSendThread1.g_hThreadMnRtuProc = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)MnRtuProc,NULL,NULL,&RecSendThread1.dwThreadID[6]);
	
    SetThreadPriority(RecSendThread1.g_hThreadCDTProtocolProcess,THREAD_PRIORITY_HIGHEST);
	//SetThreadPriority(RecSendThread1.g_hThreadGpsPro,THREAD_PRIORITY_HIGHEST);
//	SetThreadPriority(RecSendThread1.g_hThreadEventPro,THREAD_PRIORITY_HIGHEST);
	SetThreadPriority(RecSendThread1.g_hThreadMoxaReadProc,THREAD_PRIORITY_HIGHEST);
    SetThreadPriority(RecSendThread1.g_hThreadUdpRX,THREAD_PRIORITY_NORMAL);
	SetThreadPriority(RecSendThread1.g_hThreadUdpRXProc,THREAD_PRIORITY_NORMAL);
    SetThreadPriority(RecSendThread1.g_hThreadNetSendFlag,THREAD_PRIORITY_NORMAL);
    SetThreadPriority(RecSendThread1.g_hThreadNetSendFrame,THREAD_PRIORITY_NORMAL);
	SetThreadPriority(RecSendThread1.g_hThreadMnRtuProc,THREAD_PRIORITY_HIGHEST);

	for (int i=0; i<SystemCount.ChNum;i++)
	{
		for (int j=0; j<Channels[i].ChRtuNum;j++)
		{
			try
			{
				Rtus[Channels[i].ChRtuNo[j]].CommandSendFlag[0x01]=true;
				Rtus[Channels[i].ChRtuNo[j]].CommandSendFlag[0x02]=true;
				Rtus[Channels[i].ChRtuNo[j]].CommandSendFlag[0x03]=true;
			//	Rtus[Channels[i].ChRtuNo[j]].CommandSendFlag[4]=true;
			//	Rtus[Channels[i].ChRtuNo[j]].CommandSendFlag[5]=true;
	//			Rtus[Channels[i].ChRtuNo[j]].CommandSendFlag[6]=true;
				Rtus[Channels[i].ChRtuNo[j]].CommandSendFlag[9]=true;
				Rtus[Channels[i].ChRtuNo[j]].CommandSendFlag[19]=true;
			}
			catch(CException *e)
			{
				e->Delete ();
			}
		}
	}
	CString str1;
//	m_ChNo.AddString("计算机COM1");
//	m_ChNo.AddString("计算机COM2");
	for(i=0;i<SystemCount.ChNum;i++)
	{
		str1.Format("COM%d",i+1);
		m_ChNo.AddString(str1);
	}
	if (m_ChNo.GetCount () > 0)
	{
		m_ChNo.SetCurSel (0);
		m_CurChNo = 0;
		m_ChSelNo = 0;
		FillRtuNo(m_CurChNo);
		if (Channels[m_CurChNo].Protocol == 0 || Channels[m_CurChNo].Protocol == 2 || Channels[m_CurChNo].Protocol == 3)
			ConfirmShow = true;
		else
			ConfirmShow = false;
		GetDlgItem(IDC_BUTTON_DEBUG)->SetWindowText("进行调试");
		if (Channels[m_CurChNo].Protocol == 1 && Channels[m_CurChNo].WorkType == 0)
			GetDlgItem(IDC_BUTTON_DEBUG)->EnableWindow(TRUE);
		else 
			GetDlgItem(IDC_BUTTON_DEBUG)->EnableWindow(FALSE);
	}
	InitBufferRect();

	CMenu * pMenu = GetMenu();
	pMenu = pMenu->GetSubMenu(2);
	pMenu->CheckMenuItem(IDM_CHECK_SHOW,MF_BYCOMMAND|MF_CHECKED);
	pMenu->CheckMenuItem(IDM_NOROWSHOW,MF_BYCOMMAND|MF_CHECKED);
	pMenu->CheckMenuItem(IDM_ALLWINDOW,MF_BYCOMMAND|MF_CHECKED);
	SetTimer(12,500,NULL);	
	SetTimer(13,1000*60*5,NULL);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CFert2000Dlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
		ShowBuffer(3);
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CFert2000Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CFert2000Dlg::OnOK() 
{
	// TODO: Add your specialized code here and/or call the base class
	if (AfxMessageBox("退出系统吗?",MB_YESNO+MB_ICONSTOP) == IDNO)
		return;
	CPasswordDialog Dlg;
	Dlg.DoModal();
	if (!Dlg.Pass) return;
	KillTimer(12);
	KillTimer(13);
	Sleep(200); 
	bStopFlag = 1;
	WaitForSingleObject(RecSendThread1.g_EventEndCDTProtocolProcess,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventNetSendFlag,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventNetSendFrame,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventUdpRX,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventUdpRXProc,2000);
//	WaitForSingleObject(RecSendThread1.g_hEndEventPro,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventMoxaReadProc,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventMnRtuProc,2000);
	CDialog::OnOK();
}
void CFert2000Dlg::OnCancel() 
{
	// TODO: Add your specialized code here and/or call the base class
	if (AfxMessageBox("退出系统吗?",MB_YESNO+MB_ICONSTOP) == IDNO)
		return;
	CPasswordDialog Dlg;
	Dlg.DoModal();
	if (!Dlg.Pass) return;
	KillTimer(12);
	KillTimer(13);
	Sleep(200); 
	bStopFlag = 1;
	WaitForSingleObject(RecSendThread1.g_EventEndCDTProtocolProcess,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventNetSendFlag,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventNetSendFrame,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventUdpRX,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventUdpRXProc,2000);
//	WaitForSingleObject(RecSendThread1.g_hEndEventPro,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventMoxaReadProc,2000);
	WaitForSingleObject(RecSendThread1.g_hEndEventMnRtuProc,2000);
	CDialog::OnCancel();
}

void CFert2000Dlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	CDialog::OnClose();
}

void CFert2000Dlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	static ULONG iCount=0;
	static bool KwhZeroFlag=false;
	CClientDC dc1(this);
	if (iCount++ > 180000)
		iCount = 0;
	SYSTEMTIME SystemTime;
	GetLocalTime(&SystemTime);
	if (nIDEvent == 13)//计算误码率的时钟
	{
		if (NetProcess1.ThisNodeId == NetProcess1.mainfertid)
		{
			for (int l=0;l<SystemCount.RtuNum;l++)
			{
				Rtus[l].ErrRate[24] = (float)(Rtus[l].ErrFrameSum-Rtus[l].ErrFrameSumOld)
					/ (float)(Rtus[l].RecFrameSum-Rtus[l].RecFrameSumOld+1) * 100;
				Rtus[l].ErrFrameSumOld = Rtus[l].ErrFrameSum ;
				Rtus[l].RecFrameSumOld = Rtus[l].RecFrameSum ;
				Rtus[l].ErrRate[SystemTime.wHour] = Rtus[l].ErrRate[24];
			}
		}
	}
	else
	{
		int x0 = 360;
		int y0 = 8;
		int Width=16,Height=8;
		for(int j=0;j<4;j++)
		{
			for(int i=0;i<16;i++)
			{
				int x=x0+i*20;
				int y=y0+j*10;
				CRect rect;
				rect.left =x;
				rect.top =y;
				rect.right =x+Width;
				rect.bottom =y+Height;
				if (!Rtus[i+j*16].bFault && Rtus[i+j*16].Flag /*&& Channels[Rtus[i+j*16].RtuChNo].Flag*/
					&& (NetProcess1.ThisNodeId == NetProcess1.mainfertid) && Rtus[i+j*16].RecFrameSum)
					dc1.FillSolidRect(&rect,RGB((iCount%3)?0:255,(iCount%3)?192:0,0));				 
		    	else
					dc1.FillSolidRect(&rect,RGB(255,0,0));					
			}
		}
		if ((SystemTime.wHour==0)&&(SystemTime.wMinute==0))
		{
			if(!KwhZeroFlag) 
			{
				CTime Time = CTime::GetCurrentTime();
				ProgramStartTime = Time.GetTime(); 
				for (int l=0;l<SystemCount.ChNum;l++)
					Channels[l].ReviseTimeFlag |= 0x08;
				for (l=0;l<SystemCount.RtuNum;l++)
				{
					Rtus[l].ErrFrameSum = 0;
					Rtus[l].RecFrameSum = 0; 
					Rtus[l].ErrFrameSumOld = 0;
					Rtus[l].RecFrameSumOld = 0; 
					Rtus[l].FaultTime = 0;
					Rtus[l].NoDataTime = 0;
					for (int k = 0;k < 25;k++)
						Rtus[l].ErrRate[k] = 0;
				}
				KwhZeroFlag=true;
			}
		}
		else 
			KwhZeroFlag=false;
		static iRtuStatusCount = 0;
		if (iRtuStatusCount++ > 10000) iRtuStatusCount = 0;
		for (j=0;j<SystemCount.RtuNum;j++)
		{
			if (!Rtus[j].Flag || !Channels[Rtus[j].RtuChNo].Flag)
			{
				if (iRtuStatusCount % 100 == 0)
				{
					for (int k = 0;k < Rtus[j].YcNum ;k++)
					{
						Rtus[j].YcValue [k] = 0;
						Rtus[j].YcValueOld [k] = 0;
					}
					for (k = 0;k < Rtus[j].YxNum ;k++)
					{
						Rtus[j].YxValue [k] = 0;
						Rtus[j].YxValueOld [k] = 0;
						Rtus[j].YxChangeFlag[k] = 0;
						Rtus[j].RecFullYx = 0;
					}
					for (k = 0;k < Rtus[j].KwhNum ;k++)
					{
						Rtus[j].KwhValue [k] = 0;
					}
					ChannelEvent(j,0);//rtu no use
					Rtus[j].bFault = true;
				}
				continue;
			}
			if (Rtus[j].bWorking)
			{
				if (Rtus[j].bFault)
				{
					Rtus[j].bFault=false;
					ChannelEvent(j,2);//rtu 恢复正常
					Rtus[j].NoDataTime = 0;
				}
				else 
				{
					if (iRtuStatusCount % 30 == 0)
						ChannelEvent(j,-1);//RTU 保持正常
					Rtus[j].NoDataTime = 0;
				}
			}
			else 
			{
				if (iCount%2==0) 

⌨️ 快捷键说明

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