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

📄 nsclass.cpp

📁 规约转换 103.104 规约转换 适用于电力系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	SYSTEMTIME SystemTime;
	::GetLocalTime( &SystemTime );

	SystemTime.wHour = pData[4] & 0x1f;
	SystemTime.wMinute = pData[3] & 0x3f;
	SystemTime.wSecond = *(WORD*)( pData + 1 ) / 1000;

	SystemTime.wMilliseconds = *(WORD*)( pData + 1 ) % 1000;

	// make SOE time
	CTime cTime( SystemTime );
	*(time_t *)pRaw = cTime.GetTime();

	pRaw += sizeof(time_t);

	*(WORD*)pRaw = SystemTime.wMilliseconds;

	::WriteRdbData( szData );
}

void CEquipment::OnAsdu10( BYTE* pData )
{
	// logic addr.
	BYTE btLogicAddr = pData[ASDUHEAD_ADR];

	m_btCot = pData[ASDUHEAD_COT];
	m_btInf = pData[ASDUHEAD_INF];

	// total data sets
	BYTE btTotal = pData[ASDUHEAD_DAT + 1] & 0x3F;

	// skip the ASDU header
	pData += ASDUHEAD_DAT;
	// skip the RII & NGD
	pData += 2;

	for ( BYTE i = 0; i < btTotal; i++ )
	{
		int nDataLen = pData[GIN_LEN + KOD_LEN + 1] * ( pData[GIN_LEN + KOD_LEN + 2] & 0x7F );
		switch( *pData )
		{
			case GRP_SYS1:
				//定值区及电度冻结
				ProcessSysSet( pData );
				break;

			case GRP_VAL1:
				//定值类
				break;

			case GRP_VAL2:
				//定值类
				ProcessValSet( pData, nDataLen );
				break;

			case GRP_EVT1:
				//事件类(动作及状态事件)
				ProcessEvtSet( PROT_ACCIDENT, pData, nDataLen );
				break;

			case GRP_EVT2:
				//事件类(如告警事件)
				ProcessEvtSet( PROT_EVENT, pData, nDataLen );
				break;

			case GRP_CHL:
				//录波通道
				ProcessInfSet( 0, pData, nDataLen );
				break;

			case GRP_STA:
				//录波状态量
				ProcessInfSet( 1, pData, nDataLen );
				break;

			case GRP_ANA1:
				//遥测类(保护测量值)
				ProcessValSet( pData, nDataLen );
				break;

			case GRP_ANA2:
				//遥测类(如电流、电压、功率、频率、水位、温度等)
				ProcessAnaSet( pData );
				break;

			case GRP_DGT1:
				//遥信类(如刀闸、开关、信号、状态等)
			case GRP_DGT2:
				//遥信类
				ProcessDgtSet( pData );
				break;

			case GRP_PUL:
				//电量类
				ProcessPulSet( pData );
				break;

			case GRP_RYB:
				//遥控压板类(保护功能投/退)
				ProcessValSet( pData, nDataLen );
				if ( ( STATE_CHANGEYB != m_nState ) && ( STATE_ACKCHANGEYB != m_nState ) && ( STATE_CANCELCHANGEYB != m_nState ) )
					ProcessDgtSet( pData );
				break;

			case GRP_RLY:
				//遥控开关类(跳/合)
			case GRP_FJT:
				//遥控分头类(升/降)
				if ( m_nState != STATE_RELAY )
					break;

				ProcessRlySet( m_btInf, pData );

				m_nState = STATE_NONE;

				break;

			case GRP_SPT:
				//遥调类(DA输出)
				break;

			case GRP_SOE:
				//SOE
				ProcessSOESet( pData );
				break;

			default:
				break;
		}

		// length data set's data
		
		// next data set
		pData +=  nDataLen + GIN_LEN + KOD_LEN + GDD_LEN ;
	}
	
	// if it is unsolicite message
	if ( COT_AUTO != m_btCot && COT_LOOP != m_btCot )
	{
		EndProcess();
		m_uTaskTimeCounter = 0;
	}
}

void CEquipment::OnAsdu23( BYTE* pData )
{
	// if wait for the frame
	if ( STATE_REQUESTACC != m_nState )
		return ;
	
	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;
	}

	// allocate the buffer
	m_pValue = new BYTE[sizeof(BYTE) + sizeof(WORD) + pData[ASDUHEAD_VSQ] * ( sizeof(BYTE) + sizeof(WORD) * 2 + sizeof(time_t) )];
	if ( !m_pValue )
		return;
	
	BYTE* pValue = m_pValue;

	// step
	*pValue = 0;
	pValue++;

	// total
	*(WORD*)pValue = pData[ASDUHEAD_VSQ];
	pValue += sizeof(WORD);

	for ( int i = 0; i < pData[ASDUHEAD_VSQ]; i++ )
	{
		*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 10 * i );
		pValue += sizeof(WORD);

		*pValue = *( pData + ASDUHEAD_DAT + 10 * i + 2 );
		pValue++;

		// see 7.2.6.29
		SYSTEMTIME SystemTime;

		// milliseconds
		SystemTime.wSecond = *(WORD*)( pData + ASDUHEAD_DAT + 10 * i + 3 ) / 1000;
		SystemTime.wMilliseconds = *(WORD*)( pData + ASDUHEAD_DAT + 10 * i + 3 ) % 1000;

		// minute
		SystemTime.wMinute = *( pData + ASDUHEAD_DAT + 10 * i + 5 );

		// hour
		SystemTime.wHour = *( pData + ASDUHEAD_DAT + 10 * i + 6 );

		// day of week, monday = 1, ..., sunday = 7
		if ( 7 == ( *( pData + ASDUHEAD_DAT + 10 * i + 7 ) >> 5 ) )
			SystemTime.wDayOfWeek = 0;
		else
			SystemTime.wDayOfWeek = ( *( pData + ASDUHEAD_DAT + 10 * i + 7 ) >> 5 );

		// day of month
		SystemTime.wDay = *( pData + ASDUHEAD_DAT + 10 * i + 7 ) & 0x1F;

		// month
		SystemTime.wMonth = *( pData + ASDUHEAD_DAT + 10 * i + 8 );

		// year
		SystemTime.wYear = *( pData + ASDUHEAD_DAT + 10 * i + 9 ) + 2000;

		CTime tmAcc( SystemTime );

		*(time_t*)pValue = tmAcc.GetTime();
		pValue += sizeof(time_t);

		*(WORD*)pValue = SystemTime.wMilliseconds;
		pValue += sizeof(WORD);
	}

	// notify online
	::PostMessage( m_hProtectWnd, WM_LFPASKACCREPORT, sizeof(BYTE) + sizeof(WORD) + pData[ASDUHEAD_VSQ] * ( sizeof(BYTE) + sizeof(WORD) * 2 + sizeof(time_t) ), (LPARAM)m_pValue );

	// task complete
	m_nState = STATE_NONE;
	m_uTaskTimeCounter = 0;
}

void CEquipment::OnAsdu26( BYTE* pData )
{
	// if wait for the frame
	if ( STATE_REQUESTACC != m_nState )
		return ;
	
	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;
	}

	// allocate the buffer
	m_pValue = new BYTE[sizeof(BYTE) * 3 + sizeof(WORD) * 4 + sizeof(int)];
	if ( !m_pValue )
		return;
	
	BYTE* pValue = m_pValue;

	// step
	*pValue = 1;
	pValue++;

	// type
	*pValue = pData[ASDUHEAD_DAT + 1];
	pValue++;
	// order
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 2 );
	pValue += sizeof(WORD);
	// order
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 4 );
	pValue += sizeof(WORD);
	// channel
	*pValue = pData[ASDUHEAD_DAT + 6];
	pValue++;
	// points
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 7 );
	pValue += sizeof(WORD);
	// gap
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 9 );
	pValue += sizeof(WORD);

	// offset in millisecons
	*(int*)pValue = *(int*)( pData + ASDUHEAD_DAT + 11 );
	pValue += sizeof(int);

	// notify online
	::PostMessage( m_hProtectWnd, WM_LFPASKACCREPORT, sizeof(BYTE) * 3 + sizeof(WORD) * 4 + sizeof(int), (LPARAM)m_pValue );

	// task complete
	m_nState = STATE_NONE;
	m_uTaskTimeCounter = 0;
}

void CEquipment::OnAsdu27( BYTE* pData )
{
	// if wait for the frame
	if ( STATE_REQUESTACC != m_nState )
		return ;
	
	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;
	}

	// allocate the buffer
	m_pValue = new BYTE[sizeof(BYTE) * 3 + sizeof(WORD) + sizeof(float) * 3];
	if ( !m_pValue )
		return;
	
	BYTE* pValue = m_pValue;

	// step
	*pValue = 4;
	pValue++;

	// type
	*pValue = pData[ASDUHEAD_DAT + 1];
	pValue++;
	// order
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 2 );
	pValue += sizeof(WORD);
	// channel
	*pValue = pData[ASDUHEAD_DAT + 4];
	pValue++;

	// 1, see 7.2.6.17
	*(float*)pValue = *(float*)( pData + ASDUHEAD_DAT + 5 );
	pValue += sizeof(float);
	// 2, see 7.2.6.18
	*(float*)pValue = *(float*)( pData + ASDUHEAD_DAT + 9 );
	pValue += sizeof(float);
	// q, see 7.2.6.16
	*(float*)pValue = *(float*)( pData + ASDUHEAD_DAT + 13 );
	pValue += sizeof(float);

	// notify online
	::PostMessage( m_hProtectWnd, WM_LFPASKACCREPORT, sizeof(BYTE) * 2 + sizeof(WORD) * 2 + sizeof(float) * 3, (LPARAM)m_pValue );

	// task complete
	m_nState = STATE_NONE;
	m_uTaskTimeCounter = 0;
}

void CEquipment::OnAsdu28( BYTE* pData )
{
	// if wait for the frame
	if ( STATE_REQUESTACC != m_nState )
		return ;
	
	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;
	}

	// allocate the buffer
	m_pValue = new BYTE[sizeof(BYTE) + sizeof(WORD)];
	if ( !m_pValue )
		return;
	
	BYTE* pValue = m_pValue;

	// step
	*pValue = 2;
	pValue++;

	// order
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 2 );
	pValue += sizeof(WORD);

	// notify online
	::PostMessage( m_hProtectWnd, WM_LFPASKACCREPORT, sizeof(BYTE) + sizeof(WORD), (LPARAM)m_pValue );

	// task complete
	m_nState = STATE_NONE;
	m_uTaskTimeCounter = 0;
}

void CEquipment::OnAsdu29( BYTE* pData )
{
	// if wait for the frame
	if ( STATE_REQUESTACC != m_nState )
		return ;
	
	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;
	}

	// allocate the buffer
	m_pValue = new BYTE[sizeof(BYTE) + sizeof(WORD) + sizeof(BYTE) + pData[ASDUHEAD_DAT + 2] * 5];
	if ( !m_pValue )
		return;
	
	BYTE* pValue = m_pValue;

	// step
	*pValue = 3;
	pValue++;

	// order
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT );
	pValue += sizeof(WORD);
	// total
	*pValue = pData[ASDUHEAD_DAT + 2];
	pValue++;

	for ( int i = 0; i < pData[ASDUHEAD_DAT + 2]; i++ )
	{
		// position
		*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 3 + i * 5 );
		pValue += sizeof(WORD);
		// fun
		*pValue = *( pData + ASDUHEAD_DAT + 5 + i * 5 );
		pValue++;
		// inf
		*pValue = *( pData + ASDUHEAD_DAT + 6 + i * 5 );
		pValue++;
		// val
		*pValue = *( pData + ASDUHEAD_DAT + 7 + i * 5 );
		pValue++;
	}

	// notify online
	::PostMessage( m_hProtectWnd, WM_LFPASKACCREPORT, sizeof(BYTE) + sizeof(WORD) + sizeof(BYTE) + pData[ASDUHEAD_DAT + 2] * 5, (LPARAM)m_pValue );

	// task complete
	m_nState = STATE_NONE;
	m_uTaskTimeCounter = 0;
}

