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

📄 eqpool.cpp

📁 MDF监控源码2
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -