📄 device.cpp
字号:
}
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 + -