📄 dataanalyse.cpp
字号:
// 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 + -