void CEquipment::OnAsdu30( BYTE* pData )
{
	// if wait for the frame
	if ( STATE_REQUESTACC != m_nState )
		return ;
	
	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;
	}

	// allocate the buffer
	m_pValue = new BYTE[sizeof(BYTE) * 3 + sizeof(WORD) * 3 + *(WORD*)( pData + ASDUHEAD_DAT + 5 ) * 2];
	if ( !m_pValue )
		return;
	
	BYTE* pValue = m_pValue;

	// step
	*pValue = 5;
	pValue++;

	// type
	*pValue = pData[ASDUHEAD_DAT + 1];
	pValue++;
	// order
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 2 );
	pValue += sizeof(WORD);
	// channel
	*pValue = pData[ASDUHEAD_DAT + 4];
	pValue++;
	// number
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 5 );
	pValue += sizeof(WORD);
	// first point position
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 7 );
	pValue += sizeof(WORD);

	for ( int i = 0; i < *(WORD*)( pData + ASDUHEAD_DAT + 5 ); i++ )
	{
		*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 9 + i * 2 );
		pValue += sizeof(WORD);
	}

	// notify online
	::PostMessage( m_hProtectWnd, WM_LFPASKACCREPORT, sizeof(BYTE) * 3 + sizeof(WORD) * 3 + *(WORD*)( pData + ASDUHEAD_DAT + 5 ) * 2, (LPARAM)m_pValue );

	// task complete
	m_nState = STATE_NONE;
	m_uTaskTimeCounter = 0;
}

void CEquipment::OnAsdu31( BYTE* pData )
{
	// if wait for the frame
	if ( STATE_REQUESTACC != m_nState )
		return ;
	
	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;
	}

	// allocate the buffer
	m_pValue = new BYTE[sizeof(BYTE) * 4 + sizeof(WORD)];
	if ( !m_pValue )
		return;
	
	BYTE* pValue = m_pValue;

	// step
	*pValue = 0xFF;
	pValue++;

	// command
	*pValue = pData[ASDUHEAD_DAT];
	pValue++;
	// type
	*pValue = pData[ASDUHEAD_DAT + 1];
	pValue++;
	// order
	*(WORD*)pValue = *(WORD*)( pData + ASDUHEAD_DAT + 2 );
	pValue += sizeof(WORD);
	// channel
	*pValue = pData[ASDUHEAD_DAT + 4];
	pValue++;

	// notify online
	::PostMessage( m_hProtectWnd, WM_LFPASKACCREPORT, sizeof(BYTE) * 4 + sizeof(WORD), (LPARAM)m_pValue );

	// task complete
	m_nState = STATE_NONE;
	m_uTaskTimeCounter = 0;
}

void CEquipment::ProcessReceive( BYTE* pData, int nLength )
{
	// receive form device
	if ( !m_bComm )
	{
		OnCommOK();
		m_bComm = TRUE;
	}
	else
	{
		// socket ok, but no answer
		if ( !m_bAnswer )
			OnNoAnswer( FALSE );
	}

	m_uNoAnswer = 0;

	// process frame
	switch( pData[ASDUHEAD_TYP] )
	{
		case ASDU_10:
			// process data
			OnAsdu10( pData );
			break;

		case ASDU_23:
			// process data
			OnAsdu23( pData );
			break;

		case ASDU_26:
			// process data
			OnAsdu26( pData );
			break;

		case ASDU_27:
			// process data
			OnAsdu27( pData );
			break;

		case ASDU_28:
			// process data
			OnAsdu28( pData );
			break;

		case ASDU_29:
			// process data
			OnAsdu29( pData );
			break;

		case ASDU_30:
			// process data
			OnAsdu30( pData );
			break;

		case ASDU_31:
			// process data
			OnAsdu31( pData );
			break;

		// reset or startup
		case ASDU_5:
			OnAsdu5( pData );
			break;

		default:
			break;
	}
}

void CEquipment::ProcessClose()
{
	// device disconnect
	if ( m_bComm )
	{
		OnCommError();
		m_bComm = FALSE;
		m_bAnswer = FALSE;
	}

	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;

		m_nLength = 0;
	}

	ClearList();

	while( !m_ListAccidentInf.IsEmpty() )
		delete m_ListAccidentInf.RemoveHead();
	while( !m_ListEventInf.IsEmpty() )
		delete m_ListEventInf.Remove

⌨️ 快捷键说明

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