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

📄 nsclass.cpp

📁 规约转换 103.104 规约转换 适用于电力系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// LnkLayer DLL implementation module
// NSClass.h :
//
// This is a part of the Nice Information's source code.
// Copyright (C) 1994 Nice Information Corporation
// All rights reserved.
//
// Complier: Microsoft Visual C++ 5.00, MFC 4.2
//
// create : Doo, 1998.12.28
//

#include "stdafx.h"

#include "103.h"

#include "serial.h"
#include "manpmes.h"
#include "mandb.h"
#include "manevt.h"
#include "premapi.h"
#include "protapi.h"
#include "monitor.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern C103App theApp;
extern void FAR PASCAL EXPORT NSSockeCallBack( UINT uMsg, const char FAR* addr, PORT port, SOCKET socket );

CProtectValue::CProtectValue()
{
	m_nValueType = VALUETYPE_STRING;

	m_fValue = 0.0f;
	m_szValue = "";
}

CProtectValue::~CProtectValue()
{
}

/////////////////////////////////////////////////////////////////////////////
// CEquipment

CEquipment::CEquipment()
{
	m_szDeviceName = "";

	m_pChannel = NULL;

	m_nState = STATE_NONE;

	m_btScn = 0;

	m_bComm = TRUE;
	m_bAnswer = TRUE;
	m_uNoAnswer = 0;

// 2000.12.19 doo, for comm-state digital 
	m_wCommRtu = (WORD)-1;
	m_wCommIndex = (WORD)-1;

	
	memset( &m_LogicAddr, 0, sizeof(LOGICADDR) );
	m_pValue = NULL;
	
	memset( m_szInfo, 0, sizeof(m_szInfo) );
	memset( m_btInfo, 0, sizeof(m_btInfo) );
	
	m_uPulseTimeout = 0;
	m_uPulseTimeCounter = 0;
}

CEquipment::~CEquipment()
{
	ClearList();

	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;
	}
	
	while( !m_ListAccidentInf.IsEmpty() )
		delete m_ListAccidentInf.RemoveHead();
	while( !m_ListEventInf.IsEmpty() )
		delete m_ListEventInf.RemoveHead();
	while( !m_ListChannelInf.IsEmpty() )
		delete m_ListChannelInf.RemoveHead();
	while( !m_ListStateInf.IsEmpty() )
		delete m_ListStateInf.RemoveHead();
	
	while( !m_ListUnprocess.IsEmpty() )
		delete (PROTEVENT*)m_ListUnprocess.RemoveHead();
}

void CEquipment::ClearList()
{
	// clear the old value
	while( !m_ListValue.IsEmpty() )
		delete m_ListValue.RemoveHead();
}

BOOL CEquipment::IsCommFree()
{
	if ( !m_bComm || !m_pChannel )
		return FALSE;

	if ( STATE_GI >= m_nState )
		return TRUE;

	return FALSE;
}

void CEquipment::OnNoAnswer( BOOL bNoAnswer )
{
	// if the event switch is off
	if ( 0 == ::GetPrivateProfileInt( "Settings", "Event", 0, PROTOCOL_INIFILE ) )
		return ;

	// don't alarm on undefined device
	if ( 0 == _stricmp( m_LogicAddr.m_szName, "未定义" ) )
		return ;
	
// 2000.12.19 doo, for comm-state digital 
	if ( (WORD)-1 != m_wCommRtu && (WORD)-1 != m_wCommIndex )
	{
		char szData[5 + sizeof(WORD) + sizeof(BYTE)], *pRaw = szData;
	
		*(WORD*)pRaw = m_wCommRtu;
		pRaw += sizeof(WORD);

		*pRaw = DIGIT_RAW_DATA;
		pRaw++;

		*(WORD*)pRaw = sizeof(WORD) + sizeof(BYTE);
		pRaw += sizeof(WORD);

		*(WORD*)pRaw = (WORD)m_wCommIndex - 1;
		pRaw += sizeof(WORD);

		if ( bNoAnswer )
		{
			m_bAnswer = FALSE;
			*(BYTE*)pRaw = 0;
		}
		else
		{
			m_bAnswer = TRUE;
			*(BYTE*)pRaw = 1;
		}
		
		::WriteRdbData( szData );
	}
	else
	{
		EVENTITEM EventItem;
		memset( &EventItem, 0, sizeof( EVENTITEM ) );
	
		EventItem.lTime = time( NULL );
		EventItem.btEvent = EVENT_EXPLAIN;

		CString szInfo = m_LogicAddr.m_szName;
		if ( bNoAnswer )
		{
			m_bAnswer = FALSE;
			szInfo += "通讯无响应";
		}
		else
		{
			m_bAnswer = TRUE;
			szInfo += "通讯恢复响应";
		}
		strncpy( EventItem.szExplain, szInfo, EVENTEXPLEN );

		::DoEvent( &EventItem );
	}
}

void CEquipment::OnCommError()
{
	// if the event switch is off
	if ( 0 == ::GetPrivateProfileInt( "Settings", "Event", 0, PROTOCOL_INIFILE ) )
		return ;

	// don't alarm on undefined device
	if ( 0 == _stricmp( m_LogicAddr.m_szName, "未定义" ) )
		return ;
	
// 2000.12.19 doo, for comm-state digital 
	if ( (WORD)-1 != m_wCommRtu && (WORD)-1 != m_wCommIndex )
	{
		char szData[5 + sizeof(WORD) + sizeof(BYTE)], *pRaw = szData;
	
		*(WORD*)pRaw = m_wCommRtu;
		pRaw += sizeof(WORD);

		*pRaw = DIGIT_RAW_DATA;
		pRaw++;

		*(WORD*)pRaw = sizeof(WORD) + sizeof(BYTE);
		pRaw += sizeof(WORD);

		*(WORD*)pRaw = (WORD)m_wCommIndex - 1;
		pRaw += sizeof(WORD);

		*(BYTE*)pRaw = 0;
		
		::WriteRdbData( szData );
	}
	else
	{
		EVENTITEM EventItem;
		memset( &EventItem, 0, sizeof( EVENTITEM ) );
	
		EventItem.lTime = time( NULL );
		EventItem.btEvent = EVENT_EXPLAIN;

		// if no this logic addr.
		if ( 0 == m_LogicAddr.m_btAddrLgc )
			return ;

		CString szInfo = m_LogicAddr.m_szName;
		szInfo += "通道中断";
		strncpy( EventItem.szExplain, szInfo, EVENTEXPLEN );

		::DoEvent( &EventItem );
	}
}

void CEquipment::OnCommOK()
{
	// if the event switch is off
	if ( 0 == ::GetPrivateProfileInt( "Settings", "Event", 0, PROTOCOL_INIFILE ) )
		return ;

	// don't alarm on undefined device
	if ( 0 == _stricmp( m_LogicAddr.m_szName, "未定义" ) )
		return ;
	
// 2000.12.19 doo, for comm-state digital 
	if ( (WORD)-1 != m_wCommRtu && (WORD)-1 != m_wCommIndex )
	{
		char szData[5 + sizeof(WORD) + sizeof(BYTE)], *pRaw = szData;
	
		*(WORD*)pRaw = m_wCommRtu;
		pRaw += sizeof(WORD);

		*pRaw = DIGIT_RAW_DATA;
		pRaw++;

		*(WORD*)pRaw = sizeof(WORD) + sizeof(BYTE);
		pRaw += sizeof(WORD);

		*(WORD*)pRaw = (WORD)m_wCommIndex - 1;
		pRaw += sizeof(WORD);

		*(BYTE*)pRaw = 1;
		
		::WriteRdbData( szData );
	}
	else
	{
		EVENTITEM EventItem;
		memset( &EventItem, 0, sizeof( EVENTITEM ) );
	
		EventItem.lTime = time( NULL );
		EventItem.btEvent = EVENT_EXPLAIN;

		// if no this logic addr.
		if ( 0 == m_LogicAddr.m_btAddrLgc )
			return ;

		CString szInfo = m_LogicAddr.m_szName;
		szInfo += "通道恢复";
		strncpy( EventItem.szExplain, szInfo, EVENTEXPLEN );

		::DoEvent( &EventItem );
	}
}

void CEquipment::GetSyncTime( BYTE* pData )
{
	// see 7.2.6.29
	SYSTEMTIME SystemTime;
	::GetLocalTime( &SystemTime );

	// milliseconds
	*(WORD*)pData = SystemTime.wSecond * 1000 + SystemTime.wMilliseconds;
	pData += sizeof(WORD);

	// minute
	*pData = (BYTE)SystemTime.wMinute;
	pData++;

	// hour
	*pData = (BYTE)SystemTime.wHour;
	pData++;

	// day of week, monday = 1, ..., sunday = 7
	if ( 0 == SystemTime.wDayOfWeek )
		*pData = 7;
	else
		*pData = (BYTE)SystemTime.wDayOfWeek;
	*pData = *pData << 5;

	// day of month
	*pData += SystemTime.wDay;
	pData++;

	// month
	*pData = (BYTE)SystemTime.wMonth;
	pData++;

	// year
	*pData = SystemTime.wYear % 100;
	pData++;
}

void CEquipment::ProcessTime( PROTEVENT& ProtEvent, BYTE* pData )
{
	SYSTEMTIME SystemTime;
	::GetLocalTime( &SystemTime );

	ProtEvent.evt_year = SystemTime.wYear - 1900;
	ProtEvent.evt_mon = SystemTime.wMonth;
	ProtEvent.evt_day = SystemTime.wDay;
	ProtEvent.evt_hour = pData[3] & 0x1f;
	ProtEvent.evt_min = pData[2] & 0x3f;
	ProtEvent.evt_sec = *(WORD*)pData / 1000;

	ProtEvent.evt_ms = *(WORD*)pData % 1000;
}

void CEquipment::ProcessRelativeTime( PROTEVENT& ProtEvent, BYTE* pData )
{
	ProtEvent.evt_startms = *(WORD*)pData;
}

short CEquipment::ProcessMEA( BYTE* pData )
{
	short sValue = *(short*)pData;

	if ( sValue & 0xC000 )
		sValue = 0;
	else
		if ( sValue & 0x1000 )
			sValue = -( sValue & 0x0FFF );
		else
			sValue = sValue & 0x0FFF;
	
	return sValue;
}

int CEquipment::ProcessSend()
{
	// if the socket is connected
	if ( !m_pChannel )
		return PREM_ERR_COMOPEN;

	// reset the counter
	m_uTaskTimeCounter = 0;

	// the equipment ack the command
	switch( m_nState )
	{
		case STATE_VERSION:
			{
				BYTE szASDU[ASDU_20_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_20;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_START;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = 4;
				szASDU[ASDUHEAD_DAT] = 1;
				szASDU[ASDUHEAD_DAT + 1] = m_btScn;

				m_pChannel->ProcessSend( (char*)szASDU, ASDU_20_SIZE );
			}
			break;

		case STATE_TIMESYNC:
			{
				BYTE szASDU[ASDU_6_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_6;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_TIME;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = 0;

				GetSyncTime( szASDU + ASDUHEAD_DAT );
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_6_SIZE );
			}
			break;

		case STATE_GI:
			{
				BYTE szASDU[ASDU_7_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_7;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_GI;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = 0;

				szASDU[ASDUHEAD_DAT] = m_btScn++;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_7_SIZE );
			}
			break;

		case STATE_ACCIDENTINF:
			{
				BYTE szASDU[ASDU_21_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_21;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_GR;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = 241;

				// RII
				szASDU[ASDUHEAD_DAT] = m_btScn++;
				// NGD
				szASDU[ASDUHEAD_DAT + 1] = 1;

				// GIN
				szASDU[ASDUHEAD_DAT + 2] = GRP_EVT1;
				szASDU[ASDUHEAD_DAT + 3] = 0x00;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = KOD_DESCRIPTION;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_EVENTINF:
			{
				BYTE szASDU[ASDU_21_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_21;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_GR;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = 241;

				// RII
				szASDU[ASDUHEAD_DAT] = m_btScn++;
				// NGD
				szASDU[ASDUHEAD_DAT + 1] = 1;

				// GIN
				szASDU[ASDUHEAD_DAT + 2] = GRP_EVT2;
				szASDU[ASDUHEAD_DAT + 3] = 0x00;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = KOD_DESCRIPTION;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_CHANNELINF:
			{
				BYTE szASDU[ASDU_21_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_21;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_GR;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = 241;

				// RII
				szASDU[ASDUHEAD_DAT] = m_btScn++;
				// NGD
				szASDU[ASDUHEAD_DAT + 1] = 1;

				// GIN
				szASDU[ASDUHEAD_DAT + 2] = GRP_CHL;
				szASDU[ASDUHEAD_DAT + 3] = 0x00;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = KOD_DESCRIPTION;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_STATEINF:
			{
				BYTE szASDU[ASDU_21_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_21;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_GR;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = 241;

				// RII
				szASDU[ASDUHEAD_DAT] = m_btScn++;
				// NGD
				szASDU[ASDUHEAD_DAT + 1] = 1;

				// GIN
				szASDU[ASDUHEAD_DAT + 2] = GRP_STA;
				szASDU[ASDUHEAD_DAT + 3] = 0x00;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = KOD_DESCRIPTION;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_RESET:
			{
				BYTE szASDU[ASDU_10_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_10;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_GW;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = ASDUINF_EXCW;

				// RII
				szASDU[ASDUHEAD_DAT] = m_btScn++;
				// NGD
				szASDU[ASDUHEAD_DAT + 1] = 1;

				// GIN
				szASDU[ASDUHEAD_DAT + 2] = GRP_SYS1;
				szASDU[ASDUHEAD_DAT + 3] = SYS_INF_SIGRST;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = 1;
				// GDD
				szASDU[ASDUHEAD_DAT + 5] = GDD_UINT;
				szASDU[ASDUHEAD_DAT + 6] = 1;
				szASDU[ASDUHEAD_DAT + 7] = 1;
				szASDU[ASDUHEAD_DAT + 8] = 1;

				m_pChannel->ProcessSend( (char*)szASDU, ASDU_10_SIZE );
			}
			break;

		case STATE_FREEZEPULSE:
			{
				BYTE szASDU[ASDU_10_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_10;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_GW;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = ASDUINF_EXCW;

				// RII
				szASDU[ASDUHEAD_DAT] = m_btScn++;
				// NGD
				szASDU[ASDUHEAD_DAT + 1] = 1;

				// GIN
				szASDU[ASDUHEAD_DAT + 2] = GRP_SYS1;
				szASDU[ASDUHEAD_DAT + 3] = SYS_INF_PULSEFZ;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = 1;
				// GDD
				szASDU[ASDUHEAD_DAT + 5] = GDD_UINT;
				szASDU[ASDUHEAD_DAT + 6] = 1;
				szASDU[ASDUHEAD_DAT + 7] = 1;
				szASDU[ASDUHEAD_DAT + 8] = 1;

				m_pChannel->ProcessSend( (char*)szASDU, ASDU_10_SIZE );
			}
			break;

		case STATE_CALLPULSE:
			{
				BYTE szASDU[ASDU_21_SIZE];

				szASDU[ASDUHEAD_TYP] = ASDU_21;
				szASDU[ASDUHEAD_VSQ] = 0x81;
				szASDU[ASDUHEAD_COT] = COT_GR;
				szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
				szASDU[ASDUHEAD_FUN] = 254;
				szASDU[ASDUHEAD_INF] = 241;

				// RII
				szASDU[ASDUHEAD_DAT] = m_btScn++;
				// NGD
				szASDU[ASDUHEAD_DAT + 1] = 1;

				// GIN
				szASDU[ASDUHEAD_DAT + 2] = GRP_PUL;
				szASDU[ASDUHEAD_DAT + 3] = 0x00;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = KOD_VALUE;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_FREEPULSE:
			{
				BYTE szASDU[ASDU_10_SIZE];

⌨️ 快捷键说明

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