#include "stdafx.h" #include "kernel.h" #include "resource.h" #include "Client2SrvType.h" //---------------------------------------------- CBaseVar ---------- IMPLEMENT_SERIAL(CBaseVar, CObject, 0) CBaseVar::CBaseVar():CObject() { m_strVarUID = _T(""); m_strName = _T(""); m_strDesc = _T(""); m_strSetValue = _T(""); m_strUnit = _T(""); m_strOnDesc = _T("On"); m_strOffDesc = _T("Off"); m_strRelatePage = _T(""); m_strFields = _T("public"); m_strSnmpOid = _T(""); m_strRs232Cmd = _T(""); m_strRs232Type = _T(""); m_nVarID = 0; m_nVarChildID = 0; m_nVarItemID = 0; m_nVarTypeID = 0; m_nDevID = 0; m_nMinValues = 0; m_nMaxValues = 0; m_nMaxConvtRate = 0; m_nMinConvtRate = 0; m_nUpperLimit = 0; m_nLowerLimit = 0; m_nNormalState = 0; m_nCollectFreq = 0; m_nRearm = 0; m_nOffset = 0; //m_nCoefficient = 0; m_nFuncCode = 0; m_nRegStartAddr = 0; m_nRegNum = 0; m_nDataLen = 0; m_nWaringLevel = 0; m_nPurview = 0; m_nRs232Index = 0; m_bIsSave = FALSE; m_bRealtimeFlag = FALSE; m_bIsDDE = FALSE; m_bRecCurve = FALSE; //=============================================== // 新增成员变量 in 2010-04-07 m_fCoef = 0.0; m_nIdentifyTime = 0; m_nRedetectTime = 0; m_bIsNormalAlarm = FALSE; m_nStartBit = 0; m_nEndBit = 0; m_strReserved1 = _T(""); m_strReserved2 = _T(""); m_strReserved3 = _T(""); m_strReserved4 = _T(""); m_strReserved5 = _T(""); m_strReserved6 = _T(""); m_strReserved7 = _T(""); m_strReserved8 = _T(""); m_strReserved9 = _T(""); m_strReserved10 = _T(""); m_nReserved1 = 0; m_nReserved2 = 0; m_nReserved3 = 0; m_nReserved4 = 0; m_nReserved5 = 0; m_nReserved6 = 0; m_nReserved7 = 0; m_nReserved8 = 0; m_nReserved9 = 0; m_nReserved10 = 0; m_bReserved1 = FALSE; m_bReserved2 = FALSE; m_bReserved3 = FALSE; m_bReserved4 = FALSE; m_bReserved5 = FALSE; m_bReserved6 = FALSE; m_bReserved7 = FALSE; m_bReserved8 = FALSE; m_bReserved9 = FALSE; m_bReserved10 = FALSE; } CBaseVar &CBaseVar::operator=(CBaseVar& member) { m_strVarUID = member.m_strVarUID; m_strName = member.m_strName; m_strDesc = member.m_strDesc; m_strSetValue = member.m_strSetValue; m_strUnit = member.m_strUnit; m_strOnDesc = member.m_strOnDesc; m_strOffDesc = member.m_strOffDesc; m_strRelatePage = member.m_strRelatePage; m_strFields = member.m_strFields; m_strSnmpOid = member.m_strSnmpOid; m_nVarID = member.m_nVarID; m_nVarChildID = member.m_nVarChildID; m_nVarItemID = member.m_nVarItemID; m_nVarTypeID = member.m_nVarTypeID; m_nDevID = member.m_nDevID; m_nMinValues = member.m_nMinValues; m_nMaxValues = member.m_nMaxValues; m_nMaxConvtRate = member.m_nMaxConvtRate; m_nMinConvtRate = member.m_nMinConvtRate; //m_nCoefficient = member.m_nCoefficient; m_nUpperLimit = member.m_nUpperLimit; m_nLowerLimit = member.m_nLowerLimit; m_nNormalState = member.m_nNormalState; m_nCollectFreq = member.m_nCollectFreq; m_nRearm = member.m_nRearm; m_nOffset = member.m_nOffset; m_nFuncCode = member.m_nFuncCode; m_nRegStartAddr = member.m_nRegStartAddr; m_nRegNum = member.m_nRegNum; m_nDataLen = member.m_nDataLen; m_nWaringLevel = member.m_nWaringLevel; m_nPurview = member.m_nPurview; m_bIsDDE = member.m_bIsDDE; m_bRecCurve = member.m_bRecCurve; m_bIsSave = member.m_bIsSave; m_bRealtimeFlag = member.m_bRealtimeFlag; m_strRs232Cmd = member.m_strRs232Cmd; m_strRs232Type = member.m_strRs232Type; m_nRs232Index = member.m_nRs232Index; //=============================================== // 新增成员变量 in 2010-04-07 m_fCoef = member.m_fCoef; m_nIdentifyTime = member.m_nIdentifyTime; m_nRedetectTime = member.m_nRedetectTime; m_bIsNormalAlarm = member.m_bIsNormalAlarm; m_nStartBit = member.m_nStartBit; m_nEndBit = member.m_nEndBit; m_nStatusListNum = member.m_nStatusListNum; list::iterator it_status_id; int nStatusID; for( it_status_id = member.m_listStatusID.begin(); it_status_id != member.m_listStatusID.end(); ) { nStatusID = *(it_status_id++); m_listStatusID.insert(m_listStatusID.end(), nStatusID); } list::iterator it_status_desc; CString strStatusDesc; for( it_status_desc = member.m_listStatusDesc.begin(); it_status_desc != member.m_listStatusDesc.end(); ) { strStatusDesc = *(it_status_desc++); m_listStatusDesc.insert(m_listStatusDesc.end(), strStatusDesc); } m_strReserved1 = member.m_strReserved1; m_strReserved2 = member.m_strReserved2; m_strReserved3 = member.m_strReserved3; m_strReserved4 = member.m_strReserved4; m_strReserved5 = member.m_strReserved5; m_strReserved6 = member.m_strReserved6; m_strReserved7 = member.m_strReserved7; m_strReserved8 = member.m_strReserved8; m_strReserved9 = member.m_strReserved9; m_strReserved10 = member.m_strReserved10; m_nReserved1 = member.m_nReserved1; m_nReserved2 = member.m_nReserved2; m_nReserved3 = member.m_nReserved3; m_nReserved4 = member.m_nReserved4; m_nReserved5 = member.m_nReserved5; m_nReserved6 = member.m_nReserved6; m_nReserved7 = member.m_nReserved7; m_nReserved8 = member.m_nReserved8; m_nReserved9 = member.m_nReserved9; m_nReserved10 = member.m_nReserved10; m_bReserved1 = member.m_bReserved1; m_bReserved2 = member.m_bReserved2; m_bReserved3 = member.m_bReserved3; m_bReserved4 = member.m_bReserved4; m_bReserved5 = member.m_bReserved5; m_bReserved6 = member.m_bReserved6; m_bReserved7 = member.m_bReserved7; m_bReserved8 = member.m_bReserved8; m_bReserved9 = member.m_bReserved9; m_bReserved10 = member.m_bReserved10; return *this; } void CBaseVar::Serialize(CArchive& ar) { CObject::Serialize(ar); if(ar.IsStoring()) { ar << m_strVarUID; ar << m_strName; ar << m_strDesc; ar << m_strSetValue; ar << m_strUnit; ar << m_strOnDesc; ar << m_strOffDesc; ar << m_strRelatePage; ar << m_strFields; ar << m_strSnmpOid; ar << m_nVarID; ar << m_nVarChildID; ar << m_nVarItemID; ar << m_nVarTypeID; ar << m_nDevID; ar << m_nMinValues; ar << m_nMaxValues; ar << m_nMaxConvtRate; ar << m_nMinConvtRate; //ar << m_nCoefficient; ar << m_nUpperLimit; ar << m_nLowerLimit; ar << m_nNormalState; ar << m_nCollectFreq; ar << m_nRearm; ar << m_nOffset; ar << m_nFuncCode; ar << m_nRegStartAddr; ar << m_nRegNum; ar << m_nDataLen; ar << m_nWaringLevel; ar << m_nPurview; ar << m_bIsDDE; ar << m_bRecCurve; ar << m_bIsSave; ar << m_bRealtimeFlag; ar << m_strRs232Cmd; ar << m_strRs232Type; ar << m_nRs232Index; //=============================================== // 新增成员变量 in 2010-04-07 ar << m_fCoef; ar << m_nIdentifyTime; ar << m_nRedetectTime; ar << m_bIsNormalAlarm; ar << m_nStartBit; ar << m_nEndBit; m_nStatusListNum = m_listStatusID.size(); ar << m_nStatusListNum; list::iterator it_status_id; int nStatusID; for( it_status_id = m_listStatusID.begin(); it_status_id != m_listStatusID.end(); ) { nStatusID = *(it_status_id++); ar << nStatusID; } list::iterator it_status_desc; CString strStatusDesc; for( it_status_desc = m_listStatusDesc.begin(); it_status_desc != m_listStatusDesc.end(); ) { strStatusDesc = *(it_status_desc++); ar << strStatusDesc; } //ar << m_listEndBit; //ar << m_listStatusID; //ar << m_listStatusDesc; ar << m_strReserved1; ar << m_strReserved2; ar << m_strReserved3; ar << m_strReserved4; ar << m_strReserved5; ar << m_strReserved6; ar << m_strReserved7; ar << m_strReserved8; ar << m_strReserved9; ar << m_strReserved10; ar << m_nReserved1; ar << m_nReserved2; ar << m_nReserved3; ar << m_nReserved4; ar << m_nReserved5; ar << m_nReserved6; ar << m_nReserved7; ar << m_nReserved8; ar << m_nReserved9; ar << m_nReserved10; ar << m_bReserved1; ar << m_bReserved2; ar << m_bReserved3; ar << m_bReserved4; ar << m_bReserved5; ar << m_bReserved6; ar << m_bReserved7; ar << m_bReserved8; ar << m_bReserved9; ar << m_bReserved10; } else { ar >> m_strVarUID; ar >> m_strName; ar >> m_strDesc; ar >> m_strSetValue; ar >> m_strUnit; ar >> m_strOnDesc; ar >> m_strOffDesc; ar >> m_strRelatePage; ar >> m_strFields; ar >> m_strSnmpOid; ar >> m_nVarID; ar >> m_nVarChildID; ar >> m_nVarItemID; ar >> m_nVarTypeID; ar >> m_nDevID; ar >> m_nMinValues; ar >> m_nMaxValues; ar >> m_nMaxConvtRate; ar >> m_nMinConvtRate; //ar >> m_nCoefficient; ar >> m_nUpperLimit; ar >> m_nLowerLimit; ar >> m_nNormalState; ar >> m_nCollectFreq; ar >> m_nRearm; ar >> m_nOffset; ar >> m_nFuncCode; ar >> m_nRegStartAddr; ar >> m_nRegNum; ar >> m_nDataLen; ar >> m_nWaringLevel; ar >> m_nPurview; ar >> m_bIsDDE; ar >> m_bRecCurve; ar >> m_bIsSave; ar >> m_bRealtimeFlag; ar >> m_strRs232Cmd; ar >> m_strRs232Type; ar >> m_nRs232Index; #if IS_NEW_VERSION //=============================================== // 新增成员变量 in 2010-04-07 ar >> m_fCoef; ar >> m_nIdentifyTime; ar >> m_nRedetectTime; ar >> m_bIsNormalAlarm; ar >> m_nStartBit; ar >> m_nEndBit; ar >> m_nStatusListNum; int nStatusID; CString strStatusDesc; for( int i = 0; i < m_nStatusListNum; i++ ) { ar >> nStatusID; m_listStatusID.insert(m_listStatusID.end(), nStatusID); } for( int i = 0; i < m_nStatusListNum; i++ ) { ar >> strStatusDesc; m_listStatusDesc.insert(m_listStatusDesc.end(), strStatusDesc); } ar >> m_strReserved1; ar >> m_strReserved2; ar >> m_strReserved3; ar >> m_strReserved4; ar >> m_strReserved5; ar >> m_strReserved6; ar >> m_strReserved7; ar >> m_strReserved8; ar >> m_strReserved9; ar >> m_strReserved10; ar >> m_nReserved1; ar >> m_nReserved2; ar >> m_nReserved3; ar >> m_nReserved4; ar >> m_nReserved5; ar >> m_nReserved6; ar >> m_nReserved7; ar >> m_nReserved8; ar >> m_nReserved9; ar >> m_nReserved10; ar >> m_bReserved1; ar >> m_bReserved2; ar >> m_bReserved3; ar >> m_bReserved4; ar >> m_bReserved5; ar >> m_bReserved6; ar >> m_bReserved7; ar >> m_bReserved8; ar >> m_bReserved9; ar >> m_bReserved10; #endif } } //---------------------------------------------- CAnalog ---------- IMPLEMENT_SERIAL(CAnalog, CBaseVar, 0) CAnalog::CAnalog():CBaseVar() { m_bSave = FALSE; addr = NULL; m_nMonth = 1; m_nDay = 1; m_nMinCount = 0; m_nMinutes = 0; m_fDayMax = 0; m_fDayAvg = 0; m_fDayMin = 9999; m_fData = -1; bConfirm = false; } CAnalog &CAnalog::operator=(CAnalog& analog) { *(CBaseVar*)this = *((CBaseVar*)&analog); return *this; } void CAnalog::Serialize(CArchive& ar) { CBaseVar::Serialize(ar); if(ar.IsStoring()) { ar << m_bSave; ar << m_fData; ar << m_nMonth; ar << m_nDay; ar << m_nMinCount; ar << m_fDayMax; ar << m_fDayAvg; ar << m_fDayMin; } else { ar >> m_bSave; ar >> m_fData; ar >> m_nMonth; ar >> m_nDay; ar >> m_nMinCount; ar >> m_fDayMax; ar >> m_fDayAvg; ar >> m_fDayMin; } } unsigned int CAnalog::CalcCheckSum( void *pData, unsigned int nSize ) { unsigned int checksum = 0; if ( nSize <= sizeof( ProtocolHeader ) ) { return 0; } unsigned char *pBody = &( ( unsigned char* )pData )[ sizeof( ProtocolHeader ) ]; nSize -= sizeof( ProtocolHeader ); checksum = crc32( 0, pBody, nSize ); return checksum; } // 获取特殊处理变量 void CAnalog::GetSpecialVarContent() { if( !pDevicesManager->m_SocketClient.IsOpen() ) { return; } CBaseVar *pBaseVar = (CBaseVar *)this; ReadSingleSpecialVarData tagReadSingleSpecialVarData; int nLen = sizeof(ReadSingleSpecialVarData); memset( &tagReadSingleSpecialVarData, 0, nLen ); tagReadSingleSpecialVarData.Header.nLen = nLen; tagReadSingleSpecialVarData.Header.nCmd = CMD_READ_SPECIAL_SINGLE_VAR_DATA; tagReadSingleSpecialVarData.Header.nCmdType = 0; strcpy( (char *)tagReadSingleSpecialVarData.DevUid, (char *)(LPCTSTR)pBaseVar->m_strVarUID ); tagReadSingleSpecialVarData.iVarid = pBaseVar->m_nVarID; tagReadSingleSpecialVarData.iSpecialFlag = pBaseVar->m_nVarTypeID; tagReadSingleSpecialVarData.Header.Verify = CalcCheckSum( &tagReadSingleSpecialVarData, nLen ); USES_CONVERSION; pDevicesManager->m_SocketClient.Write((const LPBYTE)&tagReadSingleSpecialVarData, nLen, NULL); //TRACE1( "读求特殊变量ID = %d \r\n", tagReadSingleSpecialVarData.iVarid ); } void CAnalog::GetVarContent() { //请求服务器得到变量的内容和报警状态 if( !pDevicesManager->m_SocketClient.IsOpen() ) return; CBaseVar *pBaseVar = (CBaseVar *)this; if( pBaseVar->m_nVarTypeID == 1000 ) // 内存变量,现在只用来处理设备在线状态 { DevOnline tagDevOnline; int nLen = sizeof(DevOnline); memset( &tagDevOnline, 0, nLen ); tagDevOnline.Header.nLen = nLen; tagDevOnline.Header.nCmd = CMD_DEV_ONLINE; tagDevOnline.Header.nCmdType = 0; tagDevOnline.nVarID = pBaseVar->m_nVarID; strcpy((char *)tagDevOnline.DevUid, (char *)(LPCTSTR)pBaseVar->m_strVarUID); tagDevOnline.Header.Verify = CalcCheckSum( &tagDevOnline, nLen ); USES_CONVERSION; pDevicesManager->m_SocketClient.Write((const LPBYTE)&tagDevOnline, nLen, NULL); } else // I/O变量 { // 请求变量在线状态,只有采集设备才会用到 if( this->m_pDevice->m_nIsCollectDev == 1 ) { // 暂不做处理 } ReadSingleVarData tagReadSingleVarData; int nLen = sizeof(ReadSingleVarData); memset( &tagReadSingleVarData, 0, nLen ); tagReadSingleVarData.Header.nLen = nLen; tagReadSingleVarData.Header.nCmd = CMD_READ_SINGLE_VAR_DATA; tagReadSingleVarData.Header.nCmdType = 0; strcpy( (char *)tagReadSingleVarData.DevUid, (char *)(LPCTSTR)pBaseVar->m_strVarUID ); tagReadSingleVarData.nVarID = pBaseVar->m_nVarID; TRACE1( "读求变量ID = %d \r\n", tagReadSingleVarData.nVarID ); tagReadSingleVarData.Header.Verify = CalcCheckSum( &tagReadSingleVarData, nLen ); USES_CONVERSION; pDevicesManager->m_SocketClient.Write((const LPBYTE)&tagReadSingleVarData, nLen, NULL); } } void CAnalog::SetValue(float fValue) { if( !pDevicesManager->m_SocketClient.IsOpen() ) return; CBaseVar *pBaseVar = (CBaseVar *)this; WrSingleVarData tagWrSingleVarData; int nLen = sizeof(WrSingleVarData); memset( &tagWrSingleVarData, 0, nLen ); tagWrSingleVarData.Header.nLen = nLen; tagWrSingleVarData.Header.nCmd = CMD_WRITE_SINGLE_VAR_DATA; tagWrSingleVarData.Header.nCmdType = 0; memcpy( &tagWrSingleVarData.DevUid, (char *)(LPCTSTR)pBaseVar->m_strVarUID, sizeof(tagWrSingleVarData.DevUid) ); tagWrSingleVarData.VarData.nVarID = pBaseVar->m_nVarID; tagWrSingleVarData.VarData.Data = (DOUBLE)fValue; tagWrSingleVarData.Header.Verify = CalcCheckSum( &tagWrSingleVarData, nLen ); USES_CONVERSION; pDevicesManager->m_SocketClient.Write((const LPBYTE)&tagWrSingleVarData, nLen, NULL); m_fData = fValue; } void CAnalog::Fresh() { // 特殊处理变量单独处理 if( m_nVarTypeID >= SPECIAL_VAR_TYPE_MIN_ID && m_nVarTypeID <= SPECIAL_VAR_TYPE_MAX_ID ) { GetSpecialVarContent(); } else { // 得到变量值和报警状态 GetVarContent(); } }