📄 eqpool.cpp
字号:
// EQPool.cpp: implementation of the CEQPool class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MDF.h"
#include "EQPool.h"
#include "MDFDlg.h"
#include "ClientSock.h"
#include ".\eqpool.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CMDFApp theApp ;
//##ModelId=465286A40148
CEQPool::CEQPool()
{
m_nCount = 0 ; //已加载设备数
//ResetEQ() ;
m_pAdoDB = theApp.m_pAdoDB;
}
//##ModelId=465286A40157
CEQPool::~CEQPool()
{
}
//增加设备通讯命令
//##ModelId=465286A4010C
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=465286A40196
int CEQPool::InitUnitList(void)
{
CString strTip; //系统提示信息
CString strSQL; //SQL语句
CString strTable1;
CString strBuf,strTemp;
_variant_t var;
_RecordsetPtr pRsPtr1 ;
sUnit *m_unit;
m_UnitArray.RemoveAll();
strTip.Empty() ;
pRsPtr1.CreateInstance(__uuidof(Recordset));
strTable1 = "VW_MonitorEqu" ; //监测模块表
strSQL.Format("SELECT * FROM %s Where isUser = 1",strTable1) ;
if( m_pAdoDB->ReadDB(strSQL, pRsPtr1,strTip) != 0 ) //读监测模块表
return -1 ; //完全未能初始化
//**************读取所有监测模块设备***************
// have reapalced old fields name
// 2007-6-11
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 = 1;
m_unit->strSend.Empty();
m_unit->strType = 0;
m_unit->iSendCount = 0;
m_unit->tmReceive = CTime::GetCurrentTime();
m_unit->tmSend = CTime::GetCurrentTime();
m_unit->iState = 0;
m_unit->isDisable = 0;
if( m_pAdoDB->GetRdData( "monitorEquID", pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetIntVar(var,m_unit->nID ,strTip);
}else
m_unit->nID = -1;
//获取监测设备是否要监测标志,
if( m_pAdoDB->GetRdData("isUser",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetIntVar(var,m_unit->isDisable,strTip) ;
}
else
m_unit->isDisable = 1;
//获取监测设备类别码
if( m_pAdoDB->GetRdData("TypeNum",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetStrVar(var,strTemp,strTip);
sscanf(strTemp.GetBuffer(),"%X",&(m_unit->strType));
}
else
m_unit->strType = 0;
//获取监测模块通讯ADR地址
if( m_pAdoDB->GetRdData("monitorEquAddr",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetIntVar(var,m_unit->strIDAddr, strTip) ;
}
else
m_unit->strIDAddr = 0 ;
//获取监测模块通讯模式
if( m_pAdoDB->GetRdData("monitorEquComModel",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetIntVar(var,m_unit->nModel,strTip) ;
}
else
m_unit->nModel = 0 ; // 0 -- UDP ; 1 -- 串口 ; 2 -- TCP; 3 -- RS485
//获取监测模块通讯来源地址
if( m_pAdoDB->GetRdData("monitorAddrSource",pRsPtr1,var,strTip) == 0 )
{
m_pAdoDB->GetStrVar(var,strBuf,strTip);
int iPos = 0;
switch(m_unit->nModel)
{
case COMM_TCP:
case COMM_UDP:
iPos = strBuf.Find(":");
if (iPos > 0 )
{
m_unit->sIP = strBuf.Left( iPos + 1);
m_unit->iPort = atoi(strBuf.Mid(iPos + 1).GetBuffer());
}else
{
m_unit->isDisable = 1;
}
break;
case COMM_COM:
case COMM_485:
strBuf.MakeUpper();
strBuf.Replace("COM","");
m_unit->iPort = atoi(strBuf.GetBuffer());
if (m_unit->iPort < 1 || m_unit->iPort > 20) //最多可以有20个串口资源
m_unit->isDisable = 1;
break;
}
}
else
{
m_unit->isDisable = 1; //通信参数不全时,禁止通信
m_unit->sIP.Empty();
}
//if( m_pAdoDB->GetRdData("TypeID",pRsPtr1,var,strTip) == 0 )
//{
// m_pAdoDB->GetStrVar(var,m_unit->strType,strTip) ;
//}
//else
// m_unit->strType = "" ;
//get IP port from IP string by ":"
if (m_unit->nModel == 0 || m_unit->nModel ==2)
{
strTip = m_unit->sIP;
int pos = strTip.Find(":");
if (pos>0)
{
m_unit->sIP = strTip.Left(pos+1);
m_unit->iPort = atoi(strTip.Mid(pos +1 ).GetBuffer());
}
}
m_UnitArray.Add(*m_unit);
pRsPtr1->MoveNext() ;
}
pRsPtr1->Close() ;//关闭打开的记录
pRsPtr1.Release();
return 0;
}
//更新一个设备信息
BOOL CEQPool::SetDeviceInfo(sUnit *m_unit)
{
BOOL blResult;
blResult = FALSE;
sUnit *m_nit;
if (m_UnitArray.GetCount() > 0 )
{
CMutex *m_mutex = new CMutex();
m_mutex->Lock(1000);
for(int i=0;i<m_UnitArray.GetCount();i++ )
{
m_nit = &((sUnit)m_UnitArray.GetAt(i));
if (m_nit->nID == m_unit->nID )
{
m_UnitArray.SetAt(i,*m_unit);
blResult = TRUE;
break;
}
}
m_mutex->Unlock();
delete m_mutex;
}
return blResult;
}
// 增加新的设备信息到设备池中
int CEQPool::AddDevice(sUnit * m_unit)
{
BOOL blResult;
blResult = FALSE;
//sUnit *m_nit;
int iPos = 0;
if(m_unit)
{
CMutex *m_mutex = new CMutex();
m_mutex->Lock(1000);
iPos = m_UnitArray.Add(*m_unit);
m_mutex->Unlock();
delete m_mutex;
}
return iPos;
}
// 从池中删除指定的设备
BOOL CEQPool::RemoveDevice(long deviceID)
{
BOOL blResult;
blResult = FALSE;
sUnit *m_nit;
if (m_UnitArray.GetCount() > 0 )
{
CMutex *m_mutex = new CMutex();
m_mutex->Lock(2000);
for(int i=0;i<m_UnitArray.GetCount();i++ )
{
m_nit = &((sUnit)m_UnitArray.GetAt(i));
if (m_nit->nID ==deviceID )
{
m_UnitArray.RemoveAt(i,1);
blResult = TRUE;
break;
}
}
m_mutex->Unlock();
delete m_mutex;
}
return blResult;
}
// 删除所有的设备信息资料
BOOL CEQPool::RemoveAll(void)
{
m_UnitArray.RemoveAll();
return 0;
}
// 通过设备的ID得到该设备
BOOL CEQPool::GetDeviceByID(long deviceID,sUnit *m_unit)
{
BOOL blResult = FALSE;
sUnit *m_nit;
if (deviceID >0 && m_UnitArray.GetCount() >0 )
{
CMutex *m_mutex = new CMutex();
m_mutex->Lock(2000);
for(int i=0;i<m_UnitArray.GetCount();i++ )
{
m_nit = &(sUnit )m_UnitArray.GetAt(i);
if (m_nit->nID ==deviceID )
{
m_unit = m_nit;
blResult = TRUE;
break;
}
}
m_mutex->Unlock();
delete m_mutex;
}
return blResult;
}
// 初始化工频环数组
int CEQPool::IniCircleArray(CArray<tyCircle,tyCircle> &m_CircleList)
{
CString strTip; //系统提示信息
CString strSQL; //SQL语句
CString strTable;
CString strBuf;
int iValue;
long lValue;
_variant_t var;
_RecordsetPtr pRsPtr;
tyCircle *m_circle;
m_CircleList.RemoveAll();
pRsPtr.CreateInstance(__uuidof(Recordset));
strTable = "VW_MonitorEqu" ; //监测模块表
strSQL.Format("SELECT * FROM %s Where isUser = 1 and TypeNum ='%0.2X'",strTable,EQU_CODE_INDUCTCIRCLE) ;
if( m_pAdoDB->ReadDB(strSQL, pRsPtr,strTip) != 0 ) //读监测模块表
return -1 ; //完全未能初始化
/* 数据结构参考
long MonitorEquID; //设备ID
CString MonitorEquName; //设备名称
UCHAR TYPENUM; //设备类型号
int ComModel; //通信方式 0--UDP,1--COM,2--TCP,3--RS485
CString SourceAddr; //设备通信原地址 IP地址或串口地址
UCHAR CodeAddr; //设备地址编号
CString strComment; //说明
float fVoltage; //电压
float fCarrent; //电流
float fRate; //频率
int fAlarmLevel; //告警级别
long lmSeconds; //持续毫秒数
CTime tmStartTime; //起始时间
CTime tmUpdateTime; //结束时间
BOOL onLine; //在线状态 0-不在线;1-在线;
BOOL isDisable; //是否被屏蔽 0--未屏蔽,1--屏蔽
*/
CMutex *m_mutex = new CMutex();
m_mutex->Lock(); //锁定数组对象
while(!pRsPtr->adoEOF )
{
m_circle = new tyCircle;
if (m_pAdoDB->GetRdData("monitorEquID",pRsPtr,var,strTip) == 0)
{
m_pAdoDB->GetFieldValue("monitorEquID",pRsPtr,m_circle->MonitorEquID);
}
else
continue;
if (m_pAdoDB->GetRdData("MonitorEquName",pRsPtr,var,strTip) == 0)
{
m_pAdoDB->GetFieldValue("MonitorEquName",pRsPtr,m_circle->MonitorEquName);
}
else
m_circle->MonitorEquName.Empty();
if (m_pAdoDB->GetRdData("TYPENUM",pRsPtr,var,strTip) == 0)
{
m_pAdoDB->GetFieldValue("TYPENUM",pRsPtr,strBuf);
sscanf(strBuf.GetBuffer(),"%X" ,&(m_circle->TYPENUM) ); //按照十六进制输入
}
else
m_circle->TYPENUM = 0;
if (m_pAdoDB->GetRdData("monitorEquComModel",pRsPtr,var,strTip) == 0)
{
m_pAdoDB->GetFieldValue("monitorEquComModel",pRsPtr,m_circle->ComModel);
}
else
m_circle->ComModel = 0;
if (m_pAdoDB->GetRdData("monitorAddrSource",pRsPtr,var,strTip) == 0)
{
m_pAdoDB->GetFieldValue("monitorAddrSource",pRsPtr,m_circle->SourceAddr);
}
else
m_circle->SourceAddr.Empty() ;
if (m_pAdoDB->GetRdData("monitorEquAddr",pRsPtr,var,strTip) == 0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -