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

📄 nsclass.cpp

📁 规约转换 103.104 规约转换 适用于电力系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				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] = 0;

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

		case STATE_RELAY:
			{
				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] = m_btInf;

				// RII
				szASDU[ASDUHEAD_DAT] = m_btScn++;
				// NGD
				BYTE btGroup = 0, btCode = 0;
				if ( -1 == theApp.GetPointCode( m_LogicAddr.m_btType, TYPE_RELAY, m_wRelayIndex, btGroup, btCode ) )
				{
					return PREM_ERR_PARAM;
					break;
				}

				szASDU[ASDUHEAD_DAT + 1] = 1;

				// GIN
				szASDU[ASDUHEAD_DAT + 2] = 11;
				szASDU[ASDUHEAD_DAT + 3] = btCode;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = 1;
				// GDD
				szASDU[ASDUHEAD_DAT + 5] = GDD_2BITS;
				szASDU[ASDUHEAD_DAT + 6] = 1;
				szASDU[ASDUHEAD_DAT + 7] = 1;

				BYTE btValue = 0;
				if ( -1 == theApp.GetRelayCode( m_LogicAddr.m_btType, m_wRelayIndex, m_btRelayValue, btValue ) )
				{
					return PREM_ERR_PARAM;
					break;
				}

				if ( (BYTE)-1 == btValue || ( DPI_OFF != btValue && DPI_ON != btValue ) )
				{
					return PREM_ERR_PARAM;
					break;
				}

				szASDU[ASDUHEAD_DAT + 8] = btValue;

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

		case STATE_REQUESTAREA:
			{
				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_SYS1;
				szASDU[ASDUHEAD_DAT + 3] = m_btInf;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = m_btProtectKOD;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_REQUESTVAL:
			{
				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_VAL2;
				szASDU[ASDUHEAD_DAT + 3] = 0x00;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = m_btProtectKOD;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_REQUESTYB:
			{
				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_RYB;
				szASDU[ASDUHEAD_DAT + 3] = 0x00;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = m_btProtectKOD;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_REQUESTPROTANA:
			{
				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_ANA1;
				szASDU[ASDUHEAD_DAT + 3] = 0x00;
				// KOD
				szASDU[ASDUHEAD_DAT + 4] = m_btProtectKOD;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
			}
			break;

		case STATE_CHANGEYB:
		case STATE_ACKCHANGEYB:
		case STATE_CANCELCHANGEYB:
		case STATE_CHANGEAREA:
		case STATE_ACKCHANGEAREA:
		case STATE_CANCELCHANGEAREA:
		case STATE_CHANGEVAL:
		case STATE_ACKCHANGEVAL:
		case STATE_CANCELCHANGEVAL:
			if ( m_pValue )
				m_pChannel->ProcessSend( (char*)m_pValue, m_nLength );
			break;

		case STATE_REQUESTACC:
			if ( 4 == m_btStep )
			{
				BYTE szASDU[ASDU_25_SIZE];

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

				// TOO
				szASDU[ASDUHEAD_DAT] = 68;
				// TOV
				szASDU[ASDUHEAD_DAT + 1] = 1;
				// FAN
				szASDU[ASDUHEAD_DAT + 2] = LOBYTE( m_wOrder );
				szASDU[ASDUHEAD_DAT + 3] = HIBYTE( m_wOrder );
				// ACC
				szASDU[ASDUHEAD_DAT + 4] = m_btChannel;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_25_SIZE );
			}
			else
			{
				BYTE szASDU[ASDU_24_SIZE];

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

				// TOO
				switch( m_btStep )
				{
					case 0:
						szASDU[ASDUHEAD_DAT] = 24;
						break;

					case 1:
						szASDU[ASDUHEAD_DAT] = 1;
						break;

					case 2:
						szASDU[ASDUHEAD_DAT] = 2;
						break;

					case 3:
						szASDU[ASDUHEAD_DAT] = 16;
						break;

					case 5:
						szASDU[ASDUHEAD_DAT] = 8;
						break;
				}

				// TOV
				szASDU[ASDUHEAD_DAT + 1] = 1;
				// FAN
				szASDU[ASDUHEAD_DAT + 2] = LOBYTE( m_wOrder );
				szASDU[ASDUHEAD_DAT + 3] = HIBYTE( m_wOrder );
				// ACC
				szASDU[ASDUHEAD_DAT + 4] = m_btChannel;
				
				m_pChannel->ProcessSend( (char*)szASDU, ASDU_24_SIZE );
			}
			break;

		default:
			break;
	}

	return PREM_OK;
}

void CEquipment::Startup()
{
	// receive form device
	if ( !m_bComm )
	{
		OnCommOK();
		m_bComm = TRUE;
	}

	Version();
}

int CEquipment::Version()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;
	
	m_nState = STATE_VERSION;
	ProcessSend();

	return PREM_OK;
}

int CEquipment::TimeSync()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;
	
	m_nState = STATE_TIMESYNC;
	ProcessSend();

	m_nState = STATE_NONE;
	
	return PREM_OK;
}

int CEquipment::LoadAccidentInf()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;
	
	m_nState = STATE_ACCIDENTINF;

	ProcessSend();

	return PREM_OK;
}

int CEquipment::LoadEventInf()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;
	
	m_nState = STATE_EVENTINF;

	ProcessSend();

	return PREM_OK;
}

int CEquipment::LoadChannelInf()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;
	
	m_nState = STATE_CHANNELINF;

	ProcessSend();

	return PREM_OK;
}

int CEquipment::LoadStateInf()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;
	
	m_nState = STATE_STATEINF;

	ProcessSend();

	return PREM_OK;
}

int CEquipment::GI()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;

	m_nState = STATE_GI;
	ProcessSend();
	
	return PREM_OK;
}

int CEquipment::FreezePulse()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;

	m_nState = STATE_FREEZEPULSE;
	ProcessSend();
	
	return PREM_OK;
}

int CEquipment::CallPulse()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;

	m_nState = STATE_CALLPULSE;
	ProcessSend();
	
	return PREM_OK;
}

int CEquipment::FreePulse()
{
	if ( !IsCommFree() )
		return PREM_ERR_TASK;

	m_nState = STATE_FREEPULSE;
	ProcessSend();
	
	return PREM_OK;
}

int CEquipment::WritePulse( WORD wIndex, BYTE* pValue, BYTE btType )
{
	// is state free
	if ( STATE_GI < m_nState )
		return PREM_ERR_TASK;

	m_nState = STATE_WRITEPULSE;

	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;

		m_nLength = 0;
	}

	// allocate the buffer
	// modify only 1 per time
	m_nLength = ASDUHEAD_DAT + 2 + ( GIN_LEN + KOD_LEN + GDD_LEN + 4 );
	m_pValue = new BYTE[m_nLength];
	if ( !m_pValue )
		return PREM_ERR_MEMORY;

	// frame header
	m_pValue[ASDUHEAD_TYP] = ASDU_10;
	m_pValue[ASDUHEAD_VSQ] = 0x81;
	m_pValue[ASDUHEAD_COT] = COT_GW;
	m_pValue[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
	m_pValue[ASDUHEAD_FUN] = 254;
	m_pValue[ASDUHEAD_INF] = ASDUINF_EXCW;

	// RII
	m_pValue[ASDUHEAD_DAT] = m_btScn++;
	m_pValue[ASDUHEAD_DAT + 1] = 1;
	// NGD
	m_pValue[ASDUHEAD_DAT + 1] = 0;

	BYTE* pTemp = m_pValue + ASDUHEAD_DAT + 2;

	// GIN
	BYTE btGroup = 0, btCode = 0;
	if ( -1 == theApp.GetPointCode( m_LogicAddr.m_btType, TYPE_PULSE, wIndex, btGroup, btCode ) )
		return PREM_ERR_PARAM;

	*pTemp++ = btGroup;
	*pTemp++ = btCode;

	// KOD
	*pTemp++ = KOD_VALUE;

	// GDD
	if ( btType )
	{
		*pTemp++ = GDD_UINT;
		*pTemp++ = sizeof(DWORD);
		*pTemp++ = 1;

		*(DWORD*)pTemp = *(DWORD*)pValue;
		pTemp += sizeof(DWORD);
	}
	else
	{
		*pTemp++ = GDD_REAL;
		*pTemp++ = sizeof(float);
		*pTemp++ = 1;

		*(float*)pTemp = *(float*)pValue;
		pTemp += sizeof(float);
	}

	ProcessSend();
	
	return PREM_OK;
}

int CEquipment::RelaySelect( WORD wRtu, BYTE btType, WORD wIndex, BYTE btValue )
{
	if ( STATE_GI < m_nState )
		return PREM_ERR_TASK;

	m_wRelayRtu = wRtu;
	m_wRelayIndex = wIndex;
	m_btInf = ASDUINF_ACKW;
	m_btRelayValue = btValue;

	m_nState = STATE_RELAY;
	int nRet = ProcessSend();

	if ( PREM_OK != nRet )
		m_nState = STATE_NONE;
	
	return nRet;
}

int CEquipment::RelayRun( WORD wRtu, BYTE btType, WORD wIndex, BYTE btValue )
{
	if ( STATE_GI < m_nState )
		return PREM_ERR_TASK;

	m_wRelayRtu = wRtu;
	m_wRelayIndex = wIndex;
	m_btInf = ASDUINF_EXCW;
	m_btRelayValue = btValue;

	m_nState = STATE_RELAY;
	int nRet = ProcessSend();

	if ( PREM_OK != nRet )
		m_nState = STATE_NONE;
	
	return nRet;
}

int CEquipment::RelayCancel( WORD wRtu, BYTE btType, WORD wIndex, BYTE btValue )
{
	if ( STATE_GI < m_nState )
		return PREM_ERR_TASK;

	m_nState = STATE_RELAY;

	m_wRelayRtu = wRtu;
	m_wRelayIndex = wIndex;
	m_btInf = ASDUINF_CANW;
	m_btRelayValue = btValue;

	m_nState = STATE_RELAY;
	int nRet = ProcessSend();
	
	m_nState = STATE_NONE;
	return nRet;
}

int CEquipment::RequestVal( WORD wRtu, HWND hWnd, BYTE btKOD )
{
	if ( STATE_GI < m_nState )
		return PREM_ERR_TASK;

	ClearList();

	m_nState = STATE_REQUESTVAL;
	
	m_wProtectRtu = wRtu;
	m_btProtectKOD = btKOD;
	m_hProtectWnd = hWnd;

	ProcessSend();
	
	return PREM_OK;
}

int CEquipment::ChangeVal( WORD wRtu, HWND hWnd, BYTE* pValue, APPSTATE appState )
{
	if ( STATE_GI < m_nState )
		return PREM_ERR_TASK;

	m_nState = appState;

	m_wProtectRtu = wRtu;
	m_hProtectWnd = hWnd;

	// free old data
	if ( m_pValue )
	{
		delete[] m_pValue;
		m_pValue = NULL;

		m_nLength = 0;
	}

	// allocate the buffer
	m_nLength = ASDUHEAD_DAT + 2 + ( GIN_LEN + KOD_LEN + GDD_LEN + sizeof(float) ) * m_ListValue.GetCount();
	m_pValue = new BYTE[m_nLength];
	if ( !m_pValue )
		return PREM_ERR_MEMORY;

	// skip flag & total
	pValue += sizeof(WORD);
	WORD wTotal = *(WORD*)pValue;
	pValue += sizeof(WORD);

	// frame header
	m_pValue[ASDUHEAD_TYP] = ASDU_10;
	m_pValue[ASDUHEAD_VSQ] = 0x81;
	m_pValue[ASDUHEAD_COT] = COT_GW;
	m_pValue[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
	m_pValue[ASDUHEAD_FUN] = 254;

	switch( appState )
	{
		case STATE_CHANGEVAL:
			m_pValue[ASDUHEAD_INF] = ASDUINF_ACKW;
			break;

		case STATE_ACKCHANGEVAL:
			m_pValue[ASDUHEAD_INF] = ASDUINF_EXCW;
			break;

		case STATE_CANCELCHANGEVAL:
			m_pValue[ASDUHEAD_INF] = ASDUINF_CANW;
			break;
	}

	// RII
	m_pValue[ASDUHEAD_DAT] = m_btScn++;
	// NGD
	m_pValue[ASDUHEAD_DAT + 1] = 0;

	BYTE* pTemp = m_pValue + ASDUHEAD_DAT + 2;

	// process the value
	POSITION pos = m_ListValue.GetHeadPosition();
	while( pos )
	{
		CProtectValue* pProtectValue = m_ListValue.GetNext( pos );

⌨️ 快捷键说明

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