📄 fert2000dlg.cpp
字号:
// 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 + -