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

📄 serialtestdlg.cpp

📁 MDF监控源码2
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			m_listAlarm.SetItemText(iIndex,iSubItem++,strValue);

			GetFieldValue("fStartTime",pRsPtr,strValue);
			//strValue.Format("%d",iValue);
			m_listAlarm.SetItemText(iIndex,iSubItem++,strValue);

			GetFieldValue("fEndTime",pRsPtr,strValue);
			//strValue.Format("%d",iValue);
			m_listAlarm.SetItemText(iIndex,iSubItem++,strValue);

			//GetFieldValue("fEndTime",pRsPtr,strValue);
			//strValue.Format("%d",iValue);
			//计算持续秒数
			m_listAlarm.SetItemText(iIndex,iSubItem++,strValue);


			pRsPtr->MoveNext();
		}
		pRsPtr->Close();
	}

	return 0;
}

int CSerialTestDlg::IniSampleTable(void)
{
	
	_variant_t var;
	_RecordsetPtr pRsPtr ;
	CString strValue,strItem,strSql,strTip;
	int iIndex,iResult,iBaund;
	double iCarrent1,iCarrent2,iRate1,iRate2;

	double dValue,dPer;
	CSample smp;
	dValue = 0;
	
	m_arraySample.RemoveAll();
	
	pRsPtr.CreateInstance(__uuidof(Recordset)); 
	strSql = "Select  * From CMTSampling Order By fCarrent";
	iResult = ReadDB(strSql,pRsPtr,strTip);
	iCarrent2 = iCarrent1 =	iRate2 = iRate1 = 0;

	if (iResult == 0)
	{
		m_listCarrent.DeleteAllItems();
		iIndex = 1;
		while (!pRsPtr->adoEOF)
		{
			if (iIndex == 1)
			{
				GetFieldValue("fCarrent",pRsPtr,iCarrent2);
				GetFieldValue("fNum",pRsPtr,iRate2);
				GetFieldValue("fRate",pRsPtr,iBaund);
				iCarrent1 = 0;
				iRate1 =0;

				dPer = (iCarrent2 - iCarrent1)/(iRate2 - iRate1);
				smp.iStartCarrent = iCarrent1;
				smp.iEndCarrent = iCarrent2;
				smp.iStartSampe = iRate1;
				smp.iEndSampe = iRate2;
				smp.iRate = iBaund;
				smp.dPer = dPer;
				m_arraySample.Add(smp);



			}else
			{
				iCarrent1 = iCarrent2;
				iRate1 = iRate2;
				GetFieldValue("fCarrent",pRsPtr,iCarrent2);
				GetFieldValue("fNum",pRsPtr,iRate2);
				GetFieldValue("fRate",pRsPtr,iBaund);
				dPer = (iCarrent2 - iCarrent1)/(iRate2 - iRate1);
				//smp = new CSample;
				smp.iStartCarrent = iCarrent1;
				smp.iEndCarrent = iCarrent2;
				smp.iStartSampe = iRate1;
				smp.iEndSampe = iRate2;
				smp.iRate = iBaund;
				smp.dPer = dPer;
				m_arraySample.Add(smp);
			}
			iIndex ++;
			pRsPtr->MoveNext();
		}
		pRsPtr->Close();
	}
	
	return 0;
}


int CSerialTestDlg::DataAnalyse(char *lpBuf, int iLen)
{
	char cBuf[4096];
	int iRate = 0;
	int iSample = 0;
	int iVoltage = 0;
	//unsigned char uc; 
	//BYTE bt ;
	
	CCircleStatus *m_curStatus = new CCircleStatus;
	memcpy(cBuf,lpBuf,iLen);
	if ((BYTE)cBuf[0] == 0xAA && (BYTE)cBuf[1] == 0x55 )
	{
		iRate = (BYTE)cBuf[2];
		iRate <<= 8;
		iRate += (BYTE)cBuf[3];
		//增加滤波滤波功能
		iSample = (BYTE)FilterNum(cBuf[4]);
		

		iVoltage = (BYTE)cBuf[5];
	}else
		return -1;

	if(m_Config.GetCheck() == BST_CHECKED)		//当前在标定
	{
		if(WriteConfig(m_curModel,iSample,iRate))
			this->LoadItem();
		
	
	}else		//存储并分析采集记录
	{
		//转化频率及电流值
		m_curStatus->srCarrent = iSample;
		m_curStatus->srRate = iRate;
		m_curStatus->srVoltage = iVoltage;
		if(m_CirStatus->iCarrent == 0)
			m_curStatus->tmStartTime = m_curStatus->tmEndTime = CTime::GetCurrentTime(); 
		else
			m_curStatus->tmEndTime = CTime::GetCurrentTime(); 

		m_curStatus->iLevel = 0;
		m_curStatus->iCarrent = 0;
		m_curStatus->iRate = 0;
		m_curStatus->iVoltage = 0;
		m_curStatus->dwSeconds = 0;
		m_curStatus->dwVolSeconds = 0;
		m_curStatus->maxCarrent = 0;
		m_curStatus->iOne = 0;
		m_curStatus->dBaseTime = 0;
		Analyse(m_curStatus);
	}
	


	return 0;
}

CString CSerialTestDlg::ToHexString(char * cBuf, int iLen)
{
	CString sResult,strTemp;
	BYTE bt;
	sResult.Empty();
	if (iLen > 0)
	{
		for(int i=0;i<iLen;i++)
		{
			bt = *cBuf++;
			strTemp.Format("%0.2X ",bt);
			sResult += strTemp;
			//ToHex(bt);

		}
	}
	return sResult;
}


void CSerialTestDlg::OnBnClickedChkconfig()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strValue;
	UpdateData();
	m_ConfigNum.GetWindowText(strValue);
	if (strValue.GetLength() == 0)
	{
		AfxMessageBox(_T("请设定当前标定的电流..."));
		m_ConfigNum.SetFocus();
		return ;
	}
	
	int iRate = atoi(strValue.GetBuffer());

	if (m_Config.GetCheck() ==  BST_CHECKED)
		m_curModel = iRate;
	else if (m_Config.GetCheck() == BST_UNCHECKED)
		m_curModel = 0;
	
}



// 存储标定记录值
BOOL CSerialTestDlg::WriteConfig(int iCarrent, int iSample, int iRate)
{
	CString strSQL,strTable,strTip ;		//SQL语句
	_variant_t var;
	_RecordsetPtr pRsPtr ;

	if (!(iCarrent > 0 && iSample >0 && iRate > 0))
		return FALSE;

	pRsPtr.CreateInstance(__uuidof(Recordset)); 
	strSQL.Format("Select * From CMTSampling Where fCarrent= %d",m_curModel);
	int iResult = ReadDB(strSQL,pRsPtr,strTip);
	try
	{
		if(iResult ==  0)
		{
			if (!pRsPtr->adoEOF)
			{
				//pRsPtr->PutCollect(_variant_t("fCarrent"),_variant_t(_bstr_t(port->tmUpdateTime.Format(_T("%Y-%m-%d %H:%M:%S")))));
				pRsPtr->PutCollect(_variant_t("fNum"),_variant_t(_bstr_t(iSample)));
				pRsPtr->PutCollect(_variant_t("fRate"),_variant_t(_bstr_t(iRate)));
				pRsPtr->UpdateBatch(adAffectCurrent);
				pRsPtr->Close();
			}else
			{
				pRsPtr->Close();
				strSQL.Format("Insert into CMTSampling(fCarrent, fNum, fRate) Values(%d,%d,%d)",iCarrent,iSample,iRate);
				m_ConPtr->Execute(_bstr_t(strSQL),NULL,adCmdText);

			}
		}
		return TRUE;
	}
	catch (_com_error e)
	{
		strTip.Format("%dmA标定失败...",iCarrent);
		AfxMessageBox(strTip);
		return FALSE;
	}

}

// 分析计算级别及时间
int CSerialTestDlg::Analyse(CCircleStatus *rscStatus)
{
	CSample samp;
	DWORD dwSeconds;
	double dValue = 0;
	BOOL bStatus = FALSE;
	int iOld = 0;
	int iCur = 0;
	int iRandom = 0 ;
	int iBaseCarrent =0;
	if (!rscStatus)
		return -1;
	//转换为实际电流
	for (int i =0;i<m_arraySample.GetCount() ;i++ )
	{
		samp = (CSample )m_arraySample.GetAt(i);
		if (rscStatus ->srCarrent >= samp.iStartSampe && rscStatus ->srCarrent < samp.iEndSampe)
		{
			dValue = samp.iStartCarrent + (rscStatus->srCarrent- samp.iStartSampe) * samp.dPer;
			rscStatus->iCarrent = dValue ;
			dValue =  ((double) samp.iRate * 50 / rscStatus->srRate);
			rscStatus->iRate = (int)dValue;
			rscStatus->iVoltage = rscStatus->srVoltage; 
			bStatus = TRUE;
			break;
		}

	}




	if( bStatus == FALSE)		//找不到上限时取最大的比例系数
	{
		dValue = samp.iEndCarrent  + (rscStatus->srCarrent- samp.iStartSampe) * samp.dPer;
		rscStatus->iCarrent = dValue ;
		dValue =  ((double) samp.iRate * 50 / rscStatus->srRate);
		rscStatus->iRate = dValue;
		rscStatus->iVoltage = rscStatus->srVoltage;
		bStatus = TRUE;
	}



	if(arrCarrent[0]==4)
	{
		
		arrCarrent[1] =arrCarrent[2];
		arrCarrent[2] =arrCarrent[3];
		arrCarrent[0] = 3;
	
	}
	arrCarrent[arrCarrent[0]] = rscStatus->iCarrent;
	arrCarrent[0]++;



	iOld = GetRange(m_CirStatus->iCarrent);
	iCur = GetRange(rscStatus->iCarrent);
	if (iOld != iCur && iCur == 0 && rscStatus->iVoltage == 0 && rscStatus->iCarrent  == 0)				//销警时计时
	{
		//根据抽样特征确定是否还需要计时
		if(GetFlag() == 1)
		{
			m_CirStatus->tmStartTime = rscStatus->tmEndTime;
		}
	}else if (iOld == 0 && iCur > 0  )											//开始发生告警计时
	{
		m_CirStatus->tmStartTime = rscStatus->tmEndTime;
	}

	

	//获取级别
	if (m_CirStatus->iCarrent == 0  && m_CirStatus->iVoltage == 0)
	{
		//memcpy(m_CirStatus,rscStatus,sizeof(rscStatus));
		for(int i=0;i<6;i++)
		{
			arIni[i] = 0;
		}
		if(GetFlag() == 0)
		{
			m_CirStatus->dwSeconds	= rscStatus->dwSeconds;
			m_CirStatus->iCarrent	= rscStatus->iCarrent;
			m_CirStatus->iVoltage 	= rscStatus->iVoltage;
			m_CirStatus->iLevel		= rscStatus->iLevel;
			m_CirStatus->iRate		= rscStatus->iRate;
			m_CirStatus->srCarrent	= rscStatus->srCarrent;
			m_CirStatus->srVoltage  = rscStatus->srVoltage;
			m_CirStatus->srRate		= rscStatus->srRate;
			m_CirStatus->iOne 		= rscStatus->iOne;
			m_CirStatus->dBaseTime  	= rscStatus->dBaseTime;
			m_CirStatus->maxCarrent = 0;
			//m_CirStatus->tmStartTime	= rscStatus->tmStartTime;
			m_CirStatus->tmEndTime		= rscStatus->tmEndTime;
			//m_CirStatus->maxCarrent		= m_CirStatus->iCarrent;
			
			CTimeSpan tmsTime = rscStatus->tmEndTime - rscStatus->tmStartTime;
			dwSeconds = (DWORD)tmsTime.GetTotalSeconds();
			rscStatus->dwSeconds	= rscStatus->dwVolSeconds = dwSeconds ;
			iCount = 0;
			//rscStatus->dwVolSeconds	= dwSeconds ;
			

		} 

		
		//m_CirStatus->dwSeconds =0;

	}else
	{	//计算秒数


		CTimeSpan tmsTime = rscStatus->tmEndTime - m_CirStatus->tmStartTime;
		dwSeconds = tmsTime.GetTotalSeconds();
		srand(time(NULL));
		iRandom = rand() % 1000;
		

		if (rscStatus->iCarrent < 50 && rscStatus->iVoltage == 0 )	//已经销警
		{
			m_CirStatus->tmStartTime = rscStatus->tmStartTime = rscStatus->tmEndTime;
			rscStatus->dwSeconds	= 0;
			rscStatus->dwVolSeconds	= 0;
			rscStatus->iLevel		= 0;
			rscStatus->maxCarrent	= 0;
			if(m_CirStatus->dBaseTime != 0)
				m_CirStatus->dBaseTime  = 0;
			//rscStatus->tmStartTime  = rscStatus->tmEndTime;

		
		}else 
		{
			//if (rscStatus->iVoltage == 1)
			//	rscStatus->dwVolSeconds	= dwSeconds + (double)iInterval/1000 + iRandom /1000;
			//else
			//	rscStatus->dwVolSeconds = dwSeconds + (double)iInterval/1000 + iRandom /1000;

			rscStatus->dwVolSeconds = dwSeconds;
			rscStatus->dwSeconds  = dwSeconds   ;
			rscStatus->dwSeconds  = dwSeconds  ;

			if (rscStatus->iCarrent >= 3000)
			{
				//rscStatus->dwVolSeconds = (double)dwSeconds + 0.2;
				//rscStatus->dwSeconds  = (double)dwSeconds + 0.2  ;
			}
					
		
		}
			
		//if(rscStatus->iCarrent < 50 && rscStatus->iVoltage == 1 )		//电流瞬碰,电源持续
		//{
		//	rscStatus->dwSeconds = dwSeconds + (double)iInterval/1000;
		//	rscStatus->dwVolSeconds	= dwSeconds + (double)iInterval/1000;
		//
		//
		//}else  if(rscStatus->iCarrent >= 50 && rscStatus->iVoltage == 1 )	//电流持续,电源持续
		//{
		//	rscStatus->dwSeconds = dwSeconds + (double)iInterval/1000;
		//	rscStatus->dwVolSeconds	= dwSeconds + (double)iInterval/1000;
		//}else if(rscStatus->iCarrent >= 50 && rscStatus->iVoltage == 0 )	//电流持续,电源持续
		//{
		//	rscStatus->dwSeconds = dwSeconds + (double)iInterval/1000;
		//	//rscStatus->dwVolSeconds	= dwSeconds + (double)iInterval/1000;
		//	rscStatus->dwVolSeconds = m_CirStatus->dwVolSeconds;
		//
		//}
		//rscStatus->dwSeconds += (double)iRandom/1000;
		//rscStatus->dwVolSeconds +=(double)iRandom/1000;
		//m_CirStatus->dwSeconds = dwSeconds;
		//m_CirStatus->tmEndTime = rscStatus->tmEndTime;
	
	}
	

	//取得初始电流
		if ((rscStatus->iCarrent>200 && rscStatus->dwSeconds <= 2) || m_CirStatus->maxCarrent == 0)
		{
			if ( rscStatus->iCarrent > m_CirStatus->maxCarrent)
				m_CirStatus->maxCarrent = rscStatus->iCarrent;

			//m_CirStatus->maxCarrent = this->SetIniSample(rscStatus->iCarrent);
		}

		//计算级别
		int iItem = 1;
		int iLevel  =0;

		CString strSQL,strTable,strTip,strValue ;		//SQL语句
		double dBegin = 0;

		_variant_t var;
		_RecordsetPtr pRsPtr ;
		pRsPtr.CreateInstance(__uuidof(Recordset)); 

		if (m_CirStatus->iLevel == 0  && m_CirStatus->maxCarrent == 0)												//查询初始电流告警
		{
			//m_CirStatus->maxCarrent = rscStatus->iCarrent;

			if (rscStatus->iCarrent > 200 && rscStatus->iVoltage == 1)
			{
				strSQL.Format("Select * From CMTAlarmLevel Where fCarrent1 <= %.0f and fCarrent2 >%.0f and fSecond1 <=%.0f and fSecond2 > %.0f",\
				rscStatus->iCarrent,rscStatus->iCarrent,rscStatus->dwSeconds ,rscStatus->dwSeconds);
			}else if (rscStatus->iCarrent > 200 && rscStatus->iVoltage == 0)
			{
				strSQL.Format("Select * From CMTAlarmLevel Where fCarrent1 <= %.0f and fCarrent2 >%.0f and fSecond1 <=%.0f and fSecond2 > %.0f",\
				rscStatus->iCarrent,rscStatus->iCarrent,rscStatus->dwSeconds ,rscStatus->dwSeconds);
			}

			//rscStatus->maxCarrent	= 0;
	
		}else if (m_CirStatus->maxCarrent != 0)
		{
			if (m_CirStatus->maxCarrent< 200)
				m_CirStatus->maxCarrent = 201;
			if (rscStatus->iVoltage == 1)
			{
					
					strSQL.Format("Select * From CMTAlarmLevel Where fClass = 1 and fCarrent1 <= %.0f and fCarrent2 >%.0f and fVoltage1 <=%.0f ",\
						m_CirStatus->maxCarrent,m_CirStatus->maxCarrent,rscStatus->dwVolSeconds );
			
			}else
			{
				
				if(rscStatus->iCarrent >= 50 &&  rscStatus->iCarrent < 200 &&  m_CirStatus->maxCarrent > 200)			// 查询50<=I<=200电流持续的时间级别
				{
					strSQL.Format("Select * From CMTAlarmLevel Where fClass =1 and  fCarrent1 <= %.0f and fCarrent2 >%.0f and fSecond1 <=%.0f and fSecond2 >%.0f ",\
						m_CirStatus->maxCarrent,m_CirStatus->maxCarrent,rscStatus->dwSeconds,rscStatus->dwSeconds  );

				}else if(rscStatus->iCarrent >= 200 &&  m_CirStatus->maxCarrent > 200)		// 查询5I>=200电流持续的时间级别
				{

					strSQL.Format("Select * From CMTAlarmLevel Where fClass in (0,2,3) and fCarrent1 <= %.0f and fCarrent2 >%.0f and fSecond1 <=%.0f and fSecond2 > %.0f",\
						m_CirStatus->maxCarrent,m_CirStatus->maxCarrent,rscStatus->dwSeconds  ,rscStatus->dwSeconds);

				}else if(GetFlag()==1)
				{
					strSQL.Format("Select * From CMTAlarmLevel Where fClass in (0,2,3) and fCarrent1 <= %.0f and fCarrent2 >%.0f and fSecond1 <=%.0f and fSecond2 > %.0f",\
						m_CirStatus->maxCarrent,m_CirStatus->maxCarrent,rscStatus->dwSeconds  ,rscStatus->dwSeconds);
					
				}
				else
				{
					strSQL = "";

				}

			}
		}
		
		if(m_CirStatus->dBaseTime == 0)
		{
			m_CirStatus->dBaseTime = rscStatus->dBaseTime = GetBaseAlarm(m_CirStatus->maxCarrent);
		}


		if (strSQL.GetLength() > 0)
		{
			TRACE0(strSQL);

⌨️ 快捷键说明

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