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

📄 evtdb.cpp

📁 电力监控系统 实时告警处理程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// evtdb.cpp version 3.0: implementation of the evtdb class.
//
//  evtdb 1.0 cjh
//  evtdb 3.0 jyy 2003 北海银河高科技产业股份有限公司
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RealEv.h"
#include "evtdb.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

evtdb::evtdb()
{
//	memset(evt,0,sizeof(scada_event)*MAXEVT);
	memset(&m_oldEvt,0,sizeof(scada_event));
	nEvt=0;
	cursor=-1;
	curchange=0;
	m_nEvtTypeCounts = 0;
	m_iCurEvtDisType = 0xffff;//全部
	m_bdbInitialed = false;
	m_printf=false;
	warntimes=true;
	warntime=1;
	handle=NULL;
	fisf=false;
	Is_ChgF=false;
	m_bInVoice = false;

	char* yhpath = getenv("yhpath");
	CFileStatus status;
	if((yhpath!=NULL)&&(CFile::GetStatus(yhpath,status)))
	{
		strcpy(m_strSoundpath,yhpath);
		strcat(m_strSoundpath,"\\sound\\");
	}
	else
		strcpy(m_strSoundpath,"c:\\yh-5000\\sound\\");

	m_pNode1=NULL;
	m_pEvt1=NULL;
	m_pEvtType1=NULL;
	m_ptmp1=NULL;

	m_pNode=NULL;
	m_pEvt=NULL;
	m_ptmp=NULL;
	m_pEvtType=NULL;
	m_EvtOpt=NULL;
}

evtdb::~evtdb()
{
	
}
//读入所有的事件记录
void evtdb::ReadAllEvt()
{
	
	int i = 0,num = 0;
	m_pEvt=(scada_event*)GetAllEvent(num); //返回记录
	if(num==0) return;
	memcpy(evt,m_pEvt,sizeof(scada_event)*num);
	nEvt = num;
}

//到上一条事件记录
void evtdb::GotoLastEvent()
{
	cursor=cursor>0 ? cursor-1:cursor;
	curchange=1;
}

//到下一条事件记录
void evtdb::GotoNextEvent()
{
	cursor=cursor<nEvt-1 ? cursor+1:nEvt-1;
	curchange=1;
}

//返回当前显示串
void evtdb::GetCurStr(char *str)
{
	
	if(cursor<0||nEvt==0){
		sprintf(str,"没有事件消息");
		return;
	}
	strcpy(str,evt_tmp[cursor].Describe);
}
//是否已确认
bool evtdb::Ack()
{
	WORD at;
	if(cursor<0||nEvt==0) return true; 
	at=evt_tmp[cursor].AffirmF;
	if(at==0) return false;
	else return true;
}


//返回日期时间串
void evtdb::GetDTMStr(CTime &tm,WORD  MilliSec, char *dstr,bool f)
{
	CTime time=CTime::GetCurrentTime();
	if(tm<0)
		memcpy(&tm,&time,sizeof(CTime));
	int year =tm.GetYear();
	int month = tm.GetMonth();
	int day = tm.GetDay();
	int hour = tm.GetHour();
	int minute = tm.GetMinute();
	int second = tm.GetSecond();
	if(f)	
		sprintf(dstr,"%4d-%02d-%02d %02d:%02d:%02d-%03d",year,month,day,hour,minute,second,MilliSec); 
	else
		sprintf(dstr,"%4d-%02d-%02d %02d:%02d:%02d",year,month,day,hour,minute,second); 
//	AfxMessageBox(dstr);
}
//选择一个新的提示事件
void evtdb::SelectNewEvt()
{
	int i;
	if(nEvt<=0) return;
	cursor=nEvt-1;
	for(i=nEvt-1;i>50;i--){
		if((evt_tmp[i].AffirmF==0)/*&&(evt[i].prcF == 1)*/){
			cursor=i;
			break;
		}
	}
}
//返回当前事件的类型
int evtdb::GetType()
{
	if(nEvt<=0||cursor<0) return 0;
	//return evt[cursor].TypeID+1;//?+1
	return evt_tmp[cursor].TypeID;
}

