// RtuProcess.cpp: implementation of the CRtuProcess class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "rtugprs.h"
#include "RtuProcess.h"
#include "DataType.h"
#include "MainFrm.h"
#include "Tools.h"
#include "PaintView.h"
#include "SQLMng.h"
//#include <afxsock.h>
#include "CVsp.h"
#include "WellClass.h"
#include "CanSock.h"
#include "TcpServer.h"
//#include "cstringt.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRtuProcess::CRtuProcess(CWnd *pWnd)
{
m_CJSJ=0;
m_pParent=pWnd;
m_nRtuID=0;
//*********************************包类型初始化******************************************
m_pRTUStaticInfo=NULL;
m_pRtuRunCnt=NULL;
m_pCardPacket=NULL;
m_pRealData=NULL;
m_pDynInfo=NULL;
m_pElecPack=NULL;
m_nDeviceCnt=NULL;
m_nDeviceByte=NULL;
m_nByteCnt=NULL;
m_bSendConf=FALSE;
m_nRealCnt=0;
m_nStaticCnt=0;
m_nDynCnt=0;
m_nRunCnt=0;
m_nCardCnt=0;
m_nElecCnt=0;
memset(m_pWellTime,0,sizeof(m_pWellTime));
memset(m_sBuf,0,sizeof(m_sBuf));
ZeroMemory(m_sBufUpData,sizeof(m_sBufUpData));
m_nUpData=0;
for (int i=0;i<4;i++)
{
m_pWellCalss[i]=NULL;
}
// memset(m_Device,0,sizeof(m_Device));
}
CRtuProcess::~CRtuProcess()
{
int i;
for (i=0;i<4;i++)
{
if (m_pWellCalss[i]!=NULL)
{
delete m_pWellCalss[i];
m_pWellCalss[i]=NULL;
}
}
if (m_pRTUStaticInfo!=NULL)
{
for(i=0;i<MAXBYTE;i++)
{
if (m_pRTUStaticInfo->ArrayGTBaseInfo[i]!=NULL)
{
delete [] m_pRTUStaticInfo->ArrayGTBaseInfo[i];
m_pRTUStaticInfo->ArrayGTBaseInfo[i]=NULL;
}
}
delete m_pRTUStaticInfo;
m_pRTUStaticInfo=NULL;
}
if (m_pRtuRunCnt!=NULL)
{
for(i=0;i<MAXBYTE;i++)
{
if(m_pRtuRunCnt->ArrayEquipStatue[i]!=NULL)
{
delete m_pRtuRunCnt->ArrayEquipStatue[i];
m_pRtuRunCnt->ArrayEquipStatue[i]=NULL;
}
}
delete m_pRtuRunCnt;
m_pRtuRunCnt=NULL;
}
if (m_pCardPacket!=NULL)
{
delete m_pCardPacket;
m_pCardPacket=NULL;
}
if (m_pDynInfo!=NULL)
{
for(i=0;i<4;i++)
{
if(m_pDynInfo->DynConf.ArraryWellConf[i]!=NULL)
{
delete m_pDynInfo->DynConf.ArraryWellConf[i];
m_pDynInfo->DynConf.ArraryWellConf[i]=NULL;
}
}
for(i=0;i<4;i++)
{
if(m_pDynInfo->DeviceMapping.ArrayWell[i]!=NULL)
{
for(int j=0;j<8;j++)
{
if (m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]!=NULL)
{
delete m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j];
m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]=NULL;
}
}
// m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]
delete m_pDynInfo->DeviceMapping.ArrayWell[i];
m_pDynInfo->DeviceMapping.ArrayWell[i]=NULL;
}
}
delete m_pDynInfo;
m_pDynInfo=NULL;
}
if (m_pRealData!=NULL)
{
delete m_pRealData;
m_pRealData=NULL;
}
if (m_pElecPack!=NULL)
{
delete m_pElecPack;
m_pElecPack=NULL;
}
for(i=0;i<4;i++)
{
if (m_pWellTime[i]!=NULL)
{
delete m_pWellTime[i];
m_pWellTime[i]=NULL;
}
}
}
void CRtuProcess::AcceptData(char *buf,int nLen)
{
/* if(m_pDynInfo!=NULL)
{
if(m_pDynInfo->uPacketType!=0xB1)
{
m_pDynInfo=NULL;
memset(m_pWellCalss,0,sizeof(m_pWellCalss));
}
}*/
int nSer=sizeof(sockaddr_in);
memcpy((char *)&m_Server,buf,nSer);
CMainFrame *pMain=(CMainFrame *)m_pParent;
if (m_bSendConf==TRUE)
{
pMain->ResposeConf(buf+4+nSer,m_nDynConf+2,m_Server,0x10,m_bufDynConf);
}
/* if (m_sBuf!="")
{
if (MAKEWORD(*(buf+nLen-1),*(buf+nLen-2))==MAKEWORD(*(m_sBuf+m_nBuf-1),*(m_sBuf+m_nBuf-2)))
{
return ;
}
}
*/
int i=0;
m_nRtuID=CTools::CharToInt((unsigned char *)buf+4+nSer,8);
memset(m_sBuf,0,sizeof(m_sBuf));
memcpy(m_sBuf,buf+nSer,nLen);
m_nBuf=nLen;
BYTE a=m_sBuf[0];
//****************************升级程序*************************
if (a!=0xE0 && m_nUpData!=NULL)
{
((CMainFrame *)m_pParent)->m_pSock->Send((unsigned char *)m_sBufUpData,m_nUpData,m_Server);
}
//*************************************************************
if (a!=RTU_PACKTYPE_STATICINFO && m_pRTUStaticInfo==NULL)
{
((CMainFrame *)m_pParent)->Response(m_sBuf+4,0,m_Server,0x02);
return;
}
if (m_pRTUStaticInfo!=NULL)
{
if (a!=RTU_PACKTYPE_DYNINFO && m_pDynInfo==NULL)
{
((CMainFrame *)m_pParent)->Response(m_sBuf+4,0,m_Server,0x20);
return;
}
}
switch(a)
{
case RTU_PACKTYPE_EXTENSION:
break;
case RTU_PACKTYPE_STATICINFO:
m_nStaticCnt++;
if(AnalysisStaticInfo()==FALSE)
{
/* if (m_pRTUStaticInfo!=NULL)
{
for(i=0;i<MAXBYTE;i++)
{
if (m_pRTUStaticInfo->ArrayGTBaseInfo[i]!=NULL)
{
delete [] m_pRTUStaticInfo->ArrayGTBaseInfo[i];
m_pRTUStaticInfo->ArrayGTBaseInfo[i]=NULL;
}
}
delete m_pRTUStaticInfo;
m_pRTUStaticInfo=NULL;
}*/
;
}
break;
case RTU_PACKTYPE_DYNINFO:
m_nDynCnt++;
if(AnalysisDynInfo()==FALSE)
{
if (m_pDynInfo!=NULL)
{
for(i=0;i<4;i++)
{
if(m_pDynInfo->DynConf.ArraryWellConf[i]!=NULL)
{
delete m_pDynInfo->DynConf.ArraryWellConf[i];
m_pDynInfo->DynConf.ArraryWellConf[i]=NULL;
}
}
for(i=0;i<4;i++)
{
if(m_pDynInfo->DeviceMapping.ArrayWell[i]!=NULL)
{
for(int j=0;j<8;j++)
{
if (m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]!=NULL)
{
delete m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j];
m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]=NULL;
}
}
// m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]
delete m_pDynInfo->DeviceMapping.ArrayWell[i];
m_pDynInfo->DeviceMapping.ArrayWell[i]=NULL;
}
}
delete m_pDynInfo;
m_pDynInfo=NULL;
}
}
// a=1000;
break;
case RTU_PACKTYPE_RESPONSE:
break;
case RTU_PACKTYPE_LONGDATA:
AnalysisUpdata();
break;
case RTU_PACKTYPE_RUNCNT:
m_nRunCnt++;
AnalysisRunCnt();
break;
case RTU_PACKTYPE_TESTDATA:
m_nRealCnt++;
AnalysisRealData();
break;
case RTU_PACKTYPE_CARD:
m_nCardCnt++;
AnalysisCardsPacket();
break;
case RTU_PACKTYPE_ELECPARA:
m_nElecCnt++;
AnalysisElecPacket();
break;
case RTU_PACKTYPE_SCREW:
break;
case RTU_PACKTYPE_INJECTION:
break;
default:
break;
}
return;
}
BOOL CRtuProcess::AnalysisStaticInfo()
{
//**************************解析*****************************************
CString msg="";
CString hexTostr="";
char *pData=(char*)m_sBuf;
int nTolStatic=0;
if (m_pRTUStaticInfo==NULL)
{
m_pRTUStaticInfo=new CRTUStaticInfo;
memset(m_pRTUStaticInfo,0,sizeof(CRTUStaticInfo));
}
CTools::WriteLog("1",1,"Static26");
//
m_pRTUStaticInfo->uPacketType=*pData++;
nTolStatic++;
m_pRTUStaticInfo->uPacketLen=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolStatic+=2;
m_pRTUStaticInfo->uVersion=*(pData++);
nTolStatic++;
m_pRTUStaticInfo->uRTUPhysicAddr=CTools::CharToInt((unsigned char *)pData,8);
pData+=8;
nTolStatic+=8;
m_pRTUStaticInfo->uPackageTime=CTools::CharToInt((unsigned char *)pData,4);
pData+=4;
nTolStatic+=4;
m_pRTUStaticInfo->uDeviceCnt=*(pData++);
nTolStatic++;
if(m_pRTUStaticInfo->uDeviceCnt>18)
{
// memset(m_pRTUStaticInfo,0,size);
return false;
}
// m_pRTUStaticInfo->uDeviceSN=*(pData++);
// m_pRTUStaticInfo->uDeviceLen=*(pData++);
int i;
for(i=0;i<m_pRTUStaticInfo->uDeviceCnt;i++)
{
int nTolDevLen=0;
if (m_pRTUStaticInfo->ArrayGTBaseInfo[i]==NULL)
{
m_pRTUStaticInfo->ArrayGTBaseInfo[i]=new CGTBaseInfo;
memset(m_pRTUStaticInfo->ArrayGTBaseInfo[i],0,sizeof(CGTBaseInfo));
}
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uDeviceSN=*(pData++);
nTolDevLen++;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uDeviceLen=*(pData++);
nTolDevLen++;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uGTPhysicAddr=CTools::CharToInt((unsigned char *)pData,8);
pData+=8;
nTolDevLen+=8;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uModel=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uInstrumentationType=*(pData++);
nTolDevLen++;
// m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uDataType=*(pData++);
memcpy(m_pRTUStaticInfo->ArrayGTBaseInfo[i]->sModelCode,pData,8);
pData+=8;
nTolDevLen+=8;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uSN=CTools::CharToInt((unsigned char *)pData,4);
pData+=4;
nTolDevLen+=4;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uFirmwareVS=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uSoftwareVS=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uRange=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uAccuracy=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uLowOperatingTemperature=*(pData++);
nTolDevLen++;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uHighOperatingTemperature=*(pData++);
nTolDevLen++;
// m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uReserve=*(pData++);
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uProLev=*(pData++);
nTolDevLen++;
memcpy(m_pRTUStaticInfo->ArrayGTBaseInfo[i]->sExplosionLev,pData,8);
pData+=8;
nTolDevLen+=8;
/*#define INSTRUTYPE_INTEGRATIONLOAD 0x01 //一体化负荷
#define INSTRUTYPE_PRESS 0x02 //压力
#define INSTRUTYPE_TEMP 0x03 //温度
#define INSTRUTYPE_ELEC 0x04 //3相电参数
#define INSTRUTYPE_SPEED 0x05 //转速
#define INSTRUTYPE_FLOWMETER 0x06 //流量计
#define INSTRUTYPE_VALVE 0x07 //调节阀
#define INSTRUTYPE_TLSENSOR 0x08 //扭矩载荷传感器
#define INSTRUTYPE_RTUEQ 0xf0 //RTU设备
#define INSTRUTYPE_HANDWRITE 0xf1 //手操器*/
switch(m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uInstrumentationType)
{
case 0x01:
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange1=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy1=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
break;
case 0x02:
break;
case 0x03:
break;
case 0x04:
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange1=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy1=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange2=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy2=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange3=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy3=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
break;
case 0x05:
break;
case 0x06:
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange1=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy1=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
break;
case 0x07:
break;
case 0x08:
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange1=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy1=CTools::CharToInt((unsigned char *)pData,2);
pData+=2;
nTolDevLen+=2;
m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange2=CTools::CharToInt((unsigned