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

📄 dataanalyse.cpp

📁 电信机房MDF、电源柜监控源码,主要用在通信机房配线设备监控、电源柜监控
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DataAnalyse.cpp : 实现文件
//

#include "stdafx.h"
#include "MDF.h"
#include "DataAnalyse.h"
#include ".\dataanalyse.h"
#include "system.h"
#include <math.h>

// CDataAnalyse
extern CMDFApp theApp;

CDataAnalyse::CDataAnalyse()
: m_pWnd(NULL)
{
	m_pAdoDB = theApp.m_pAdoDB;

}

CDataAnalyse::~CDataAnalyse()
{
	
}


// 设置父窗体
int CDataAnalyse::SetParent(CWnd * m_wnd)
{
	if (m_wnd)
	{
		m_pWnd = m_wnd;
		return 0;
	}else
	{
		return -1;
	}
	
}

// 分析告警
int CDataAnalyse::AnalyseAlarm(CInfoFrame frame,CEquipmentPort &port)
{
	if (frame.nRLen <=0 )
		return -1;
	//检查合法性
	UCHAR  ch = frame.InPack.CID2;
	if (ch == 0)
		ch = 0x44;
	switch (ch)
	{
		case 0x44 :					//*** 获取告警响应包处理 ***								
			ACmd44H(frame,port);
			break ;
		case 0x4D :
			ACmd4DH( frame,port ) ;
			break ;
		case 0x4E :
			ACmd4EH( frame,port ) ;
			break ;
		case 0x50 :
			ACmd50H( frame,port ) ;
			break ;
		case 0x51 :
			ACmd51H( frame,port ) ;
			break ;
		case 0X60 :
			ACmd60H( frame,port ) ;
			break ; 
		default :

			break ;
	
	}

	return 0;

}


//##ModelId=44B6F88400FD
int CDataAnalyse::ACmd44H(CInfoFrame frame,CEquipmentPort port)
{
	//#加入出错异常处理
	CAdoDB cAdo ;

	//UCHAR ucCover ;
	DWORD	dwOnline;
	int nSWAlarm,nSIAlarm ;
	int nPort,nLen;
	CString strAlarmL,strValue ;
	int i = 0;
	CString strTemp ;
	CString strTime ;
	CString strStep ;
	CString strAlarm ;
	CString strError ;
	CString strTip ;
	CString strPort ;
	sSVMPort* pPort ;
	CString strInfo;
	char *ucBuf;
	UCHAR *ucCover;
	//char cbuf;
	sCommPack inPack;

	if (frame.nRLen <= 0 )
		return -1;
	inPack = frame.InPack;
	int iInfoLen = inPack.DataLen;
	ucBuf = new char[iInfoLen];
	ucCover = new UCHAR[iInfoLen];
	if (!iInfoLen)
		return -1;
	
	//for (int j = 0;j< 8;j++)
	//{
	//	cbuf = inPack.INFO[j+3];
	//	inPack.INFO[j+3] = inPack.INFO[j+11];
	//	inPack.INFO[j+11] = cbuf;

	//}



	memcpy(ucBuf,inPack.INFO,iInfoLen);
	//StringToBytes(ucBuf,ucCover,iInfoLen);		//转换为字节
	
	//计算MDF列告警
	nSWAlarm = iInfoLen - 5;
	//前两个字节为列告警
	unsigned short iColNum = 0;
	unsigned long lPow = 0 ;
	iColNum = (unsigned char)ucBuf[1];
	iColNum <<= 8;
	iColNum |= (unsigned char)ucBuf[0];
	//iColNum |= (UINT)ucBuf[1];

	strTemp.Format("%d",frame.InPack.CID1);
	port.SVMTNUM.Format("%d", frame.InPack.CID1);
	port.CodeAddr.Format("%0.2d",frame.InPack.ADR);
	port.SourceAddr = frame.address;
	port.tmUpdateTime = frame.time;
	dwOnline = (unsigned char)ucBuf[21];
	dwOnline <<= 8;
	dwOnline |= (unsigned char)ucBuf[19];


	for (  i= 0; i < 16 ; i++ )
	{
		nPort = 16 - i;			//当前端口
		port.SVMPSort  = nPort; 
		lPow = pow(2,nPort - 1);
		if (( lPow & iColNum) == lPow )
		{
			//第i位告警
			port.AlarmState = PORT_WARNING;
			port.value = 1;
		}
		else
		{
			port.AlarmState = PORT_NORMAL;
			port.value = 0;
		}
		
		//计算列在线状态
		lPow = pow(2,nPort - 1);
		if ((dwOnline & lPow) == lPow)
			port.onLine = 1;
		else
			port.onLine = 0;
		//计算列在线状态

		if (port.onLine == 0)
		{
			port.AlarmState = PORT_NORMAL;
			port.value = 0;
		}
		//不在线时屏闭告警
		GetPortState(port.CodeAddr,frame.address,nPort,port);
	}

	//第三个字节为外接告警

	//外接信号在线状态
	dwOnline = (unsigned char)ucBuf[23];
	iColNum = (unsigned char)ucBuf[2];
	for ( i= 0; i < 8 ; i++ )
	{
		nPort = 24 - i;			//当前端口
		port.SVMPSort  = nPort; 
		lPow = pow(2,nPort - 17);
		if ( ( lPow & iColNum) == lPow )
		{
			//第i位告警
			port.AlarmState =PORT_WARNING;
			port.value = 1;
		}else
		{
			port.AlarmState = PORT_NORMAL;
			port.value = 0;
		}
		//计算外接口在线状态
		lPow = pow(2,nPort - 17);
		if ((dwOnline & lPow) == lPow)
			port.onLine = 1;
		else
			port.onLine = 0;
		//计算外接口在线状态
		//不在线时屏闭告警
		if (port.onLine == 0)
		{
			port.AlarmState = PORT_NORMAL;
			port.value = 0;
		}
		
		GetPortState(port.CodeAddr,frame.address,nPort,port);
	}
	//工频接口在线状态
	dwOnline = (unsigned char)ucBuf[22];
	dwOnline <<= 8;
	dwOnline |= (unsigned char)ucBuf[20];
	//第4-19个字节为工频模拟量

	//交换高8位与底8位的位置
	//8->1;16->9  ==> 16->1


	for (int i = 3;i< nSWAlarm;i++)
	{
		nPort = 22 + i ;			//当前端口
		port.SVMPSort  = nPort; 
		strTemp.Format("%d",frame.InPack.CID1);
		port.SVMTNUM.Format("%d", frame.InPack.CID1);
		//port.CodeAddr =  (LPCTSTR)(frame.InPack.ADR);
		port.CodeAddr.Format("%0.2d",frame.InPack.ADR);
		port.SourceAddr = frame.address;
		port.tmUpdateTime = frame.time;

		lPow = pow(2,nPort - 25);
		if ((dwOnline & lPow) == lPow)
			port.onLine = 1;
		else
			port.onLine = 0;


		switch (ucBuf[i])
		{
		case 0:					//正常
			port.AlarmState = PORT_NORMAL;
			port.value = 0;
			break;
		case 0x01:				//工频告警

			port.AlarmState = PORT_WARNING;
			port.AlarmLevel = 1;
			port.value = 0x01;

			break;
		case 0x04:				//告警
			port.AlarmState = PORT_WARNING;
			port.AlarmLevel = 1;
			port.value = 0x04;
			break;
		case 0x05:				//一级告警
			port.AlarmState = PORT_WARNING;
			port.AlarmLevel = 1;
			port.value = 0x05;
			break;
		case 0x06:				//二级告警
			port.AlarmState = PORT_WARNING;
			port.AlarmLevel = 2;
			port.value = 0x06;
			break;
		case 0x07:				//三级告警
			port.AlarmState = PORT_WARNING;
			port.AlarmLevel = 3;
			port.value = 0x07;
			break;
		case 0xF0:				//故障
			port.AlarmState = PORT_WARNING;
			port.AlarmLevel = 4;
			port.value = 0xF0;
			break;
		default:			//模拟数据
			port.AlarmState = PORT_NORMAL;
			port.value = (int)ucBuf[i];
			break;
		}
		
		//计算工频在线状态

		//不在线时屏闭告警
		if (port.onLine == 0)
		{
			port.AlarmState = PORT_NORMAL;
			port.value = 0;
		}



		GetPortState(port.CodeAddr,frame.address,nPort,port);
	}
	
	return 0 ;
	
}

// 得到当前端口的状态
int CDataAnalyse::GetPortState(CString svmAddrCode, CString svmAddrSource, int iPort,CEquipmentPort &port)
{
	CMonitor *pMonitor; 
	pMonitor = (CMonitor *)m_pWnd;
	CTimeSpan tmsTime;
	long lSeconds = 0;
	int iLevel = 0;
	
	int iOldAlarmState = PORT_NORMAL;
	int iCount = (int)pMonitor->m_EquipState.GetCount();
	if (iCount <= 0 )
		return -1;
	//调试用
	//port.AlarmState = 1;
	for(int i=0;i< iCount; i++)
	{
		CEquipmentPort m_port = (CEquipmentPort)pMonitor->m_EquipState.GetAt(i);
		iOldAlarmState = m_port.AlarmState;
		if (m_port.CodeAddr == port.CodeAddr && m_port.SVMPSort == port.SVMPSort \
			&& m_port.SourceAddr == port.SourceAddr)
		{
			m_port.AlarmState = port.AlarmState;
			m_port.onLine = port.onLine ;
			m_port.value = port.value;
			if (port.AlarmState != PORT_WARNING && iOldAlarmState == PORT_NORMAL)
				m_port.tmStartTime = port.tmUpdateTime;
			m_port.tmUpdateTime = port.tmUpdateTime;

			//SendMessage(m_pWnd->m_hWnd,WM_DEVICE_DATA,(WPARAM)(&m_port),(LPARAM)port.AlarmState);

			pMonitor->m_EquipState.SetAt(i,m_port);
			
			tmsTime =  m_port.tmUpdateTime - m_port.tmStartTime;
			lSeconds = (long) tmsTime.GetTotalSeconds();
			if ( iOldAlarmState != port.AlarmState)
			{

⌨️ 快捷键说明

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