⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdtsas.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
字号:
 #include   "iostream.h"   #include "cdtsas.h"#include "allmgr.h"#include "cdt.h"/*	WORD	m_wPubAddr; //group:function code //yx>=0 and yx<512	BYTE	m_byType; //YC1=1,YC2=2,YC3=3						//ZJ(总加遥测) &= 0x10,F=0x20,Water=0x30。即:0x11,0x12,0x13;0x21,0x22,0x23;0x31,0x32,0x33						//DD=6,Work Info=7,SOE=8,YX=9,YK=10,YT=11,SetValue=12	string	m_strName;	WORD	m_wDevNo; //=0: m_nType = YX ,系统信息	WORD	m_wDevPubAddr;	bool	m_bValid; //备用=:true; 采集=:falsestatic struCDTInfo CDTInfos[] = {	//yc	{0x0000,1,1,1},	{0x0001,1,1,2},	{0x0100,1,1,3},	{0x0101,1,1,4},	{0x0200,1,1,5},	{0x0201,1,1,6},	//yx	{0xf000,9,1,1},	{0xf001,9,1,2},	{0xf002,9,1,3},	{0xf003,9,1,4},	{0xf004,9,1,5},	{0xf005,9,1,6},	//yk	{0x0000,10,1,1},	{0x0001,10,1,2},	{0x0002,10,2,1},	{0x0003,10,2,2},};*/void CCDTSAS::Load(){	/*		for (WORD www=0; www<sizeof(CDTInfos)/sizeof(struCDTInfo); www++)	{		switch (CDTInfos[www].m_byType & 0xf)		{		case 1:		case 2:		case 3:			m_YCInfos.Add(&CDTInfos[www]);			break;		case 9:			m_YXInfos.Add(&CDTInfos[www]);			break;		case 10:			m_YKInfos.Add(&CDTInfos[www]);			break;		default:			break;		}	}	*/	m_YCInfos.Load();	m_YCInfos.Sort();	m_YXInfos.Load();	m_YXInfos.Sort();	m_SOEInfos.Load();	m_SOEInfos.Sort();	m_YKInfos.Load();	m_YKInfos.Sort();}void* CDTSlaveGetIND(void *pVoid){	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);	CCDTSAS *pAS = (CCDTSAS *)pVoid;	while (1) {		CFrameNode FNRecv;		if (pAS->m_DLService.IND(FNRecv)>0) //有指示;			pAS->ExplainIND(&FNRecv);		else			usleep(10000);	}}void* CDTSlaveCycleSend(void *pVoid){	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);	CCDTSAS *pAS = (CCDTSAS *)pVoid;	usleep(1000000);	while (1) {		while  (pAS->m_DLService.Status() != 0)	sleep(1);		pAS->SendCycleData();	}}bool CCDTSAS::Init(){	bool bRet = false;	pthread_attr_t attr;	pthread_attr_init(&attr);	pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);	if (pthread_create(&m_hThreadGet,&attr,CDTSlaveGetIND,(void *)this) == 0)	{		pthread_attr_t attr1;		pthread_attr_init(&attr1);		pthread_attr_setdetachstate(&attr1,PTHREAD_CREATE_DETACHED);		if (pthread_create(&m_hThreadSend,&attr1,CDTSlaveCycleSend,(void *)this) == 0)		{			Load();			bRet = true;		}		else		{			pthread_cancel(m_hThreadGet);			m_hThreadGet = 0;			m_hThreadSend = 0;		}		pthread_attr_destroy(&attr1);	}	else	m_hThreadGet = 0;	pthread_attr_destroy(&attr);	return bRet;}CCDTSAS::CCDTSAS(CAllMgr* pAllMgr,CSerialPortDef* pChannel)	: CSAppService(pAllMgr,true)	, m_DLService(pChannel)	, m_YTInfos(false){	m_hThreadGet = 0;	m_hThreadSend = 0;	m_byAddr = 1;	m_byOrder = 0;	m_bRtnCallClock = false;	m_bHasYKRtn = false;}CCDTSAS::~CCDTSAS(){	if (m_hThreadGet > 0)	{		cout << "CDTGet: " << m_hThreadGet << endl;		pthread_cancel(m_hThreadGet);	}	if (m_hThreadSend > 0)	{		cout << "CDTSend: " << m_hThreadSend << endl;		pthread_cancel(m_hThreadSend);	}}void CCDTSAS::ExplainIND(CFrameNode* pFNRecv){	BYTE byFrameType = pFNRecv->m_byCID;	BYTE bySize = (BYTE)pFNRecv->m_wSize;	BYTE* pbyRD=pFNRecv->m_pbyData;	switch(byFrameType)	{	case 0x61: //YK Select		if ((bySize >= 6 /* 3*6 */) && (pbyRD[0] == 0xe0) && ((pbyRD[1] == 0xcc) || (pbyRD[1] == 0x33)))		{		 	for  (int iii=0;m_YXInfos.HasYXChanged() && (iii<10);iii++) usleep(100000);		 	if (m_YXInfos.HasYXChanged())			{//Send Work Info		 	}		 	else		 	{			 	bool bOn = (pbyRD[1] == 0xcc) ? true : false;				m_YKInfos.Select(pbyRD[2],bOn,m_abyYKRtn);				// Send YK return;				m_bHasYKRtn = true;			}		}		break;	case 0xc2: //YK Operate		if ((bySize >= 6) && (pbyRD[0] == 0xe2) && (pbyRD[1] == 0xaa))		{			WORD byDev;			WORD wDevPubAddr;			bool bOn;        			if (m_YKInfos.Operate(pbyRD[2],byDev,wDevPubAddr,bOn))			{				if (m_YXInfos.HasYXChanged())				{//Send Work Info					;				}				else					m_pAllMgr->YK(byDev,wDevPubAddr,bOn);			}           		}		break;	case 0xb3: //YK Cancel		if ((bySize >= 6) && (pbyRD[0] == 0xe3) && (pbyRD[1] == 0x55))		{			m_YKInfos.Cancel(pbyRD[2]);		}		break;	case 0xf4: //升降 Selecout <<nYCKind<<endl;		break;	case 0x85: //升降 Operator		break;	case 0x26: //升降 Cancel		break;	case 0x3d: //复归命令		break;	case 0x9e: //广播命令[冻结计数]		break;	case 0x7a: //设置时钟		if ((bySize == 12) && (pbyRD[0] == 0xee) && (pbyRD[6] == 0xef))		{			struct tm t;			t.tm_year = pbyRD[10];			t.tm_mon = pbyRD[9]-1;			t.tm_mday = pbyRD[8];			t.tm_hour = pbyRD[7];			t.tm_min = pbyRD[4];			t.tm_sec = pbyRD[3];			WORD* pw = (WORD *)&pbyRD[1];			CTimeVal tv(&t,*pw & 0x3ff);			m_pAllMgr->RectifyTime(&tv);		}		break;	case 0x0b: //设置时钟校正值		if ((bySize == 6) && (pbyRD[0] == 0xed))		{			short* psh = (short *)&pbyRD[1];			CTimeValSpan tvs(0,0,0,0,1000*(*psh));			CTimeVal tv;			tv  += tvs;			m_pAllMgr->RectifyTime(&tv);		}		break;	case 0x4c: //召唤子站时钟		if (bySize == 0)		{			m_tvCallTime.GetCurrentTime();			m_bRtnCallClock = true;		}		break;	case 0x57: //设定命令		if (m_YXInfos.HasYXChanged())	 	{//Send Work Info	 	}		break;	default:		usleep(20000);		break;	}}const char acSendOrder[] = "DABACABAABAE";void CCDTSAS::SendCycleData(){	switch(acSendOrder[m_byOrder++ % ((sizeof(acSendOrder)-1)/sizeof(char))])	{	case 'A':		SendYC(1); //重要遥测 A		break;	case 'B':		SendYC(2); //次要遥测B		break;	case 'C':		if (!SendSOE()) //E->C		{			if (SendYC(3)) //一般遥测C				break;		}		else break;	case 'D':	{		CTimeVal tv;		CTimeValSpan tvs = tv-m_tvLast;		if (tvs.GetASecs() > 1800)		{			m_tvLast = tv;			SendDD(); //D2		}		else SendYX(); //D1		break;	}	case 'E':		SendProtInfo();		break;			default:		m_byOrder = 0;		break;	}}bool CCDTSAS::SendYC(int nYCKind) //重要遥测 A := 1;//次要遥测B := 2;//一般遥测C := 3{	bool	bRet = false;	CFrameNode fnR;	fnR.m_byCID = (nYCKind == 1) ? 0x61 : ((nYCKind == 2) ? 0xc2 : 0xb3);	m_YCInfos.GetYCData(nYCKind,fnR.m_pbyData,fnR.m_wSize);	//replace infowords  using clock return ,yx change OR yk return	BYTE pData[96];	WORD wSize;	if (m_bRtnCallClock)	{		m_bRtnCallClock = false;		pData[0] = 0x84;		WORD* pw = (WORD *)&pData[1];		*pw = m_tvCallTime.GetMilliSecs();		struct tm t;		m_tvCallTime.GetTime(&t);		pData[3] = t.tm_sec;		pData[4] = t.tm_min;				pData[6] = 0x85;		pw = (WORD *)&pData[7];				CTimeVal tv;		CTimeValSpan tvs = tv-m_tvCallTime;		*pw = tvs.GetMicroSecs()/1000;		pData[9] = pData[10] = 0;			memcpy(fnR.m_pbyData,pData,12);		if (fnR.m_wSize < 12) fnR.m_wSize = 12;	}	else if (m_YXInfos.GetPRMYXData(pData,wSize))	{		if (wSize > 6) //All YX		{			fnR.m_byCID = 0xf4;			fnR.m_wSize = wSize;			memcpy(fnR.m_pbyData,pData,wSize);		}		else		{			memcpy(fnR.m_pbyData,pData,6);			memcpy(fnR.m_pbyData+6,pData,6);			memcpy(fnR.m_pbyData+12,pData,6);			if (fnR.m_wSize < 18) fnR.m_wSize = 18;		}	}	else if (m_bHasYKRtn)	{		m_bHasYKRtn = false;		memcpy(fnR.m_pbyData,m_abyYKRtn,6);		memcpy(fnR.m_pbyData+6,m_abyYKRtn,6);		memcpy(fnR.m_pbyData+12,m_abyYKRtn,6);		if (fnR.m_wSize < 18) fnR.m_wSize = 18;	}	if (fnR.m_wSize >= 6)	{		m_DLService.RESP(&fnR);		usleep(fnR.m_wSize*28000);		bRet = true;	}	return bRet;}bool CCDTSAS::SendSOE() //E{	bool bRet = false;	//insert infowords  using clock return ,yx change OR yk return	CFrameNode fnR;	fnR.m_byCID = 0x26;	BYTE pData[96];	WORD wSize;	if (m_bRtnCallClock)	{		m_bRtnCallClock = false;		pData[0] = 0x84;		WORD* pw = (WORD *)&pData[1];		*pw = m_tvCallTime.GetMilliSecs();		struct tm t;		m_tvCallTime.GetTime(&t);		pData[3] = t.tm_sec;		pData[4] = t.tm_min;				pData[6] = 0x85;		pw = (WORD *)&pData[7];				CTimeVal tv;		CTimeValSpan tvs = tv-m_tvCallTime;		*pw = tvs.GetMicroSecs()/1000;		pData[9] = pData[10] = 0;			memcpy(fnR.m_pbyData,pData,12);		fnR.m_wSize = 12;	}	else if (m_YXInfos.GetPRMYXData(pData,wSize))	{		if (wSize > 6) //All YX		{			fnR.m_byCID = 0xf4;			fnR.m_wSize = wSize;			memcpy(fnR.m_pbyData,pData,wSize);		}		else		{			memcpy(fnR.m_pbyData,pData,6);			memcpy(fnR.m_pbyData+6,pData,6);			memcpy(fnR.m_pbyData+12,pData,6);			fnR.m_wSize = 18;		}	}	else if (m_bHasYKRtn)	{		m_bHasYKRtn = false;		memcpy(fnR.m_pbyData,m_abyYKRtn,6);		memcpy(fnR.m_pbyData+6,m_abyYKRtn,6);		memcpy(fnR.m_pbyData+12,m_abyYKRtn,6);		fnR.m_wSize = 18;	}		WORD wSOESize = 0;	m_SOEInfos.GetSOEData(fnR.m_pbyData+fnR.m_wSize,wSOESize);	fnR.m_wSize += wSOESize;	if (fnR.m_wSize >= 6)	{		m_DLService.RESP(&fnR);		usleep(fnR.m_wSize*28000);		bRet = true;	}		return bRet;}void CCDTSAS::SendDD() //D2{	CFrameNode fnR;	fnR.m_byCID = 0x85;	m_DDInfos.GetDDData(fnR.m_pbyData,fnR.m_wSize);	//replace infowords  using clock return ,yx change OR yk return	BYTE pData[96];	WORD wSize;	if (m_bRtnCallClock)	{		m_bRtnCallClock = false;		pData[0] = 0x84;		WORD* pw = (WORD *)&pData[1];		*pw = m_tvCallTime.GetMilliSecs();		struct tm t;		m_tvCallTime.GetTime(&t);		pData[3] = t.tm_sec;		pData[4] = t.tm_min;				pData[6] = 0x85;		pw = (WORD *)&pData[7];				CTimeVal tv;		CTimeValSpan tvs = tv-m_tvCallTime;		*pw = tvs.GetMicroSecs()/1000;		pData[9] = pData[10] = 0;			memcpy(fnR.m_pbyData,pData,12);		if (fnR.m_wSize < 12) fnR.m_wSize = 12;	}	else if (m_YXInfos.GetPRMYXData(pData,wSize))	{		if (wSize > 6) //All YX		{			fnR.m_byCID = 0xf4;			fnR.m_wSize = wSize;			memcpy(fnR.m_pbyData,pData,wSize);		}		else		{			memcpy(fnR.m_pbyData,pData,6);			memcpy(fnR.m_pbyData+6,pData,6);			memcpy(fnR.m_pbyData+12,pData,6);			if (fnR.m_wSize < 18) fnR.m_wSize = 18;		}	}	else if (m_bHasYKRtn)	{		m_bHasYKRtn = false;		memcpy(fnR.m_pbyData,m_abyYKRtn,6);		memcpy(fnR.m_pbyData+6,m_abyYKRtn,6);		memcpy(fnR.m_pbyData+12,m_abyYKRtn,6);		if (fnR.m_wSize < 18) fnR.m_wSize = 18;	}	if (fnR.m_wSize >= 6)	{		m_DLService.RESP(&fnR);		usleep(fnR.m_wSize*28000);	}}void CCDTSAS::SendYX() //D1{	CFrameNode fnR;	fnR.m_byCID = 0xF4;	m_YXInfos.GetYXData(0,fnR.m_pbyData,fnR.m_wSize);	//replace infowords  using clock return ,yx change OR yk return	BYTE pData[96];	if (m_bRtnCallClock)	{		m_bRtnCallClock = false;		pData[0] = 0x84;		WORD* pw = (WORD *)&pData[1];		*pw = m_tvCallTime.GetMilliSecs();		struct tm t;		m_tvCallTime.GetTime(&t);		pData[3] = t.tm_sec;		pData[4] = t.tm_min;				pData[6] = 0x85;		pw = (WORD *)&pData[7];				CTimeVal tv;		CTimeValSpan tvs = tv-m_tvCallTime;		*pw = tvs.GetMicroSecs()/1000;		pData[9] = pData[10] = 0;			memcpy(fnR.m_pbyData,pData,12);		if (fnR.m_wSize < 12) fnR.m_wSize = 12;	}	else if (m_bHasYKRtn)	{		m_bHasYKRtn = false;		memcpy(fnR.m_pbyData,m_abyYKRtn,6);		memcpy(fnR.m_pbyData+6,m_abyYKRtn,6);		memcpy(fnR.m_pbyData+12,m_abyYKRtn,6);		if (fnR.m_wSize < 18) fnR.m_wSize = 18;	}	if (fnR.m_wSize >= 6)	{		m_DLService.RESP(&fnR);		usleep(fnR.m_wSize*28000);	}}void CCDTSAS::SendProtInfo(){	if (m_queProtInfo.Size()>0)	{		CFrameNode fnR;		fnR.m_byCID = 0x40;		CDataNode* pDN;		m_queProtInfo.Get(pDN);		BYTE bySum = pDN->m_wSize/4 + ((pDN->m_wSize%4)?1:0);		fnR.m_wSize = bySum*6;		for (BYTE bb=0; bb<bySum;bb++)		{			fnR.m_pbyData[6*bb] = bb;			memcpy((char *)&fnR.m_pbyData[6*bb+1],(char *)&pDN->m_pbyData[4*bb],4);		}				delete pDN;		if (fnR.m_wSize >= 6)		{			m_DLService.RESP(&fnR);			usleep(fnR.m_wSize*28000);		}	}}void CCDTSAS::YC(YCData* pYCValue,WORD wCount){//	cout << "CDT Hello YC" <<endl;	for (WORD www=0; www<wCount;www++)	{		m_YCInfos.SetValue(pYCValue[www].m_wDevNo,pYCValue[www].m_wDevPtNo,pYCValue[www].m_fValue);	}}void CCDTSAS::YX(YXData* pBoolValue,WORD wCount){	for (WORD www=0; www<wCount;www++)	{		m_YXInfos.SetValue(pBoolValue[www].m_wDevNo,pBoolValue[www].m_wDevPtNo,pBoolValue[www].m_bValue);	}//	cout << "CDT Hello YX" <<endl;}void CCDTSAS::DD(DDData* pDDValue,WORD wCount){	for (WORD www=0; www<wCount;www++)	{		m_DDInfos.SetValue(pDDValue[www].m_wDevNo,pDDValue[www].m_wDevPtNo,pDDValue[www].m_dwValue);	}//	cout << "CDT Hello DD" <<endl;}void CCDTSAS::SOE(SOEData* pSOEValue,WORD wCount){	for (WORD www=0; www<wCount;www++)	{		m_SOEInfos.SetValue(pSOEValue[www].m_wDevNo,pSOEValue[www].m_wDevPtNo,&pSOEValue[www]);	}//	cout << "CDT Hello SOE" <<endl;}void CCDTSAS::ProtInfo(BYTE* pBuf, WORD wSize){	timeval tv;	CDataNode* p = new CDataNode(tv,pBuf,wSize);	m_queProtInfo.Add(p);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -