📄 monitor.cpp
字号:
//取得该设备
iIndex = m_pEQPool->GetPowerACItem(m_PowerACList, frame.InPack.ADR,frame.addrType ,frame.iPort );
//分析数据
if (iIndex >= 0)
{
m_powerac = &(tyPowerAC)m_PowerACList.GetAt( iIndex);
m_daPowerAC->AnalyseAlarm(frame,(LPVOID)m_powerac,strResult);
m_PowerACList.SetAt(iIndex, *m_powerac);
}
delete m_daPowerAC;
break;
case EQU_CODE_DCPOWERCABINET: //直流电源分配柜
//m_powerdc = new tyPowerDC;
m_daPowerDC = new CDAPowerDC() ;
m_daPowerDC->SetParent(this);
m_daPowerDC->SetDBAccess((LPVOID)p_adodb);
//取得该设备
iIndex = m_pEQPool->GetPowerDCItem(m_PowerDCList, frame.InPack.ADR,frame.addrType ,frame.iPort );
//分析数据
if (iIndex >= 0)
{
m_powerdc = &(tyPowerDC)m_PowerDCList.GetAt( iIndex);
m_daPowerDC->AnalyseAlarm(frame,(LPVOID)m_powerdc,strResult);
m_PowerDCList.SetAt(iIndex, *m_powerdc);
}
delete m_daPowerDC;
break;
case EQU_CODE_ACPOWERBOX: //交流电源分配箱
break;
case EQU_CODE_DCPOWERBOX: //直流电源分配箱
break;
case EQU_CODE_AMBIENT: //环境检测模块
break;
}
return 0;
}else //数据包错误,写日志
{
switch(iRet)
{
case 6:
strError.Format("数据包长度不足,详细内容:%s",frame.ucBuf);
theApp.WriteTxtLog(strError);
break;
case 4:
strError.Format("无效的协议命令,详细内容:%s",frame.ucBuf);
theApp.WriteTxtLog(strError);
break;
case 3:
strError.Format("无信息内容数据校验错误,详细内容:%s",frame.ucBuf);
theApp.WriteTxtLog(strError);
break;
case 5:
strError.Format("返回信息内容长度为零,详细内容:%s",frame.ucBuf);
theApp.WriteTxtLog(strError);
break;
case 7:
strError.Format("数据解析时发生位置异常,详细内容:%s",frame.ucBuf);
theApp.WriteTxtLog(strError);
break;
}
return -1;
}
//}catch(_com_error e)
//{
// //数据分析错误,丢弃数据包
// strTip.Format("%s",frame.ucBuf);
// theApp.WriteTxtLog("数据包分析错误,丢弃数据包:" + strTip);
// return -1;
//}
}
//##ModelId=4652869F032D
int CMonitor::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//if (CWnd::OnCreate(lpCreateStruct) == -1)
return 0;
}
// 命令发送器
//##ModelId=4652869F01D4
UINT CMonitor::SendThd(LPVOID lpWnd)
{
CMonitor* pMonitor = (CMonitor*)lpWnd;
sUnit m_unit;
CString strTemp;
DWORD event = 0;
int iPort;
CMutex mutex;
//取得命令列表
pMonitor->m_UnitArray.Copy(pMonitor->m_pEQPool->m_UnitArray);
pMonitor->m_protocol->Build(pMonitor->m_UnitArray,0x44);
for(;;) //开始循环发送
{
pMonitor->m_AskingStatus = TRUE;
if (pMonitor->m_AskingClose)
{
pMonitor->m_AskingStatus = FALSE;
pMonitor->m_AskingClose = FALSE;
return(0);
}
event = WaitForMultipleObjects(3, pMonitor->m_hEventArray, FALSE, INFINITE);
switch (event)
{
case 0:
pMonitor->m_AskingStatus = FALSE;
AfxEndThread(0);
break;
case 1: //重置
break;
case 2: //发送数据取得命令队列中的数据
//取得设备列表
//开始循环发送资料
for(int i =0;i< pMonitor->m_UnitArray.GetCount() ; i++)
{
m_unit = pMonitor->m_UnitArray.GetAt(i);
switch(m_unit.nModel)
{
case COMM_TCP:
case COMM_UDP:
pMonitor->m_udpServer[1]->SendTo(m_unit.strSend,m_unit.sIP ,theApp.m_Baseinfo.DevicePort);
break;
case COMM_COM:
case COMM_485:
iPort = m_unit.iPort;
if (pMonitor->m_comPort.GetCount() >0 )
{
pMonitor->SendInfoToCom(iPort,m_unit.strSend);
mutex.Lock();
m_unit.tmSend = CTime::GetCurrentTime();
m_unit.iSendCount++;
m_unit.iReceive++;
//检查是否在线
mutex.Unlock();
}
break;
}
//相同串口间的间隔询问
//Sleep(500);
}
break;
}
//设置扫描间隔时间
Sleep(theApp.m_Baseinfo.Interval);
//Sleep(1000);
}
return 0;
}
// 送出信息到串口
//##ModelId=4652869F036B
int CMonitor::SendInfoToCom(int iPort, CString strBuf)
{
BYTE *chArray;
int iLen;
CSerialPort *sport;
iLen = strBuf.GetLength();
chArray = new BYTE[iLen];
memset(chArray,0,iLen);
chArray = (BYTE *)strBuf.GetBuffer();
for(int i = 0; i< m_comPort.GetCount(); i++)
{
sport = (CSerialPort *)m_comPort.GetAt(i);
if (iPort == sport->m_port)
{
sport->WriteToPort(chArray,iLen);
break;
}
}
return 0;
}
// 起动告警查询线程
//必须在起动监测线程后再起动询问线程
//##ModelId=4652869F038A
BOOL CMonitor::StartAsking(int iSecond)
{
ResetEvent(m_hEventArray[0]);
ResetEvent(m_hEventArray[1]);
ResetEvent(m_hEventArray[2]);
SetEvent(m_hEventArray[2]);
//初始化设备状态
IniEquipmentStatus(0);
m_AskingClose = FALSE;
m_pThread = AfxBeginThread(SendThd,(LPVOID)this);
if (m_pThread != NULL)
return m_AskingStatus = TRUE;
else
return m_AskingStatus = FALSE;
}
//##ModelId=4652869F01E5
void CMonitor::OnSetFocus(CWnd* /*pOldWnd*/)
{
// 将焦点前移到视图窗口
//m_wndView.SetFocus();
}
//##ModelId=4652869F03A9
void CMonitor::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
//CRect rctMain,rctBar,rctStatus;
//m_wndToolBar.GetWindowRect(rctBar);
//m_wndStatusBar.GetWindowRect(rctStatus);
//ScreenToClient(rctBar);
//GetWindowRect(rctMain);
//ScreenToClient(rctMain);
//ScreenToClient(rctStatus);
//rctMain.top = rctBar.bottom;
//rctMain.bottom = rctStatus.top;
//
//m_wndView.MoveWindow(rctMain);
// TODO: 在此处添加消息处理程序代码
}
//##ModelId=4652869F03C8
void CMonitor::OnCmStart()
{
// TODO: 在此添加命令处理程序代码
BOOL blResult = this->StartMonitoring();
if (blResult)
this->StartAsking(0);
}
//##ModelId=4652869F03D9
void CMonitor::OnCmStop()
{
// TODO: 在此添加命令处理程序代码
this->StopMonitoring();
}
//##ModelId=4652869F03DB
void CMonitor::OnAppExit()
{
PostQuitMessage(0);
// TODO: 在此添加命令处理程序代码
}
//设备状态改变
//##ModelId=4652869F0213
LRESULT CMonitor::onStatusChange(WPARAM wParam, LPARAM lParam)
{
//
////处理告警或消警状态变化
//CEquipmentPort *port = (CEquipmentPort *)wParam;
//CString strSQL,strTable,strTip ; //SQL语句
//_variant_t var;
//_RecordsetPtr pRsPtr ;
//int iResult = 0 ;
//CString sSql;
//CString strSpotSort;
//int iSVDID;
//CString sFile;
//pRsPtr.CreateInstance(__uuidof(Recordset));
///****************************************************************************
// 保存告警信息
//****************************************************************************/
//if (port->AlarmState != PORT_NORMAL ) //告警
//{
// //取得被监测设备资料ID及序号
// if(pRsPtr->State == 1 )
// pRsPtr->Close();
// strSQL.Format("Select SVDID,SVSpotSort From CMTSVModulePort Where SVMID = %d and SVMPSort = %d",port->SVMID,port->SVMPSort);
// iResult = p_adodb->ReadDB(strSQL,pRsPtr,strTip);
// if (iResult == 0)
// {
// p_adodb->GetFieldValue("SVDID",pRsPtr,iSVDID);
// p_adodb->GetFieldValue("SVSpotSort",pRsPtr,strSpotSort);
// pRsPtr->Close();
// }
// /****************************************************
// 存入告警信息资料
// *****************************************************/
//
// if (port->AlarmLevel > 1)
// {
// strSQL.Format("Select top 1 * From CMTAlarmInfo Where SVMAddrCode = '%s' and SVMPSort = %d Order By AStartTime Desc",port->CodeAddr,port->SVMPSort);
// int iResult = p_adodb->ReadDB(strSQL,pRsPtr,strTip);
// if(iResult == 0)
// {
// if (!pRsPtr->adoEOF)
// {
// pRsPtr->PutCollect(_variant_t("AEndTime"),_variant_t(_bstr_t(port->tmUpdateTime.Format(_T("%Y-%m-%d %H:%M:%S")))));
// pRsPtr->PutCollect(_variant_t("AlarmLevel"),_variant_t(_bstr_t(port->AlarmLevel)));
// pRsPtr->UpdateBatch(adAffectCurrent);
// pRsPtr->Close();
// }else
// pRsPtr->Close();
// }
//
// }else
// {
// strSQL.Format("Insert into CMTAlarmInfo(SVMPSort,SVMAddrCode,SVDID,SVSpotSort,AlarmLevel,AStartTime,AlarmNote,AlarmState,AlarmValue,SVMID) \
// values(%d,'%s',%d,'%s',%d,'%s','%s',%d,%f,%d)",port->SVMPSort,port->CodeAddr,iSVDID,strSpotSort,1,port->tmStartTime.Format(_T("%Y-%m-%d %H:%M:%S")), \
// port->SourceAddr,port->AlarmState,port->value,port->SVMID);
// iResult = p_adodb->ExecuteSQL(strSQL);
//
// }
// if (theApp.m_Baseinfo.PlaySound == 1)
// {
// m_pMedia.SetVoice(port->CodeAddr,port->SVMPSort,m_hWnd);
// m_pMedia.AlarmVoice();
// }
//
//}else //销警
//{
// strSQL.Format("Select top 1 * From CMTAlarmInfo Where SVMAddrCode = '%s' and SVMPSort = %d Order By AStartTime Desc",port->CodeAddr,port->SVMPSort);
// int iResult = p_adodb->ReadDB(strSQL,pRsPtr,strTip);
// if(iResult == 0)
// {
// if (!pRsPtr->adoEOF)
// {
// pRsPtr->PutCollect(_variant_t("AEndTime"),_variant_t(_bstr_t(port->tmUpdateTime.Format(_T("%Y-%m-%d %H:%M:%S")))));
// pRsPtr->PutCollect(_variant_t("AlarmState"),_variant_t(3));
// pRsPtr->PutCollect(_variant_t("AlarmLevel"),_variant_t(_bstr_t(port->AlarmLevel)));
// pRsPtr->UpdateBatch(adAffectCurrent);
// pRsPtr->Close();
// }else
// pRsPtr->Close();
// }
// //if (theApp.m_Baseinfo.PlaySound == 1)
// //{
// // m_pMedia.SetVoice(port->CodeAddr,port->SVMPSort,m_hWnd);
// // m_pMedia.AlarmVoice();
// //}
//}
//::SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_CHANGE,wParam,0);
////播放告警声音
//
////m_pMedia.Open("wav\\CMFWMDF.wav",this->m_hWnd);
////生成告警文本信息
///****************************************************************************
// 发出告警短信息
//****************************************************************************/
////取得告警信息的发送对象
//
////发送告警信息
//
//if (theApp.m_Baseinfo.SMSOpen)
// SendAlarmInfo(port);
//
//
////BOOL bDail= TRUE;
////if (bDail)
////{
//// //拨打电话
//// m_Gsm->Dail("13502885226");
////}
return LRESULT();
}
//设备发生告警
//##ModelId=4652869F0224
LRESULT CMonitor::onAlarming(WPARAM wParam, LPARAM lParam)
{
CString strTemp;
//接收告警信息
long lDevid = (long)wParam;
UCHAR ucTypeNum = (UCHAR)lParam;
// if (m_pMedia != INVALID_HANDLE_VALUE)
PlayAlarmSound(lDevid,ucTypeNum);
if(m_Gsm != NULL)
{
//取得设备的告警信息
strTemp = GetAlarmString(lDevid,ucTypeNum);
SendAlarmInfoToPhone(lDevid,strTemp);
}
//送出告警信息给WEB服务器端
CHttpAccess *httpAccess = new CHttpAccess();
switch(ucTypeNum)
{
case EQU_CODE_MDF: //MDF智能告警器
httpAccess->mdfRequest();
break;
case EQU_CODE_CABLE: //电缆检测单元
httpAccess->cableRequest();
break;
case EQU_CODE_INDUCTCIRCLE: //强电入侵监测模块(工频环)
httpAccess->circleRequest();
break;
case EQU_CODE_ACPOWERCABINET: //交流电源分配柜
httpAccess->poweracRequest();
break;
case EQU_CODE_DCPOWERCABINET: //直流电源分配柜
httpAccess->powerdcRequest() ;
break;
case EQU_CODE_ACPOWERBOX: //交流电源分配箱
break;
case EQU_CODE_DCPOWERBOX: //直流电源分配箱
break;
case EQU_CODE_AMBIENT: //环境检测模块
break;
}
//发送消息给本地窗体,绘制告警界面
delete httpAccess;
return LRESULT();
}
//读取设备实时采集数据
//##ModelId=4652869F0233
LRESULT CMonitor::onReadData(WPARAM wParam, LPARAM lParam)
{
//接收经过分析后的数据
return LRESULT();
}
// WEB接收数据包分析
//##ModelId=465286A0007E
int CMonitor::WebDataAnalyse(CInfoFrame frame)
{
CPtcWEB *m_ptcWeb;
CString strAnwser,strIP,strTip,strTemp;
SockAddrIn sockAddr;
int iResult = 0;
try
{
if ((frame.addrType != 0))
{
m_ptcWeb = new CPtcWEB();
iResult = m_ptcWeb->Analyse(frame,strAnwser);
if (iResult == 0 && strAnwser.GetLength() >0)
{
strIP = frame.address;
//strTemp.Format("%d",theApp.m_Baseinfo.WebPort);
//sockAddr.CreateFrom(strIP.GetBuffer(),strTemp.GetBuffer());
m_udpServer[0]->SendTo(strAnwser,strIP,theApp.m_Baseinfo.WebPort);
//m_udpServer[0]->WriteTo(strAnwser.GetBuffer(),strAnwser.GetLength(),sockAddr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -