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

📄 device.cpp

📁 一个电力系统方面的ISA通讯规约
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		else
		{
			DZHCallBack( PREM_ERR_PROTECT );
		    SendCommand( ISA_NAK );
			//m_nCommand = STATE_NCK;
		}
		break;

	case ISA_R3:
		//add by llj 
        //if(STATE_ASKSIMULATION != m_nState)
		//	break;
		/////////////
		btLength = pData[ISA_LENGTH];
		pData += ISA_DATA;
		ProcessR3( pData,  btLength );		
		break;

	case ISA_R4:

		btLength = pData[ISA_LENGTH];
		pData += ISA_DATA;
        SendCommand( ISA_ACK );
		ProcessR4( pData, btLength );
		
		break;

	case ISA_R5:

		btLength = pData[ISA_LENGTH];
		pData += ISA_DATA;
		ProcessR5( pData, btLength );
		break;


	}
	m_nState = STATE_FREE;
	m_btSendState = SENDIDLE;
}


void CDevice::SendCommand(BYTE btCode)
{
	if (m_btSendState == SENDING)
		return;
	if ( !m_hComPort )
	{
		m_nState = STATE_FREE;
		return;
	}

	BYTE btBuffer[512] = "";

	btBuffer[ISA_SYNCCODE0] = 0xeb;
	btBuffer[ISA_SYNCCODE1] = 0x90;
	btBuffer[ISA_SYNCCODE2] = 0xeb;
	btBuffer[ISA_SYNCCODE3] = 0x90;
	
	btBuffer[ISA_STARTCODE] = ISA_START_CODE;
	btBuffer[ISA_ADDR] = m_wParent;
	btBuffer[ISA_CODE] = btCode;
	
	BYTE* pBuffer = btBuffer + ISA_DATA;

	switch ( btCode )
	{
	case ISA_ACK:
	case ISA_NAK:
	case ISA_C1:
		::CommWrite( m_hComPort, (char*)btBuffer, 7);
		return;
	case ISA_C4:
		btBuffer[ISA_LENGTH] = 0x03;
		btBuffer[ISA_DATA]=	m_btArea;
		*(WORD*)(btBuffer+ISA_DATA+1) =CheckSum( btBuffer + ISA_CODE, 3 );
		btBuffer[ISA_DATA+3] =ISA_END_CODE;
		::CommWrite( m_hComPort, (char*)btBuffer, 12 );
		break;
	case ISA_C5:
		btBuffer[ISA_LENGTH] = 0x03;
		btBuffer[ISA_DATA]=	m_btArea;
		*(WORD*)(btBuffer+ISA_DATA+1) =CheckSum( btBuffer + ISA_CODE, 3 );
		btBuffer[ISA_DATA+3] =ISA_END_CODE;
		::CommWrite( m_hComPort, (char*)btBuffer, 12 );
		break;

	case ISA_C3:
		btBuffer[ISA_LENGTH] = 0x03;
		btBuffer[ISA_DATA]=	m_btArea;
		*(WORD*)(btBuffer+ISA_DATA+1) =CheckSum( btBuffer + ISA_CODE, 3 );
		btBuffer[ISA_DATA+3] =ISA_END_CODE;
		::CommWrite( m_hComPort, (char*)btBuffer, 12 );
		break;

	case ISA_C6:
	{
		btBuffer[ISA_DATA]=	m_btArea;
		CString szNewValue,szValue;
		int nCount  =0;
		BYTE btCode = 0;
		CString szType="";
		WORD wValue = 0;
		g_pTable->MoveFirst();
		while( !g_pTable->IsEOF() )
		{
			g_pTable->GetFieldValue( "定值", szValue) ;
			g_pTable->GetFieldValue( "新定值", szNewValue) ;
			if (szValue !=szNewValue)
			{
				g_pTable->GetFieldValue( "代码", &btCode,DBVT_UCHAR, sizeof(BYTE)) ;
				g_pTable->GetFieldValue( "类型", szType) ;
				btBuffer[ISA_DATA+1+nCount*3]= btCode;
				if ( "数值型" == szType)
					wValue = atof(szNewValue) *100 ;
				else
					sscanf(szNewValue ,"%x",&wValue);
				btBuffer[ISA_DATA+2+nCount*3] = LOBYTE(	wValue);
				btBuffer[ISA_DATA+3+nCount*3] = HIBYTE(	wValue);
				nCount++;
			}
			g_pTable->MoveNext();
		}
		btBuffer[ISA_LENGTH] = nCount * 3 + 3;
		*(WORD*)(btBuffer+ nCount * 3 + 1 +ISA_DATA ) =CheckSum( btBuffer + ISA_CODE, nCount * 3 + 3 );
		btBuffer[nCount * 3 + 3 +ISA_DATA] =ISA_END_CODE;
		::CommWrite( m_hComPort, (char*)btBuffer, nCount * 3 + 12 );

		break;
	}
	case ISA_C7:
	{
		m_nCommand = STATE_REQ;
		SYSTEMTIME tmpTime;
		::GetLocalTime( &tmpTime );

		btBuffer[ISA_LENGTH] = 11;
		btBuffer[ISA_DATA] =GetBcd(tmpTime.wYear%100);	
		btBuffer[ISA_DATA+1] =GetBcd(tmpTime.wYear/100);
		btBuffer[ISA_DATA+2] =GetBcd(tmpTime.wMonth);
		btBuffer[ISA_DATA+3] =GetBcd(tmpTime.wDay);
		btBuffer[ISA_DATA+4] =GetBcd(tmpTime.wHour);
		btBuffer[ISA_DATA+5] =GetBcd(tmpTime.wMinute);
		btBuffer[ISA_DATA+6] =GetBcd(tmpTime.wSecond);
		btBuffer[ISA_DATA+7] =GetBcd(tmpTime.wMilliseconds%100);
		btBuffer[ISA_DATA+8] =GetBcd(tmpTime.wMilliseconds/100);
		*(WORD*)(btBuffer+ISA_DATA+9) =CheckSum( btBuffer + ISA_CODE, 11 );
		btBuffer[ISA_DATA+11] =ISA_END_CODE;
		::CommWrite( m_hComPort, (char*)btBuffer, 20 );
		break;

	}
	default:
		return;
	}
	m_btSendState = SENDING;
}

WORD CDevice::CheckSum(BYTE* pData, int nLength)
{
	WORD wResult = (WORD)0;
	for ( int i = 0; i < nLength; i++ )
		wResult += *pData++;

	return wResult;
}


void CDevice::ProcessNak(BYTE* pData, BYTE btLength)
{
	switch( m_nState )
	{
	case STATE_ACKCHANGEVALUE:
		DZHCallBack( PREM_ERR_PROTECT );
		break;

	default:
		break;
	}
}

BOOL CDevice::ProcessR1(BYTE* pData, BYTE btLength)
{
	if ( 15 != btLength )
		return FALSE;

	EVENTITEM EventItem;
	memset( &EventItem, 0, sizeof(EVENTITEM) );

	ProcessTime( pData, EventItem );
	
	EventItem.EventData.ProtData.wAddr = (WORD)m_btAddr;
	EventItem.btEvent = EVENT_PROTECT;
	//EventItem.wStation = (WORD)m_wParent;
    //add by llj to get number in system
    for ( WORD i = 0; i < ::GetStationNum(); i++ )
	{
		DBHANDLE hStation = ::FindDbHandle( 0, 0, i );
		if ( !::IsValidDbHandle( hStation ) )
			continue;
		WORD wNo;
        ::GetAttr( hStation, ATTR_ST_RTUNO, &wNo );
        if(m_wParent == wNo) 
		{
          ::GetAttr( hStation, ATTR_ST_NO, &wNo );
          EventItem.wStation = wNo;
		  break;
		}
    }


	CString szInfo = m_szName + " " + "事件信息" + " ";
	pData+=3;

	WORD wEvent = *pData;
	pData++;
	if ( !ProcessEventWord( wEvent, ISA_TYPE_ACC,  szInfo ) )
		return FALSE;

	wEvent = *pData;
	pData++;
	if ( !ProcessEventWord( wEvent, ISA_TYPE_PROT,  szInfo ) )
		return FALSE;

	wEvent = *pData;
	pData++;
	if ( !ProcessEventWord( wEvent, ISA_TYPE_ANA,  szInfo ) )
		return FALSE;
    float tttt = *(WORD*)pData;
	//float fValue = *(WORD*)pData /100.00;
	float fValue = tttt/100.00;
	char szBuffer[256];
	sprintf( szBuffer,"%s: %.2f",szInfo, fValue);
	szInfo = szBuffer;

	strncpy( EventItem.szExplain, szInfo, EVENTEXPLEN - 1 );
	EventItem.szExplain[EVENTEXPLEN - 1] = 0;
	::DoEvent( &EventItem );

	return TRUE;
}

int CDevice::SendTableMessage( int nResultCode )
{
	m_DZHParam.result.nResult = nResultCode;//PREM_OK;
	if( !m_DZHParam.pDZHTable ) 
		m_DZHParam.pDZHTable = g_pTable;

	if ( m_DZHParam.callback.hWnd != NULL )
	{			
			if ( IsWindow( m_DZHParam.callback.hWnd ) )
			{
			::SendMessage( m_DZHParam.callback.hWnd, WM_PREM_RESULT,
				(WPARAM)m_uDZHMsg, (LPARAM)&m_DZHParam );
//				AfxMessageBox("The protview message has been send!");
			}
			else
			{
//				AfxMessageBox("The protview is not a window!");
				if ( m_DZHParam.pProtectParam != NULL )
				{
					((nsIRdbTable*)(m_DZHParam.pProtectParam))->Release();
					m_DZHParam.pProtectParam = NULL;
				}
				if ( m_DZHParam.pDZHTable != NULL )
				{
						((nsIRdbTable*)(m_DZHParam.pDZHTable))->Release();
						m_DZHParam.pDZHTable = NULL;
				}
			}
	}
	else if ( m_DZHParam.callback.lpCallBack )
		m_DZHParam.callback.lpCallBack( (WPARAM)m_uDZHMsg,(LPARAM)&m_DZHParam );

	return TRUE;
}

BOOL CDevice::ProcessR2(BYTE* pData, BYTE btLength)
{
	int nCount = (btLength-3) / 3 ;
	if (nCount <=0 || NULL==g_pTable)
		return FALSE;
	g_pTable->ClearRecords();
	pData++;
	BYTE btCode ;
	for (int i = 0 ; i < nCount ; i++)
		g_pTable->AddRecord();
	g_pTable->MoveFirst();
	for (i = 0 ; i < nCount ; i++)
	{
		btCode = *pData;
		pData ++;
		
		WORD wValue = *(WORD*)pData;
		pData +=sizeof(WORD);

		if (!SetDZTable(btCode,wValue))
		{
         
        
			return FALSE;
		}
		g_pTable->MoveNext();
	}		
	if( !m_DZHParam.pDZHTable ) 
		m_DZHParam.pDZHTable = g_pTable;

	SendTableMessage(PREM_OK) ;

	return TRUE;
}

BOOL CDevice::SetDZTable(BYTE btCode,WORD wValue)
{
	nsCOMPtr<nsIRdbTable> pTable = theApp.m_pDzhTable;
	BOOL bResult = FALSE;
	pTable->MoveFirst();
	BYTE btDzhCode;
	CString szName = "";
	CString szType = "";
	CString szValue ="";
	while ( !pTable->IsEOF() )
	{
		if ( !pTable->GetFieldValue( "代码", &btDzhCode, DBVT_UCHAR, sizeof(BYTE) )) 
			break;
		if (btDzhCode == btCode)
		{

			pTable->GetFieldValue( "定值名称", szName );
			pTable->GetFieldValue( "类型", szType );

			if ("开关型"==szType)
				szValue.Format("%04x",wValue);
			else if ("数值型"==szType)
			{
				float fValue = float(wValue) / 100;
				szValue.Format("%.2f",fValue);
			}
			else
				break;
			g_pTable->SetFieldValue("代码",&btCode, DBVT_UCHAR);		
			g_pTable->SetFieldValue("定值名称",szName);		
			g_pTable->SetFieldValue("类型",szType);		
			g_pTable->SetFieldValue("定值",szValue);		
			g_pTable->SetFieldValue("新定值",szValue);		

			bResult = TRUE;
			break;
		}
		pTable->MoveNext();	
	}
	return bResult;
}

BOOL CDevice::ProcessR3(BYTE* pData, BYTE btLength)
{
    //add by llj to set protect value
    int nCount = (btLength-3) / 3 ;
	if (nCount <=0 || NULL==g_pTable)
		return FALSE;
	g_pTable->ClearRecords();
	pData++;
	BYTE btCode ;
	for (int i = 0 ; i < nCount ; i++)
		g_pTable->AddRecord();
	g_pTable->MoveFirst();
	for (i = 0 ; i < nCount ; i++)
	{
		btCode = *pData;
		pData ++;
	   /* if(btCode>169) 
		{ 
            pData +=sizeof(WORD);
			continue;	
		}
		*/
		WORD wValue = *(WORD*)pData;
		pData +=sizeof(WORD);
		if (!SetValueTable(btCode,wValue))
			return FALSE;
		g_pTable->MoveNext();
	}		

	if( !m_DZHParam.pDZHTable ) 
		m_DZHParam.pDZHTable = g_pTable;

	SendTableMessage(PREM_OK) ;

	//return TRUE;
	///////////////////
	return TRUE;
}

BOOL CDevice::ProcessR4(BYTE* pData, BYTE btLength)
{
//	if ( 13 != btLength )
//		return FALSE;

	EVENTITEM EventItem;
	memset( &EventItem, 0, sizeof(EVENTITEM) );

	ProcessTime( pData, EventItem );
	
	EventItem.EventData.ProtData.wAddr = (WORD)m_btAddr;
	EventItem.btEvent = EVENT_PROTECT;
	//EventItem.wStation = (WORD)m_wParent;
    //add by llj to get number in system
    for ( WORD i = 0; i < ::GetStationNum(); i++ )
	{
		DBHANDLE hStation = ::FindDbHandle( 0, 0, i );
		if ( !::IsValidDbHandle( hStation ) )
			continue;
		WORD wNo;
        ::GetAttr( hStation, ATTR_ST_RTUNO, &wNo );
        if(m_wParent == wNo) 
		{
          ::GetAttr( hStation, ATTR_ST_NO, &wNo );
          EventItem.wStation = wNo;
		  break;
		}
    }

	CString szInfo = m_szName + " " + "自诊断信息" + " ";
	pData+=2;
	WORD wEvent = *pData;

	if ( !ProcessEventWord( wEvent,  ISA_TYPE_DIAG, szInfo ) )
		return FALSE;
    //add by llj on 2002.5.6 to doevent
    strncpy( EventItem.szExplain, szInfo, EVENTEXPLEN - 1 );
	EventItem.szExplain[EVENTEXPLEN - 1] = 0;
	::DoEvent( &EventItem );

	//*********************
	return TRUE;
}


BOOL CDevice::ProcessR5(BYTE* pData, BYTE btLength)
{
	SendTableMessage(PREM_OK);
	return TRUE;
}



BOOL CDevice::ProcessEventWord(WORD wEvent, BYTE btType,  CString& szInfo )
{
	nsCOMPtr<nsIRdbTable> pTable;
	switch (btType)
	{
		case ISA_TYPE_ACC:
			pTable = theApp.m_pAccTable;
			break;
		case ISA_TYPE_PROT:
			pTable = theApp.m_pProtTable;
			break;
		case ISA_TYPE_ANA:
			pTable = theApp.m_pAnaTable;
			break;
		case ISA_TYPE_DIAG:
			pTable = theApp.m_pDiagTable;
			break;
		default:
			return FALSE;
	}
  //  if(wEvent == 32) 
	//{
      //szInfo = "fdaf";
	  //return true;
	//}
	BOOL bResult = FALSE;
	pTable->MoveFirst();
	BYTE btCode ;
	while ( !pTable->IsEOF() )
	{
		if ( !pTable->GetFieldValue( "代码", &btCode, DBVT_UCHAR, sizeof(BYTE) )) 
			break;
		if (wEvent == btCode)
		{
		    CString szEvent = "";
			pTable->GetFieldValue( "含义", szEvent );
					
			szInfo += szEvent;
			bResult = TRUE;
			return true;
		}
		pTable->MoveNext();
	}

	return bResult;
}

void CDevice::ProcessAcc()
{
}

void CDevice::ProcessTime(BYTE*& pData, EVENTITEM& EventItem)
{
	WORD wYear = FromBcd(  *pData)+ FromBcd(  *(pData+1))*100;
	pData+=2;
	WORD wMonth  = FromBcd(*pData++);
	WORD wDay = FromBcd(*pData++);
	WORD wHour = FromBcd(*pData++);
	WORD wMinute  = FromBcd(*pData++);
	WORD wSecond  = FromBcd(*pData++);
	CTime tmCur( wYear, wMonth, wDay, wHour, wMinute, wSecond );
	EventItem.lTime = tmCur.GetTime();
    
	EventItem.EventData.ProtData.wMilliSec = FromBcd(  *pData)+ FromBcd(  *(pData+1))*100;
	pData += sizeof(WORD);
}




BOOL CDevice::SetValueTable(BYTE btCode, WORD wValue)
{
   nsCOMPtr<nsIRdbTable> pTable = theApp.m_pAnaValueTable ;
	BOOL bResult = FALSE;
	pTable->MoveFirst();
	BYTE btDzhCode;
	CString szCode = "";

	CString szName = "";
	CString szType = "";
	CString szValue ="";
	/*
       	{SQL_SMALLINT, "代码" },	
	{SQL_VARCHAR, "名称" },
	{SQL_FLOAT,   "值"   
  */
	
	char sztemp[20] ;
	
	while ( !pTable->IsEOF() )
	{   
		//if ( !pTable->GetFieldValue( "代码", szCode )) 
		//	break;
		//char* pchar = szCode.GetBuffer(5);
		  if ( !pTable->GetFieldValue( "代码", &btDzhCode, DBVT_UCHAR, sizeof(BYTE) )) 
			break;

		if (btDzhCode == btCode)
		{
        	szCode.Format("%3d",btCode);
			pTable->GetFieldValue( "名称", szName );
			float fValue = float(wValue) / 100;
			szValue.Format("%.2f",fValue);
			
           /*
			if ("开关型"==szType)
				szValue.Format("%04x",wValue);
			else if ("数值型"==szType)
			{
				
			}
			else
				break;
				*/
			//g_pTable->SetFieldValue("代码",&btCode,DBVT_UCHAR);

			//g_pTable->SetFieldValue("代码",szCode);		
			g_pTable->SetFieldValue("名称",szName);			
			g_pTable->SetFieldValue("值",szValue);			

			bResult = TRUE;
			break;
		}
		pTable->MoveNext();	
	}
	return bResult;
}

⌨️ 快捷键说明

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