int evtdb::GetAck()
{
	if(nEvt<=0||cursor<0) return 1;
	return evt_tmp[cursor].AffirmF;
}
//确认一个消息
bool evtdb::AckEvent()
{
	LSI_GetTableID("scada","event",m_Evtid);//COMMON_Node
    if ((m_pEvt1=(MEMTABLE*)LSI_GetTableAdd(m_Evtid&0xffff))==NULL)
    {
		return false;
    }
	m_pEvt=(scada_event*)m_pEvt1->data;
	if(!m_ptmp) return false;
	if(cursor<0) return false;
	
	m_ptmp[cursor].AffirmF = 1;
	evt_tmp[cursor].AffirmF = 1;
	
	LSI_SetChanged(m_tmpid,cursor);
	return true;
}
//返回级别
/*int evtdb::Level()
{
if(nEvt<=0||cursor<0) return 0;
return evt[cursor].level;
}
*/
bool evtdb::InitDbApi(char *user, char *pw)
{
	if(LSI_InitNTDbi())
	{
		if(LSI_CheckUser(user,pw))
		{
			m_bdbInitialed = true;
		}
		else
		{
			MessageBox(0,"非法的用户或口令!","错误",MB_OK|MB_ICONERROR);
			return false; 
		}
	}
	/*else
	{
		MessageBox(0,"平台未启动!","错误",MB_OK|MB_ICONERROR);
		return false;
	}*/
	int i = 0,num = 0;
	
	m_nEvtTypeCounts = 0;
	m_pEvtType = (scada_eventType*)GetAllEventType(num);
	m_nEvtTypeCounts = num;
	
	if(num >MAXEVTTYPE)AfxMessageBox("告警程序告警类型内存溢出,>150条,请整理告警类型库");
	memcpy(evttype,m_pEvtType,num*sizeof(scada_eventType));
 
	SetOpen();

	DWORD id=0;
	LSI_GetTableID("scada","EvtOpt",id);//scada_analog
	if(m_pEvtOpt=(MEMTABLE*)LSI_GetTableAdd(id&0xffff))
		m_EvtOpt=(scada_EvtOpt*)m_pEvtOpt->data;
	if(m_pEvtOpt->userec<1)
	{
		scada_EvtOpt obj;
		for(i=0;i<m_pEvtOpt->recmax;i++)		LSI_AppendRec("scada.EvtOpt", &obj);
	}

	return true;
}
void* evtdb::GetAllEventType(int &num)
{
	int recn,error;
	char *lp = NULL;
	num=0;
	void*buf=LSI_QueryRecord("TABLE(scada.eventType)",recn,error,false);
	if(error<0) return NULL;
	if(buf==NULL) num=0;
	else
	{
		num=recn;
		lp=(char*)buf;
		lp=lp+recn*2;
	}
	return lp;
}
void * evtdb::GetAllEvent(int &num)
{
	//得到事件类型库类型数量
	int recn,error;
	char *lp = NULL;
	num=0;
	void*buf=LSI_QueryRecord("TABLE(scada.event)",recn,error,false);
	if(error<0) return NULL;
	if(buf==NULL) num=0;
	else
	{
		num=recn;
		lp=(char*)buf;
		lp=lp+recn*2;
	}

	return lp;
}


bool evtdb::EvtCmp(scada_event *evt1, scada_event *evt2)
{
	if(evt1->Time==evt2->Time)
	{
		if(evt1->MilliSec==evt2->MilliSec)
		{
			if(evt1->TypeID==evt2->TypeID)
			{
				if(evt1->SubtypeID==evt2->SubtypeID)
				{
					if(evt1->RTUNo==evt2->RTUNo)
					{
						if(evt1->Value==evt2->Value)
						{
							if(strcmp(evt1->Describe,evt2->Describe)==0)
							{
								return true;
							}
						}
					}
				}
			}
		}
	}
	return false;
}
//确认是否有新的事件产生
bool evtdb::IsRecChanged()
{
	for(int i=nEvt-1;i>=0;i--)
	{
		if(IsNeedShow(evt_tmp[i].TypeID,evt_tmp[i].SubtypeID))
		{
			if(EvtCmp(&m_oldEvt,&evt_tmp[i]))		
				return FALSE;
			memcpy(&m_oldEvt,&evt_tmp[i],sizeof(scada_event));
			return TRUE;
		}
	}
	return false;
	/*if(EvtCmp(&m_oldEvt,&evt[nEvt-1]))		return FALSE;
	else if(IsNeedShow(evt[nEvt-1].TypeID,evt[nEvt-1].SubtypeID))
	{
		memcpy(&m_oldEvt,&evt[nEvt-1],sizeof(scada_event));
		return TRUE;
	}
	else	return false;*/
}
//当前显示的事件类型是否有变化
char evtdb::IsDisRecChanged()
{
	int i = 0;
	if(nEvt<=0) return 0;
	if(IsRecChanged())
	{
		if(m_iCurEvtDisType == 0xffff)			return 1;
		else
		{
			for(i = nEvt -1;i>50;i--)
			{
				if(evt_tmp[i].TypeID == (BYTE)m_iCurEvtDisType)
				{
					if(EvtCmp(&m_olddisEvt,&evt_tmp[i]))		return 1;
					else
					{
						memcpy(&m_olddisEvt,&evt_tmp[i],sizeof(scada_event)); 
						return 2;
					}
				}
			}
			return 0;
		}
	}
	else		return 0;
}
//取安全天数
bool evtdb::GetSafeDays(int& safedays)
{
	return true;
	char *lp = NULL;
	int recn,error;
	void *buf=LSI_QueryRecord("TABLE(scada.progReg),WHERE(Name=SYSDAY))",recn,error,false);
	if(error<0) return false;
	if(buf==NULL) return false;
	lp=(char*)buf;	
	lp=lp+recn*2;
	safedays = (int)(((scada_progReg*)lp)->IntVal);
}
void evtdb::SetEventType()
{
	for(int i=0;i<m_nEvtTypeCounts;i++)
	{
		if(memcmp((char*)&evttype[i].Color+4,(char*)&m_pEvtType[i].Color+4,1)!=0)
		{
			memcpy((char*)&m_pEvtType[i].Color+4,(char*)&evttype[i].Color+4,1);
			LSI_SetChanged(m_EvtTid,i);
		}
	}

}
//取事件类型
bool evtdb::GetEventType(CString *pNames, WORD *pType,COLORREF *pColor)
{
	BYTE TypeID= 0,SubTypeID = 0;
	WORD type;
	if(pNames == 0)return false;
	if(pType == NULL)return false;
	for(int i = 0;i< m_nEvtTypeCounts;i++)
	{
		pNames->Format("%s",m_pEvtType[i].Describe);
		TypeID = m_pEvtType[i].TypeID;
		SubTypeID = m_pEvtType[i].SubtypeID;
		type = MAKEWORD(SubTypeID,TypeID);
		(WORD)*pType = type;
		pColor[i] = m_pEvtType[i].Color;
		pNames++;
		pType++;
	}
	memcpy(evttype,m_pEvtType,m_nEvtTypeCounts*sizeof(scada_eventType));
	return true;
	
}

//设置当前显示类型
void evtdb::SetCurDisType(WORD iType)
{
	m_iCurEvtDisType = (WORD)iType;
}
void evtdb::SetCurDisType(char* warndes)
{
	BYTE TypeID = 0,SubtypeID = 0;
	for(int i = 0;i< m_nEvtTypeCounts;i++)
	{
		if(0 == strcmp(warndes,m_pEvtType[i].Describe))
		{
			m_iCurEvtDisType = MAKEWORD(SubtypeID,TypeID);
			break;
		}
	}
}
//取告警种类的颜色
COLORREF evtdb::GetWarnColor(BYTE TypeID, BYTE SubtypeID)
{
	if((TypeID<0)||(TypeID>=M_EVTT)) return COLORREF(RGB(255,255,255));	
	if((SubtypeID<0)||(SubtypeID>=M_EVTTS)) return COLORREF(RGB(255,255,255));	
	char ind=IndEvtT[TypeID][SubtypeID];
	if((ind<0)||(ind>=M_EVT)) return COLORREF(RGB(255,255,255));
	return m_pEvtType[ind].Color;
}
COLORREF evtdb::GetWarnColor(char* warndes)
{
	for(int i = 0;i< m_nEvtTypeCounts;i++)
	{
		if(0 == strcmp(warndes,m_pEvtType[i].Describe))
		{
			return m_pEvtType[i].Color;
		}
	}
	return COLORREF(RGB(255,255,255));	
}
//实时打印
void evtdb::PrintWarn()
{
	int i = 0;
	char dt[64];
	char desi[128];
	if(nEvt<=0)return ;
	memset(&dt,0,64);
	memset(&desi,0,128);
	
	CString szWarn;
	char printer[20];//="\\\\.\\LPT1";
	memset(&printer,0,20);
	memcpy(&printer,"\\\\.\\LPT1",20);
	DWORD wlen;

	if(!m_bPrint)//m_printf
	{		
		for(i = 0;i < nEvt;i++)
		{
			if(evt_tmp[i].IfPrint==1)
				continue;
			AckPrint(i);
		}
		Sleep(100);
		return;
	}	
	
	for(i = 0;i < nEvt;i++) //2003/7/7改动
	{
		//cursor = i;
		if(evt_tmp[i].IfPrint == 0)
		{
			if(!IsNeedPrint(evt_tmp[i].TypeID,evt_tmp[i].SubtypeID))
			{
				AckPrint(i);
				//Sleep(10);
				continue;
			}
			
			handle = CreateFile(printer, GENERIC_READ | GENERIC_WRITE,
				0, NULL, OPEN_EXISTING, NULL , NULL);
			
			if(handle==INVALID_HANDLE_VALUE)	
			{
				return;
			}
			if(!fisf)
			{
				fisf=true;
				headLine();
				Sleep(10);
				NewLine();
				Sleep(10);
				NewLine();
				Sleep(10);
			}
			GetDTMStr(evt_tmp[i].Time,evt_tmp[i].MilliSec,dt);	
			szWarn = dt;
			szWarn += "                   ";
			szWarn+=evt_tmp[i].Describe;
			memcpy(desi,szWarn,szWarn.GetLength());
			WriteFile(handle,desi,szWarn.GetLength(),&wlen,NULL);
			Sleep(100);
			NewLine();
			Sleep(100);
			CloseHandle(handle);
			AckPrint(i);
			Sleep(100);
		}
	}
	Sleep(100);
//	CloseHandle(handle);
}
//判断是否需要打印
bool evtdb::IsNeedPrint(BYTE TypeID, BYTE SubtypeID)
{
	if((TypeID<0)||(TypeID>=M_EVTT)) return 0;
	if((SubtypeID<0)||(SubtypeID>=M_EVTTS)) return 0;
	char ind=IndEvtT[TypeID][SubtypeID];
	if((ind<0)||(ind>=M_EVT)) return 0;
	if(1 == m_pEvtType[ind].IfPrint)
		return true;
	else				return false;
}

void evtdb::NewLine()
{
    DWORD nWrite;
	BOOL result=FALSE;
	BYTE close[2];
	close[0]=0x0a;
	close[1]=0x0d;
    result = WriteFile( handle,close,2,&nWrite,NULL);  
}

void evtdb::headLine()
{
    DWORD nWrite;
	BOOL result=FALSE;
	char dtt1[64];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -