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