📄 eqpool.cpp
字号:
strName = "未知" ;
}
else
m_pAdoDB->GetStrVar(var,strName,strTip) ; //读取设备端口序号
strTip = strStep + "读表 CMTAlarmInfo 的 告警值 AlarmValue 出错" ;
for( i = 0 ; i < pEQ->nPortNum ; i++ )
{
if( pEQ->sPort[i].strPortSort == strName )
{
if( pEQ->sPort[i].nType = TYPE_SIMULATE )
{
strTip.Format("系统:获得告警信息端口 %s ", strName) ;
theApp.TestWriteLog(strTip) ;
if( m_pAdoDB->GetRdData("AlarmValue",pRsPtr1,var,strTip) != 0 )
{
nResult++ ;
nState = 1 ;
pEQ->sPort[i].dValue = 0.0000 ;
}
else
m_pAdoDB->GetDoubleVar(var,pEQ->sPort[i].dValue,strTip) ;
}
else
pEQ->sPort[i].dValue = 0.0000 ;
pEQ->sPort[i].nACount = ALARM_LIMIT ;
pEQ->sPort[i].nState = PORT_WARNING ;
pEQ->unEQState = 1 ;
break ;
}
}
}
else
{
strTip = strStep + " 读取告警信息表时出现未知设备告警\r\n 地址编码:" + strName ;
theApp.OutPut(strTip) ;
}
pRsPtr1->MoveNext() ;
}
pRsPtr1->Close() ;
if( nCount != nNo )
strTip.Format("系统:数据库中共有 监测设备 %d 台 加载 %d 台,仍有 %d 台未能加载",nCount,nNo,nCount-nNo) ;
else
strTip.Format("系统:成功加载 监测设备 %d 台",nCount) ;
theApp.OutPut(strTip) ;
return nResult ;
}
catch (_com_error e)
{
strTip.Format("%s 出现未知异常 %s",strStep,(LPCSTR)e.Description()) ;
theApp.OutPut(strTip) ;
return -1 ;
}
}
//增加设备通讯命令
//##ModelId=44B6F8860294
int CEQPool::AddCommand(UCHAR ucCmd , sCommEQ* pEQ , CString strTime , CString strPack , int nType)
{
CString strTip ;
sCmd f_Cmd ;
CList<sCmd,sCmd> *pCmdList ;
try
{
if( ucCmd > 0x10 && ucCmd < 0xE0 ) //只增加命令包
{
pCmdList = (CList<sCmd,sCmd> *)pEQ->pCmdList ;
//最大不大于128条命令堆栈
if( pCmdList->GetCount() < 128 )
{
strTime = CTime::GetCurrentTime().Format( "%Y-%m-%d %H:%M:%S" ) ;
f_Cmd.ucCmd = ucCmd ;
f_Cmd.strPack = strPack ;
f_Cmd.strTime = strTime ;
f_Cmd.nType = nType ;
pCmdList->AddTail(f_Cmd) ;
return 0 ;
}
else
{
strTip.Format("程序:命令队列栈溢出 ") ;
theApp.OutPut(strTip) ;
return 2 ; //命队列栈溢出
}
}
else
return 1 ;//非法命令
}
catch(_com_error e)
{
strTip.Format( "异常:增加设备通讯命令发生异常:%s ",(LPCSTR)e.Description() ) ;
theApp.OutPut(strTip) ;
return -1 ;
}
}
//删除设备通讯命令,超时、收到响应包时自动执行
//##ModelId=44B6F8860292
int CEQPool::SubCommand(sCommEQ *pEQ)
{
CString strTip ;
CList<sCmd,sCmd> *pCmdList ;
pCmdList = (CList<sCmd,sCmd> *)pEQ->pCmdList ;
try
{
if( !pCmdList->IsEmpty() )
{
pCmdList->RemoveHead() ;
}
else
return -1 ; //无可删除命令
return 0 ;
}
catch(_com_error e)
{
strTip.Format( "异常:删除设备通讯命令发生异常:%s ",(LPCSTR)e.Description() ) ;
theApp.OutPut(strTip) ;
return -1 ;
}
}
//##ModelId=44B6F8860290
sCommEQ* CEQPool::FindEQ(CString strName)
{
int i,len ;
CString strTip ;
try
{
len = m_EQArray.GetSize() ;
if( len == 0 )
return NULL ;
//查询设备池中的设备。
for( i = 0 ; i < len ; i++ )
{
//转化字符串为十六进制
if( m_EQArray[i].strIDAddr == strName)
{
return &(m_EQArray[i]) ;
}
}
return NULL ;
}
catch(_com_error e)
{
strTip.Format( "异常:搜寻设备发生异常:%s ",(LPCSTR)e.Description() ) ;
theApp.OutPut(strTip) ;
return NULL ;
}
}
//##ModelId=44B6F8860284
sCommEQ* CEQPool::FindIP(CString strIp)
{
CString strTip ;
int i,len ;
try
{
len = m_EQArray.GetSize() ;
if( len == 0 )
return NULL ;
//查询设备池中的设备。
for( i = 0 ; i < len ; i++ )
{
//转化字符串为十六进制
if( m_EQArray[i].strCommAddr == strIp && m_EQArray[i].nModel == 2 )
{
return &(m_EQArray[i]) ;
}
}
return NULL ;
}
catch(_com_error e)
{
strTip.Format( "异常:查找设备发生异常:%s ",(LPCSTR)e.Description() ) ;
theApp.OutPut(strTip) ;
return NULL ;
}
}
//##ModelId=44B6F8860283
int CEQPool::GetAllEQState()
{
int i , len ;
CString strTip ;
try
{
len = m_EQArray.GetSize() ;
for( i = 0 ; i < len ; i++ )
{
if( m_EQArray[i].unEQState == 1 )
return 1 ;
}
return 0 ;
}
catch(_com_error e)
{
strTip.Format( "异常:获取设备状态发生异常:%s ",(LPCSTR)e.Description() ) ;
theApp.OutPut(strTip) ;
return -1 ;
}
}
//##ModelId=44B6F8860280
sSVMPort* CEQPool::FindEQPort(sCommEQ *pEQ, int nPort)
{
//int i,nNo ;
CString strTip ;
try
{
if( pEQ->sPort[nPort-1].strPortSort.IsEmpty() )
return NULL ;
return &(pEQ->sPort[nPort-1]) ;
}
catch(_com_error e)
{
strTip.Format( "异常:查找设备端口发生异常:%s ",(LPCSTR)e.Description() ) ;
theApp.OutPut(strTip) ;
return NULL ;
}
}
//##ModelId=44B6F8860275
int CEQPool::GetCount()
{
return m_nCount ;
}
//##ModelId=44B6F8860264
sCommEQ* CEQPool::FindEQ(UCHAR ucName, UCHAR ucType, CString strCommAddr)
{
int i,len ;
UCHAR ucAddr,ucTemp ;
CString strTip ;
try
{
len = GetCount() ;
for( i = 0 ; i < len ; i++ )
{
//转化字符串为十六进制
if(!m_EQArray[i].strIDAddr.IsEmpty())
StringToBytes(m_EQArray[i].strIDAddr.GetBuffer(0),&ucAddr,2) ;
if(!m_EQArray[i].strType.IsEmpty())
StringToBytes(m_EQArray[i].strType.GetBuffer(0),&ucTemp,2) ;
if( ucAddr == ucName && ucTemp == ucType && m_EQArray[i].strCommAddr == strCommAddr)
{
return &(m_EQArray[i]) ;
}
}
return NULL ;
}
catch(_com_error e)
{
strTip.Format( "异常:查找设备发生异常:%s ",(LPCSTR)e.Description() ) ;
theApp.OutPut(strTip) ;
return NULL ;
}
}
//##ModelId=44B6F8860262
sCommEQ* CEQPool::GetEQPtr(int nId)
{
int i,len ;
CString strTip ;
try
{
len = GetCount() ;
//查询设备池中的设备。
for( i = 0 ; i < len ; i++ )
{
//转化字符串为十六进制
if( m_EQArray[i].nID == nId)
{
return &(m_EQArray[i]) ;
}
}
return NULL ;
}
catch(_com_error e)
{
strTip.Format( "异常:搜寻设备发生异常:%s ",(LPCSTR)e.Description() ) ;
theApp.OutPut(strTip) ;
return NULL ;
}
}
//##ModelId=44B6F8860261
void CEQPool::ResetEQ()
{
//创建设备空间
int i,j ;
sCommEQ f_EQ ;
for( i = 0 ; i < EQ_MAX ; i++ )
{
f_EQ.nNo = i ; //设备建立时的序号
f_EQ.nID = 0 ; //设备ID号
f_EQ.nTID = 0 ; //设备类型ID
f_EQ.unEQState = 0; //0 正常 , 1 告警状态 2 异常设备(未能正确初始化)
f_EQ.unCommState = 0; //0 未连接 , 1 连接后待机 , 2 设备通讯中 ,3 设备故障
f_EQ.nModel = 0; //设备通讯模式1 串口 2 TCP
f_EQ.nFault = 0; //出错数 错误数超过5次认为通讯故障(暂定)
f_EQ.nTimeOut = 0; //超时数 超时数超过5次认为通讯断开(暂定)
f_EQ.strName.Empty() ; //设备的名称
f_EQ.strType.Empty() ; //设备的类型
f_EQ.strIDAddr.Empty() ; //协议包中的ADR项
f_EQ.strNote.Empty() ; //设备类型描述
f_EQ.strCommAddr.Empty() ; //用于电话号码、IP地址等表示。
f_EQ.strScanPack.Empty() ; //轮询包暂存
for( j = 0 ; j < PORT_MAX ; j++ )
{
f_EQ.sPort[j].nPID = j ; //端口ID
f_EQ.sPort[j].SVMID = 0 ; //监测模块ID
f_EQ.sPort[j].nSVDSpotNum = 0 ; //被监测设备的被监测点数
f_EQ.sPort[j].nSVDContainID = 0 ; //所在地ID
f_EQ.sPort[j].nSVDType = 0 ; //被监测设备类型
f_EQ.sPort[j].nSpotType = 0 ; //被监测点类型 0 开关量 ; 1 模拟量
f_EQ.sPort[j].nSVDID = 0 ; //被监测设备ID
f_EQ.sPort[j].nType = 0 ; //0 开关量 ; 1 模拟量
f_EQ.sPort[j].dValue = 0 ; //双精度报警值
f_EQ.sPort[j].nState = 0 ; //0 端口正常 1 端口报警
f_EQ.sPort[j].nLevel = 0 ; //告警级别 0 为无 ,一级以上为1~n
f_EQ.sPort[j].nAlimitNum = 0 ; //告警门限
f_EQ.sPort[j].nACount = 0 ; //告警次数
f_EQ.sPort[j].nAShieldNum = 0 ; //告警屏蔽数
f_EQ.sPort[j].nANum = 0 ; //告警累积
f_EQ.sPort[j].strPortSort.Empty() ; //端口序号
f_EQ.sPort[j].strSpotSort.Empty() ; //被监测点序号
f_EQ.sPort[j].strSpotNote.Empty() ; //被监测点描述
f_EQ.sPort[j].strSVDType.Empty() ; //被监测设备类型
f_EQ.sPort[j].strSVDName.Empty() ; //被监测设备名称
f_EQ.sPort[j].strSVDCity.Empty() ; //被监测设备所在城市
f_EQ.sPort[j].strSVDArea.Empty() ; //被监测设备所在地区
f_EQ.sPort[j].strSVDAddr.Empty() ; //被监测设备所在地址
f_EQ.sPort[j].strSVDPlace.Empty(); //被监测设备的具体位置(机房名称/装备地点)
f_EQ.sPort[j].strAlarmL1.Empty() ; //一级告警
f_EQ.sPort[j].strAlarmL2.Empty() ; //二级告警
f_EQ.sPort[j].strAlarmL3.Empty() ; //三级告警
f_EQ.sPort[j].pShield = NULL ; //告警屏蔽指针
BOOL bIsUse = FALSE ; //是否使用标志
}
f_EQ.nPortNum = 0 ; //端口总数
f_EQ.pCmdList = NULL; //命令队列链表指针
f_EQ.bResponse = TRUE ; //是否有响应包
f_EQ.bIsUse = FALSE; //使用标志位
m_EQArray.Add(f_EQ) ; //添加设备
} //创建设备空间
}
// 初始设备列表
int CEQPool::InitUnitList(void)
{
CString strTip ; //系统提示信息
CString strSQL ; //SQL语句
CString strTable1 ;
_variant_t var;
_RecordsetPtr pRsPtr1 ;
sUnit *m_unit;
m_UnitArray.RemoveAll();
strTip.Empty() ;
pRsPtr1.CreateInstance(__uuidof(Recordset));
strTable1 = "VW_SVModule" ; //监测模块表
strSQL.Format("SELECT * FROM %s",strTable1) ;
if( m_pAdoDB->ReadDB(strSQL, pRsPtr1,strTip) != 0 ) //读监测模块表
return -1 ; //完全未能初始化
//**************读取所有监测模块设备***************
while( !pRsPtr1->adoEOF )
{
m_unit = new sUnit;
m_unit->iPort = MDF_DEFAULT_PORT;
m_unit->iReceive = 0;
m_unit->nID = 0;
m_unit->iCmd = 0x44; //默认获取告警
m_unit->nModel = 0;
m_unit->sIP = _T("127.0.0.1");
m_unit->strIDAddr = _T("01");
m_unit->strSend.Empty();
m_unit->strType.Empty();
m_unit->iSendCount = 0;
m_unit->tmReceive = CTime::GetCurrentTime();
m_unit->tmSend = CTime::GetCurrentTime();
m_unit->iState = 0;
if( m_pAdoDB->GetRdData( "SVMID", pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetIntVar(var,m_unit->nID ,strTip) ;
}else
m_unit->nID = -1;
//获取监测模块通讯ADR地址
if( m_pAdoDB->GetRdData("SVMAddrCode",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetStrVar(var,m_unit->strIDAddr,strTip) ;
}
else
m_unit->strIDAddr.Empty();
//获取监测模块通讯来源地址
if( m_pAdoDB->GetRdData("SVMADDRSource",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetStrVar(var,m_unit->sIP,strTip) ;
}
else
m_unit->sIP.Empty();
//获取监测模块通讯模式
if( m_pAdoDB->GetRdData("SVMComModel",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetIntVar(var,m_unit->nModel,strTip) ;
}
else
m_unit->nModel = 0 ; // 0 -- UDP ; 1 -- 串口 ; 2 -- TCP
if( m_pAdoDB->GetRdData("SVMTNUM",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetStrVar(var,m_unit->strType,strTip) ;
}
else
m_unit->strType = "" ;
m_UnitArray.Add(*m_unit);
delete m_unit;
pRsPtr1->MoveNext() ;
}
pRsPtr1->Close() ;//关闭打开的记录
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -