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