📄 nsclass.cpp
字号:
// LnkLayer DLL implementation module
// NSClass.h :
//
// This is a part of the Nice Information's source code.
// Copyright (C) 1994 Nice Information Corporation
// All rights reserved.
//
// Complier: Microsoft Visual C++ 5.00, MFC 4.2
//
// create : Doo, 1998.12.28
//
#include "stdafx.h"
#include "103.h"
#include "serial.h"
#include "manpmes.h"
#include "mandb.h"
#include "manevt.h"
#include "premapi.h"
#include "protapi.h"
#include "monitor.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern C103App theApp;
extern void FAR PASCAL EXPORT NSSockeCallBack( UINT uMsg, const char FAR* addr, PORT port, SOCKET socket );
CProtectValue::CProtectValue()
{
m_nValueType = VALUETYPE_STRING;
m_fValue = 0.0f;
m_szValue = "";
}
CProtectValue::~CProtectValue()
{
}
/////////////////////////////////////////////////////////////////////////////
// CEquipment
CEquipment::CEquipment()
{
m_szDeviceName = "";
m_pChannel = NULL;
m_nState = STATE_NONE;
m_btScn = 0;
m_bComm = TRUE;
m_bAnswer = TRUE;
m_uNoAnswer = 0;
// 2000.12.19 doo, for comm-state digital
m_wCommRtu = (WORD)-1;
m_wCommIndex = (WORD)-1;
memset( &m_LogicAddr, 0, sizeof(LOGICADDR) );
m_pValue = NULL;
memset( m_szInfo, 0, sizeof(m_szInfo) );
memset( m_btInfo, 0, sizeof(m_btInfo) );
m_uPulseTimeout = 0;
m_uPulseTimeCounter = 0;
}
CEquipment::~CEquipment()
{
ClearList();
if ( m_pValue )
{
delete[] m_pValue;
m_pValue = NULL;
}
while( !m_ListAccidentInf.IsEmpty() )
delete m_ListAccidentInf.RemoveHead();
while( !m_ListEventInf.IsEmpty() )
delete m_ListEventInf.RemoveHead();
while( !m_ListChannelInf.IsEmpty() )
delete m_ListChannelInf.RemoveHead();
while( !m_ListStateInf.IsEmpty() )
delete m_ListStateInf.RemoveHead();
while( !m_ListUnprocess.IsEmpty() )
delete (PROTEVENT*)m_ListUnprocess.RemoveHead();
}
void CEquipment::ClearList()
{
// clear the old value
while( !m_ListValue.IsEmpty() )
delete m_ListValue.RemoveHead();
}
BOOL CEquipment::IsCommFree()
{
if ( !m_bComm || !m_pChannel )
return FALSE;
if ( STATE_GI >= m_nState )
return TRUE;
return FALSE;
}
void CEquipment::OnNoAnswer( BOOL bNoAnswer )
{
// if the event switch is off
if ( 0 == ::GetPrivateProfileInt( "Settings", "Event", 0, PROTOCOL_INIFILE ) )
return ;
// don't alarm on undefined device
if ( 0 == _stricmp( m_LogicAddr.m_szName, "未定义" ) )
return ;
// 2000.12.19 doo, for comm-state digital
if ( (WORD)-1 != m_wCommRtu && (WORD)-1 != m_wCommIndex )
{
char szData[5 + sizeof(WORD) + sizeof(BYTE)], *pRaw = szData;
*(WORD*)pRaw = m_wCommRtu;
pRaw += sizeof(WORD);
*pRaw = DIGIT_RAW_DATA;
pRaw++;
*(WORD*)pRaw = sizeof(WORD) + sizeof(BYTE);
pRaw += sizeof(WORD);
*(WORD*)pRaw = (WORD)m_wCommIndex - 1;
pRaw += sizeof(WORD);
if ( bNoAnswer )
{
m_bAnswer = FALSE;
*(BYTE*)pRaw = 0;
}
else
{
m_bAnswer = TRUE;
*(BYTE*)pRaw = 1;
}
::WriteRdbData( szData );
}
else
{
EVENTITEM EventItem;
memset( &EventItem, 0, sizeof( EVENTITEM ) );
EventItem.lTime = time( NULL );
EventItem.btEvent = EVENT_EXPLAIN;
CString szInfo = m_LogicAddr.m_szName;
if ( bNoAnswer )
{
m_bAnswer = FALSE;
szInfo += "通讯无响应";
}
else
{
m_bAnswer = TRUE;
szInfo += "通讯恢复响应";
}
strncpy( EventItem.szExplain, szInfo, EVENTEXPLEN );
::DoEvent( &EventItem );
}
}
void CEquipment::OnCommError()
{
// if the event switch is off
if ( 0 == ::GetPrivateProfileInt( "Settings", "Event", 0, PROTOCOL_INIFILE ) )
return ;
// don't alarm on undefined device
if ( 0 == _stricmp( m_LogicAddr.m_szName, "未定义" ) )
return ;
// 2000.12.19 doo, for comm-state digital
if ( (WORD)-1 != m_wCommRtu && (WORD)-1 != m_wCommIndex )
{
char szData[5 + sizeof(WORD) + sizeof(BYTE)], *pRaw = szData;
*(WORD*)pRaw = m_wCommRtu;
pRaw += sizeof(WORD);
*pRaw = DIGIT_RAW_DATA;
pRaw++;
*(WORD*)pRaw = sizeof(WORD) + sizeof(BYTE);
pRaw += sizeof(WORD);
*(WORD*)pRaw = (WORD)m_wCommIndex - 1;
pRaw += sizeof(WORD);
*(BYTE*)pRaw = 0;
::WriteRdbData( szData );
}
else
{
EVENTITEM EventItem;
memset( &EventItem, 0, sizeof( EVENTITEM ) );
EventItem.lTime = time( NULL );
EventItem.btEvent = EVENT_EXPLAIN;
// if no this logic addr.
if ( 0 == m_LogicAddr.m_btAddrLgc )
return ;
CString szInfo = m_LogicAddr.m_szName;
szInfo += "通道中断";
strncpy( EventItem.szExplain, szInfo, EVENTEXPLEN );
::DoEvent( &EventItem );
}
}
void CEquipment::OnCommOK()
{
// if the event switch is off
if ( 0 == ::GetPrivateProfileInt( "Settings", "Event", 0, PROTOCOL_INIFILE ) )
return ;
// don't alarm on undefined device
if ( 0 == _stricmp( m_LogicAddr.m_szName, "未定义" ) )
return ;
// 2000.12.19 doo, for comm-state digital
if ( (WORD)-1 != m_wCommRtu && (WORD)-1 != m_wCommIndex )
{
char szData[5 + sizeof(WORD) + sizeof(BYTE)], *pRaw = szData;
*(WORD*)pRaw = m_wCommRtu;
pRaw += sizeof(WORD);
*pRaw = DIGIT_RAW_DATA;
pRaw++;
*(WORD*)pRaw = sizeof(WORD) + sizeof(BYTE);
pRaw += sizeof(WORD);
*(WORD*)pRaw = (WORD)m_wCommIndex - 1;
pRaw += sizeof(WORD);
*(BYTE*)pRaw = 1;
::WriteRdbData( szData );
}
else
{
EVENTITEM EventItem;
memset( &EventItem, 0, sizeof( EVENTITEM ) );
EventItem.lTime = time( NULL );
EventItem.btEvent = EVENT_EXPLAIN;
// if no this logic addr.
if ( 0 == m_LogicAddr.m_btAddrLgc )
return ;
CString szInfo = m_LogicAddr.m_szName;
szInfo += "通道恢复";
strncpy( EventItem.szExplain, szInfo, EVENTEXPLEN );
::DoEvent( &EventItem );
}
}
void CEquipment::GetSyncTime( BYTE* pData )
{
// see 7.2.6.29
SYSTEMTIME SystemTime;
::GetLocalTime( &SystemTime );
// milliseconds
*(WORD*)pData = SystemTime.wSecond * 1000 + SystemTime.wMilliseconds;
pData += sizeof(WORD);
// minute
*pData = (BYTE)SystemTime.wMinute;
pData++;
// hour
*pData = (BYTE)SystemTime.wHour;
pData++;
// day of week, monday = 1, ..., sunday = 7
if ( 0 == SystemTime.wDayOfWeek )
*pData = 7;
else
*pData = (BYTE)SystemTime.wDayOfWeek;
*pData = *pData << 5;
// day of month
*pData += SystemTime.wDay;
pData++;
// month
*pData = (BYTE)SystemTime.wMonth;
pData++;
// year
*pData = SystemTime.wYear % 100;
pData++;
}
void CEquipment::ProcessTime( PROTEVENT& ProtEvent, BYTE* pData )
{
SYSTEMTIME SystemTime;
::GetLocalTime( &SystemTime );
ProtEvent.evt_year = SystemTime.wYear - 1900;
ProtEvent.evt_mon = SystemTime.wMonth;
ProtEvent.evt_day = SystemTime.wDay;
ProtEvent.evt_hour = pData[3] & 0x1f;
ProtEvent.evt_min = pData[2] & 0x3f;
ProtEvent.evt_sec = *(WORD*)pData / 1000;
ProtEvent.evt_ms = *(WORD*)pData % 1000;
}
void CEquipment::ProcessRelativeTime( PROTEVENT& ProtEvent, BYTE* pData )
{
ProtEvent.evt_startms = *(WORD*)pData;
}
short CEquipment::ProcessMEA( BYTE* pData )
{
short sValue = *(short*)pData;
if ( sValue & 0xC000 )
sValue = 0;
else
if ( sValue & 0x1000 )
sValue = -( sValue & 0x0FFF );
else
sValue = sValue & 0x0FFF;
return sValue;
}
int CEquipment::ProcessSend()
{
// if the socket is connected
if ( !m_pChannel )
return PREM_ERR_COMOPEN;
// reset the counter
m_uTaskTimeCounter = 0;
// the equipment ack the command
switch( m_nState )
{
case STATE_VERSION:
{
BYTE szASDU[ASDU_20_SIZE];
szASDU[ASDUHEAD_TYP] = ASDU_20;
szASDU[ASDUHEAD_VSQ] = 0x81;
szASDU[ASDUHEAD_COT] = COT_START;
szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
szASDU[ASDUHEAD_FUN] = 254;
szASDU[ASDUHEAD_INF] = 4;
szASDU[ASDUHEAD_DAT] = 1;
szASDU[ASDUHEAD_DAT + 1] = m_btScn;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_20_SIZE );
}
break;
case STATE_TIMESYNC:
{
BYTE szASDU[ASDU_6_SIZE];
szASDU[ASDUHEAD_TYP] = ASDU_6;
szASDU[ASDUHEAD_VSQ] = 0x81;
szASDU[ASDUHEAD_COT] = COT_TIME;
szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
szASDU[ASDUHEAD_FUN] = 254;
szASDU[ASDUHEAD_INF] = 0;
GetSyncTime( szASDU + ASDUHEAD_DAT );
m_pChannel->ProcessSend( (char*)szASDU, ASDU_6_SIZE );
}
break;
case STATE_GI:
{
BYTE szASDU[ASDU_7_SIZE];
szASDU[ASDUHEAD_TYP] = ASDU_7;
szASDU[ASDUHEAD_VSQ] = 0x81;
szASDU[ASDUHEAD_COT] = COT_GI;
szASDU[ASDUHEAD_ADR] = m_LogicAddr.m_btAddrLgc;
szASDU[ASDUHEAD_FUN] = 254;
szASDU[ASDUHEAD_INF] = 0;
szASDU[ASDUHEAD_DAT] = m_btScn++;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_7_SIZE );
}
break;
case STATE_ACCIDENTINF:
{
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_EVT1;
szASDU[ASDUHEAD_DAT + 3] = 0x00;
// KOD
szASDU[ASDUHEAD_DAT + 4] = KOD_DESCRIPTION;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
}
break;
case STATE_EVENTINF:
{
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_EVT2;
szASDU[ASDUHEAD_DAT + 3] = 0x00;
// KOD
szASDU[ASDUHEAD_DAT + 4] = KOD_DESCRIPTION;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
}
break;
case STATE_CHANNELINF:
{
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_CHL;
szASDU[ASDUHEAD_DAT + 3] = 0x00;
// KOD
szASDU[ASDUHEAD_DAT + 4] = KOD_DESCRIPTION;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
}
break;
case STATE_STATEINF:
{
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_STA;
szASDU[ASDUHEAD_DAT + 3] = 0x00;
// KOD
szASDU[ASDUHEAD_DAT + 4] = KOD_DESCRIPTION;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
}
break;
case STATE_RESET:
{
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] = 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_SIGRST;
// 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] = 1;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_10_SIZE );
}
break;
case STATE_FREEZEPULSE:
{
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] = 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] = 1;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_10_SIZE );
}
break;
case STATE_CALLPULSE:
{
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_PUL;
szASDU[ASDUHEAD_DAT + 3] = 0x00;
// KOD
szASDU[ASDUHEAD_DAT + 4] = KOD_VALUE;
m_pChannel->ProcessSend( (char*)szASDU, ASDU_21_SIZE );
}
break;
case STATE_FREEPULSE:
{
BYTE szASDU[ASDU_10_SIZE];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -