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

📄 rtusimdlg.cpp

📁 能够模拟电表的645协议
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				strCheck = "e";
			}
			break;
		case 1:
			{
				strCheck = "m";
			}
			break;
		case 2:
			{
				strCheck = "n";
			}
			break;
		case 3:
			{
				strCheck = "o";
			}
			break;
		case 4:
			{
				strCheck = "s";
			}
			break;
		default:
			break;
		}
	}
	strTmp += strCheck;

	strTmp += ",8,1";
	m_msComm.SetSettings(strTmp);

	m_msComm.SetPortOpen(true);

	return true;
}

void CRTUSimDlg::AddMsg(CString &strMsg)
{
	if(m_bRun)
	{
	
	CString   strBuffer = "";

	if(m_edtMsg.GetLineCount() > 500)
	{
		m_edtMsg.SetWindowText(strBuffer);
	}

	CTime tTmp;
	tTmp = CTime::GetCurrentTime();
	strBuffer = tTmp.Format("%H:%M:%S ");
	strMsg = strBuffer + strMsg;
	m_edtMsg.GetWindowText (strBuffer);
	if (!strBuffer.IsEmpty())
	{
		strBuffer += "\r\n";
	}
	strBuffer += strMsg;
	m_edtMsg.SetWindowText (strBuffer);

	m_edtMsg.LineScroll (m_edtMsg.GetLineCount(), 0);
	}
}

BEGIN_EVENTSINK_MAP(CRTUSimDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CRTUSimDlg)
	ON_EVENT(CRTUSimDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CRTUSimDlg::OnOnCommMscomm() 
{
	short sEvent = m_msComm.GetCommEvent();
//	if(sEvent == 2)
	{
//		if(m_cbProtocal.GetCurSel() <3)
//			return;

		COleVariant vTmp;
		CByteArray baTmp;		
		int nCount = m_msComm.GetInBufferCount();
		vTmp = m_msComm.GetInput();
		BYTE * pData = (BYTE *)vTmp.parray->pvData;
		for(int i = 0; i < nCount; i++)
		{
			baTmp.Add(pData[i]);
		}
		DisplayData(true, baTmp);
		if(m_pProtocal != NULL)
		{
			m_pProtocal->ReciveData(baTmp);
		}

	}
}


void CRTUSimDlg::DisplayData(BOOL bIn, CByteArray &baData)
{
	CString strTmp, strMsg;
	if(bIn)
	{
		strMsg += "-> ";
	}
	else
	{
		strMsg += "<- ";
	}

	for(int i = 0; i < baData.GetSize(); i++)
	{
		strTmp.Format("%02X ", baData[i]);
		strMsg += strTmp;
	}

	AddMsg(strMsg);
}

/*
	0	CDT85
	1	CDT新部颁
	2	DISA
	3	DNP 3.0
	4	东芝
	5	101
	6   645科陆协议
*/

void CRTUSimDlg::InitProtocal()
{
	if(m_pProtocal != NULL)
	{
		delete m_pProtocal;
		m_pProtocal = NULL;
	}

	switch(m_cbProtocal.GetCurSel())
	{
	case 0:	//CDT85
		break;
	case 1:	//CDT新部颁
		{
			SetTimer(1000,1000,NULL);
			m_pProtocal = new CProtocolCDT91;
			m_pProtocal->SetMainWnd(this);
		}
		break;
	case 2:	//DISA
		{
			SetTimer(1001,1000,NULL);
			m_pProtocal = new CProtocolDisa;
			m_pProtocal->SetMainWnd(this);
		}
		break;
	case 3:	//DNP 3.0
		{
			m_pProtocal = new CDnpExplain;
			m_pProtocal->SetMainWnd(this);
		}
		break;
	case 4:	//东芝
		{
			SetTimer(1002,1000,NULL);
			m_pProtocal = new CProtocolTos;
			m_pProtocal->SetMainWnd(this);
		}
		break;
	case 5:	//101
		{
			m_pProtocal = new CProtocol101;
			m_pProtocal->SetMainWnd(this);
		}
		break;
	case 6:

		m_pProtocal = new CProtocal645;
		m_pProtocal->SetMainWnd(this);
		break;
	default:
		{
			m_pProtocal = NULL;
		}
		break;
	}
}

void CRTUSimDlg::OnChangeEditUab() 
{
	PropareData();	
}

void CRTUSimDlg::OnChangeEditUbc() 
{
	PropareData();	
}

void CRTUSimDlg::OnChangeEditUca() 
{
	PropareData();	
}

void CRTUSimDlg::OnChangeEditIa() 
{
	PropareData();
}

void CRTUSimDlg::OnChangeEditIb() 
{
	PropareData();	
}

void CRTUSimDlg::OnChangeEditIc() 
{
	PropareData();
}

void CRTUSimDlg::OnChangeEditCount() 
{
	PropareData();
}

void CRTUSimDlg::PropareData()
{
	if(m_pProtocal != NULL)
	{
		m_pProtocal->m_waAnalog.RemoveAll();
		m_pProtocal->m_baDigital.RemoveAll();
		m_pProtocal->m_dwaCount.RemoveAll();
		
		WORD wTmp;
		wTmp = (WORD)(m_fUab / 1000 * 0xffff);
		m_pProtocal->m_waAnalog.Add(wTmp);
		wTmp = (WORD)(m_fUbc / 1000 * 0xffff);
		m_pProtocal->m_waAnalog.Add(wTmp);
		wTmp = (WORD)(m_fUca / 1000 * 0xffff);
		m_pProtocal->m_waAnalog.Add(wTmp);
		wTmp = (WORD)(m_fIa / 1000 * 0xffff);
		m_pProtocal->m_waAnalog.Add(wTmp);
		wTmp = (WORD)(m_fIb / 1000 * 0xffff);
		m_pProtocal->m_waAnalog.Add(wTmp);
		wTmp = (WORD)(m_fIc / 1000 * 0xffff);
		m_pProtocal->m_waAnalog.Add(wTmp);

		BYTE byTmp;
		if(m_bBreakerOpen)
		{
			byTmp = 0;
		}
		else
		{
			byTmp = 1;
		}
		m_pProtocal->m_baDigital.Add(byTmp);

		DWORD dwTmp;
		dwTmp = (DWORD)(m_uCount);
		m_pProtocal->m_dwaCount.Add(dwTmp);

		m_pProtocal->m_wAddr = m_uAddr;
	}
}

void CRTUSimDlg::OnChangeEditAddr() 
{
	SaveSetting();
	PropareData();
}

void CRTUSimDlg::ChangeState()
{
	if(m_pProtocal != NULL)
	{
		m_bBreakerOpen = !(m_pProtocal->m_baDigital[0] & 0X01);
	}
	
	if(m_bBreakerOpen)
	{
		CBitmap bmTmp;
		if(bmTmp.LoadBitmap(IDB_BITMAP_OPEN))
		{
			m_stState.SetBitmap(bmTmp);
		}
	}
	else
	{
		CBitmap bmTmp;
		if(bmTmp.LoadBitmap(IDB_BITMAP_CLOSE))
		{
			m_stState.SetBitmap(bmTmp);
		}
	}
}

void CRTUSimDlg::OnTimer(UINT nIDEvent) 
{
	CByteArray baTmp;		
	switch(nIDEvent)
	{
	case RANDTIMER:
		if(OnOff != OnOff)
			OnStaticState();
		RandData();
		break;
	case 1000://cdt91自动上发
		if(!m_bBreakerOpen != OnOff)
		{
			OnStaticState();
		}
		m_pProtocal->ReciveData(baTmp);
		break;
	case 1001://disa自动上发
		if(!m_bBreakerOpen != OnOff)
		{
			OnStaticState();
		}
		m_pProtocal->ReciveData(baTmp);
		break;
	case 1002://东芝
		if(!m_bBreakerOpen != OnOff)
		{
			OnStaticState();
		}
		break;
	default:
		break;
	}
	
	CDialog::OnTimer(nIDEvent);
}

void CRTUSimDlg::RandData()
{
	UpdateData();

	float dTmp;
	dTmp = (float)rand();
	m_fUab += (dTmp - RAND_MAX) / RAND_MAX / 1000;
	dTmp = (float)rand();
	m_fUbc += (dTmp - RAND_MAX) / RAND_MAX / 1000;
	dTmp = (float)rand();
	m_fUca += (dTmp - RAND_MAX) / RAND_MAX / 1000;
	dTmp = (float)rand();
	m_fIa += (dTmp - RAND_MAX) / RAND_MAX / 1000;
	dTmp = (float)rand();
	m_fIb += (dTmp - RAND_MAX) / RAND_MAX / 1000;
	dTmp = (float)rand();
	m_fIc += (dTmp - RAND_MAX) / RAND_MAX / 1000;

	PropareData();

	UpdateData(FALSE);
}

void CRTUSimDlg::OnSelchangeComboCheck() 
{
	SaveSetting();
	OpenComm();
}

void CRTUSimDlg::OnPause() 
{
	GetSetting();
	OpenComm();
	InitProtocal();
	PropareData();
}

void CRTUSimDlg::OnOK() 
{
	m_edtMsg.SetWindowText("");
}

void CRTUSimDlg::OnStop() 
{
	m_bRun = !m_bRun;
	CWnd* pWnd = GetDlgItem(IDC_STOP);
	if (pWnd != NULL) 
	{
		if(!m_bRun)
		{
			pWnd->SetWindowText("开始");
		}
		else
			pWnd->SetWindowText("停止");
	}
	
}

void CRTUSimDlg::OnAFault() 
{
	if(m_pProtocal != NULL)
	{
		m_pProtocal->DoAFault();
	}
}

void CRTUSimDlg::OnBFault() 
{
	if(m_pProtocal != NULL)
	{
		m_pProtocal->DoBFault();
	}
	
}

void CRTUSimDlg::OnCFault() 
{
	if(m_pProtocal != NULL)
	{
		m_pProtocal->DoCFault();
	}
	
}

void CRTUSimDlg::OnFaultOccur() 
{
	UpdateData(true);
	if(m_pProtocal==NULL)
	{
		return ;
	}
	if (!m_CheckAFault&&!m_CheckBFault&&!m_CheckCFault&&!m_3I0OverCurrent&&!m_3U0OverSetting) 
	{
		AfxMessageBox("请正确选择故障设定!");
		return;
	}
	CFaultRec *pFault=new CFaultRec;
	pFault->m_AOverCurrent=m_CheckAFault;
	pFault->m_BOverCurrrent=m_CheckBFault;
	pFault->m_COverCurrrent=m_CheckCFault;
	pFault->m_3I0OverCurrent=m_3I0OverCurrent;
	pFault->m_3U0OverSetting=m_3U0OverSetting;
	pFault->m_wDelayTime=m_FaultOccurTime;
	if (m_Direction) 
	{
		pFault->m_byDirection=1;
	}
	else
	{
		pFault->m_byDirection=0;
	}
	pFault->m_wFaultValueIa=(WORD)m_fIa;
	pFault->m_wFaultValueIb=(WORD)m_fIb;
	pFault->m_wFaultValueIc=(WORD)m_fIc;
	pFault->m_wFaultValueUa=(WORD)m_fUab;
	pFault->m_wFaultValueUb=(WORD)m_fUbc;
	pFault->m_wFaultValueUc=(WORD)m_fUca;
	CTime timeCurrent;
	timeCurrent=CTime::GetCurrentTime();
	SYSTEMTIME faultTime;
	timeCurrent.GetAsSystemTime(faultTime);
	pFault->m_stTime=faultTime;
	pFault->m_byType=0;
	m_pProtocal->m_paFault.Add(pFault);
}
void CRTUSimDlg::OnTimeache() 
{
	m_pProtocal->m_timeAnch=true;
	m_TimeStatus="等待校时.....";
	CButton *pButton=(CButton *)GetDlgItem(IDC_TIMEACHE);
//	SetDlgItemText(IDC_TIMEACHE,"dsdsd");
	UpdateData(false);
}

void CRTUSimDlg::OnTimeComeback() 
{
	m_TimeStatus="正常";
	m_pProtocal->m_timeAnch=false;	
	UpdateData(false);

}





















⌨️ 快捷键说明

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