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

📄 pmacmas.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "msystem.h"#include "PMACMas.h"//#pragma pack(pop)void* CPMACMas::PMACMaster(void *pVoid)//Period and Cycle	for	PRM=1; Wait	IND	for	PRM=0{	CPMACMas *pAS =	(CPMACMas *)pVoid;	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);	sleep(2);	while (1) 	{		pAS->Query();		#ifndef _VIRTUAL_COMM			usleep(20000);		#else			usleep(10000);		#endif	}}CPMACMas::~CPMACMas(){	if (m_hThread >	0)	{		cout <<	"CPMACMas" << m_hThread	<< endl;		pthread_cancel(m_hThread);	}}bool CPMACMas::Init(){	bool bRet =	false;	pthread_attr_t attr;	pthread_attr_init(&attr);	pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);	if (pthread_create(&m_hThread,&attr,PMACMaster,(void *)this) ==	0)		bRet = true;	pthread_attr_destroy(&attr);	return bRet;}void CPMACMas::Query(){	for (WORD w=0;w<256;w++)	{		if (m_wBreakCount[w] < 5)		{			m_dwPrev++;			break;		}	}	if (!m_subdevmgr.HasOn()) 	{		m_dwPrev++;		return;	}	BYTE byAddr	= m_subdevmgr.GetAddrFrmNo(m_bySendNo);	BYTE byType	= m_subdevmgr.GetTypeFrmAddr(byAddr);	if (byAddr == 0xff)		return;	if(m_bySendOrder==0)	{		GetData(byAddr,byType);	}	else if(byType==dt_ehlk2&&m_bySendOrder==m_byLoopEnd)	{		Gethlk2YX(byAddr);	}	else if(byType==dt_eGKJ0&&m_bySendOrder==m_byLoopEnd)	{		GetGKJ0YX(byAddr);	}	else if(byType==dt_ePMAC720&&m_bySendOrder==m_byLoopEnd)	{		GetData(byAddr,byType);	}	else if(byType==dt_ePDM803A&&m_bySendOrder==m_byLoopEndDEF)			{		GetData(byAddr,byType);	}	else if(byType==dt_ePDM820&&m_bySendOrder==m_byLoopEndDEF)	{		GetData(byAddr,byType);	}	else if(byType==dt_eDDEF&&m_bySendOrder==1)  //test by  lisheng 6.21	{		GetREF542plusYX(byAddr);	}	else if(byType==dt_eDDEF&&m_bySendOrder==2)  //test by  lisheng 6.21	{		GetREF542plusYX1(byAddr);	}	else if(byType==dt_eDDEF&&m_bySendOrder==3)  //test by  lisheng 6.21	{		GetREF542plusYX2(byAddr);	}	else if(byType==dt_eDDEF&&m_bySendOrder==4)  //test by  lisheng 6.21	{		GetREF542plusYX3(byAddr);	}	else if(byType==dt_eDDEF1&&m_bySendOrder==1)  //test by  lisheng 6.21	{		GetREF543plusYX(byAddr);	}	else if(byType==dt_eDDEF1&&m_bySendOrder==2)  //test by  lisheng 6.21	{		GetREF543plusYX1(byAddr);	}	else if(byType==dt_eDDEF1&&m_bySendOrder==3)  //test by  lisheng 6.21	{		GetREF543plusYX2(byAddr);	}	else if(byType==dt_eDDEF&&m_bySendOrder==4)  //test by  lisheng 6.21	{		GetREF543plusYX3(byAddr);	}	if((m_bySendOrder++>=6)	|| (m_bySendNo == 0xff))	{   		m_bySendOrder =	0;		m_bySendNo = m_subdevmgr.GetNextNo(m_bySendNo);//2007.03.15		if(m_bySendNo==0)		{			if(m_byLoopEnd++>=6)				m_byLoopEnd=1;		}	}}void CPMACMas::SyncClock(){	pthread_mutex_lock(&m_mutex);	CFrameNode FNSend,FNRecv;	FNSend.m_byCID = 0x10;	FNSend.m_byDesAddr =0;//byAddr; //广播地址	FNSend.SetSize(9);	BYTE* pbyTemp = FNSend.m_pbyData;	SW(1200,pbyTemp);	SW(2,pbyTemp);	*pbyTemp++ = 4;	CTimeVal tv;	SHDW(tv.Get_sec()+8*3600,pbyTemp);	m_DLService.REQ(0,&FNSend,FNRecv,0,false);//Send - No Respond	pthread_mutex_unlock(&m_mutex);}bool CPMACMas::YK(WORD wDevNo,BYTE byRoute,bool	bIsOn){	bool bRet =	false;	pthread_mutex_lock(&m_mutex);	BYTE byAddr	= m_subdevmgr.GetAddrFrmDevNo(wDevNo);	BYTE byType	= m_subdevmgr.GetTypeFrmAddr(byAddr);	if (byAddr != 0xff)	{			switch (byType)		{			case dt_ePMAC9900E: //PMAC9900E写继电器寄存器				{					WORD byRoadNo =	905 + byRoute - 1;					CFrameNode FNSend,FNRecv;					FNSend.m_byCID = 0x10;					FNSend.m_byDesAddr = byAddr;					FNSend.SetSize(7);								BYTE* pbyTemp = FNSend.m_pbyData;					SW(byRoadNo,pbyTemp);					SW(1,pbyTemp);					*pbyTemp++ = 2;					SW((bIsOn ? 1:0),pbyTemp);					m_DLService.SetEchoLen(8);								if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) ==	1)//Send - Respond					{						if (FNRecv.m_byCID == 0x10)							bRet = true;					}				}				break;			case dt_eDDEF: //dt_eDDEF写继电器寄存器				{					WORD byRoadNo =	byRoute - 1;					CFrameNode FNSend,FNRecv;					FNSend.m_byCID = 0x0F;					FNSend.m_byDesAddr = byAddr;					FNSend.SetSize(34);								BYTE* pbyTemp = FNSend.m_pbyData;					SW(byRoadNo,pbyTemp);						SW((bIsOn ? 1:0),pbyTemp);					m_DLService.SetEchoLen(34);					if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) ==	1)//Send - Respond					{						if (FNRecv.m_byCID == 0x0F)							bRet = true;					}				}				break;			default:				{					BYTE byRoadNo =	byRoute	- 1;					CFrameNode FNSend,FNRecv;					FNSend.m_byCID = 0x5;					FNSend.m_byDesAddr = byAddr;					FNSend.SetSize(4);								BYTE* pbyTemp = FNSend.m_pbyData;					SW(byRoadNo,pbyTemp);					SW((bIsOn ? 0xff00:0),pbyTemp);									m_DLService.SetEchoLen(8);								if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) ==	1)//Send - Respond					{						if (FNRecv.m_byCID == 0x5)							bRet = true;					}				}				break;		}	}	pthread_mutex_unlock(&m_mutex);	return bRet;}void CPMACMas::GetData(BYTE	byAddr,BYTE	byType){	pthread_mutex_lock(&m_mutex);	CFrameNode FNSend,FNRecv;	FNSend.m_byCID = 0x3;	FNSend.m_byDesAddr = byAddr;	FNSend.SetSize(4);	WORD wDevNo	= m_subdevmgr.GetDevNoFrmAddr(byAddr);	BYTE* pbyTemp = FNSend.m_pbyData;	WORD wEcho=0;	switch (byType)	{		case dt_ePM100EN:			SW(0,pbyTemp);			SW(58,pbyTemp);			wEcho = 58*2 + 1;			break;		case dt_ePMAC720:			switch(m_bySendOrder)			{				case 0:					SW(0,pbyTemp);					SW(58,pbyTemp);					wEcho = 58*2 + 1;					break;				default:					SW((m_bySendOrder+1)*100,pbyTemp);					SW(16,pbyTemp);					wEcho = 16*2 + 1;					break;			}			break;		case dt_ePMAC9900E:			SW(10,pbyTemp);			SW(52,pbyTemp);			wEcho = 52*2 + 1;			break;		case dt_ePMAC9900N:			SW(10,pbyTemp);			SW(8,pbyTemp);			wEcho = 8*2 + 1;			break;		case dt_ePMAC9900:			SW(10,pbyTemp);			SW(62,pbyTemp);			wEcho = 62*2 + 1;			break;		case dt_ePMAC600B:			SW(0,pbyTemp);			SW(36,pbyTemp);			wEcho = 36*2 + 1;			break;		case dt_ePDM820:     //add by li sheng			SW(378,pbyTemp);   //(add by lisheng 2007 .3.26)   6.15  瞬时值地址			SW(33,pbyTemp);  //(add by lisheng 2007 .3.26)     6.15			wEcho =33*2 + 1;  //(add by lisheng 2007.3.26)       6.15			break; 			case dt_ePDM803A:     //add by li sheng			SW(253,pbyTemp);     //(add by lisheng)			SW(35,pbyTemp);     //(add by lisheng)			wEcho = 35*2 + 1;      //(add by lisheng)			break;			case dt_eDDEF:     //add by li sheng	        SW(0,pbyTemp);		    SW(34,pbyTemp); 		    wEcho = 34*2 + 1;		    FNSend.m_byCID = 0x4;			break;		case dt_eDDEF1:     //add by li sheng	        SW(0,pbyTemp);		    SW(34,pbyTemp); 		    wEcho = 34*2 + 1;		    FNSend.m_byCID = 0x4;			break;			case dt_ePMAC600A:			SW(0,pbyTemp);			SW(12,pbyTemp);			wEcho = 12*2 + 1;			break;		case dt_ePMAC303:			SW(10,pbyTemp);			SW(66,pbyTemp);			wEcho = 66*2 + 1;			break;		case dt_ePMAC503:			SW(0,pbyTemp);			SW(18,pbyTemp);			wEcho = 18*2 + 1;			break;		case dt_ePMAC503E:			SW(0,pbyTemp);			SW(19,pbyTemp);			wEcho = 19*2 + 1;			break;		case dt_eREF542plus:			SW(0,pbyTemp);			SW(34,pbyTemp); 			wEcho = 34*2 + 2;			FNSend.m_byCID = 0x4;			break;		case dt_eWGK31001:			SW(0,pbyTemp);			SW(34,pbyTemp);			wEcho = 34*2 + 1;			FNSend.m_byCID = 0x4;			break;		case dt_eLDWKY:			SW(0,pbyTemp);			SW(4,pbyTemp);			wEcho = 4*2 + 1;			FNSend.m_byCID = 0x3;			break;		case dt_eDCRJ:			SW(1,pbyTemp);			SW(16,pbyTemp);			wEcho = 16*2 + 1;			FNSend.m_byCID = 0x4;			break;				case dt_eJBK3000:			SW(0x1000,pbyTemp);			SW(25,pbyTemp);			wEcho = 25*2 + 1;			break;		case dt_eFJTWKY:			SW(0,pbyTemp);			SW(6,pbyTemp);			wEcho = 6*2 + 1;			break;		case dt_eZGDWKY:			SW(99,pbyTemp);			SW(6,pbyTemp);			wEcho = 6*2 + 1;			break;		case dt_ehlk2:			SW(0,pbyTemp);			SW(16,pbyTemp); 			wEcho = 16*2 + 1;			break;		case dt_eTTC310:			SW(43,pbyTemp);			SW(4,pbyTemp); 			wEcho = 4*2 + 1; 			break; 					case dt_eWKY0:			SW(0,pbyTemp);			SW(5,pbyTemp); 			wEcho = 5*2 + 1;			break;					case dt_eGKJ0:			SW(0,pbyTemp);			SW(42,pbyTemp); 			wEcho = 42*2 + 1;			break;					case dt_eSepam20_B21:			SW(262,pbyTemp);			SW(17,pbyTemp); 			wEcho = 17*2 + 1;			break;		case dt_eSepam40_S40:			SW(275,pbyTemp);			SW(70,pbyTemp); 			wEcho = 70*2 + 1;			break;		default:			return;	}	#ifdef _VIRTUAL_COMM				BYTE* pbyVD = new BYTE[wEcho];				for (WORD ww=0;ww<wEcho; ww++)		{			if (ww == 0)				pbyVD[ww] = wEcho-1;			else				pbyVD[ww] = ww;		}		switch (byType)		{			case dt_ePMAC9900:				Exp9900Data(byAddr,pbyVD,wEcho);				break;			case dt_ePMAC720://				Exp720Data(byAddr,pbyVD,wEcho);				break;			case dt_ePMAC303://				ExpPMAC303Data(byAddr,pbyVD,wEcho);				break;			case dt_ePMAC9900N://				Exp9900NData(byAddr,pbyVD,wEcho);				break;			case dt_ePMAC600B://				Exp600BData(byAddr,pbyVD,wEcho);				break;			case dt_ePDM820://add by li sheng				ExpPDM800Data(byAddr,pbyVD,wEcho);				break;			case dt_ePDM803A://add by li sheng				ExpPDM803AData(byAddr,pbyVD,wEcho);				break;			case dt_eDDEF://add by li sheng				ExpDDEFData(byAddr,pbyVD,wEcho);				break;			case dt_eDDEF1://add by li sheng				ExpDDEF1Data(byAddr,pbyVD,wEcho);			case dt_eREF542plus:				ExpREF542plusYX(byAddr,pbyVD,wEcho);				break;			case dt_eWGK31001:				ExpWGKYC(byAddr,pbyVD,wEcho);				break;			case dt_eJBK3000:				ExpJBK3000YC(byAddr,pbyVD,wEcho);				break;			case dt_eLDWKY:				ExpLDWKYYC(byAddr,pbyVD,wEcho);				break;			case dt_eTTC310:				ExpTTC310YC(byAddr,pbyVD,wEcho);				break;			case dt_eDCRJ:				ExpDCRJData(byAddr,pbyVD,wEcho,0);				break;			case dt_eFJTWKY:				ExpFJTWKYData(byAddr,pbyVD,wEcho);				break;			case dt_ePMAC503E:				Exp503EData(byAddr,pbyVD,wEcho);				break;			case dt_ehlk2:				Exphlk2YC(byAddr,pbyVD,wEcho);			case dt_eGKJ0:				ExpGKJ0YC(byAddr,pbyVD,wEcho);								break;			default:				break;		}		delete [] pbyVD;	#else		m_DLService.SetEchoLen(4+wEcho); 		if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) ==	1)//Send - Respond		{			if (((FNRecv.m_byCID & 0x80) == 0) && (FNRecv.m_wSize == wEcho))			{				switch (byType)				{					case dt_ePMAC9900:						Exp9900Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ePMAC720://						Exp720Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ePM100EN://						Exp100ENData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ePMAC9900E:						Exp9900EData(byAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ePMAC9900N://						Exp9900NData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						#ifdef _DEBUGUC								cout<<"9900N \r\n"<<endl;						#endif						break;					case dt_ePMAC600B://						Exp600BData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ePDM820://add by li sheng						ExpPDM800Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);  //add by li sheng						break;																//add by li sheng					case dt_ePDM803A://add by li sheng						ExpPDM803AData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);  //add by li sheng						break;					case dt_eDDEF://add by li sheng						ExpDDEFData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);  //add by li sheng						break;					case dt_eDDEF1://add by li sheng						ExpDDEF1Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);  //add by li sheng						break;					case dt_ePMAC600A://						Exp600AData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ePMAC303://						ExpPMAC303Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ePMAC503://						ExpPMAC503Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eREF542plus:						ExpREF542plusYX(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ePMAC503E:						ExpPMAC503EData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eWGK31001:						ExpWGKYC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eJBK3000:						ExpJBK3000YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eLDWKY:						ExpLDWKYYC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eDCRJ:						ExpDCRJData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize,0);						break;					case dt_eFJTWKY://						ExpFJTWKYData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eZGDWKY://						ExpZGDWKYData(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_ehlk2://hlk2类型和遥测解析函数的指向声明						Exphlk2YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eTTC310:						ExpTTC310YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eWKY0:						ExpWKY0Data(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eGKJ0:						ExpGKJ0YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eSepam20_B21:						ExpSepam20_B21YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					case dt_eSepam40_S40:						ExpSepam40_S40YC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);						break;					default:						break;				}			}			if (m_wBreakCount[byAddr]==0)			{				YXData d;				d.m_wDevNo = wDevNo;				d.m_wDevPtNo = 199;				d.m_bValue = 0xff;				m_pAllMgr->YX(&d, 1);			}			m_wBreakCount[byAddr] =	0;					}		else		{			if (m_wBreakCount[byAddr] >= 5)			{				m_wBreakCount[byAddr]++;				YXData d;				d.m_wDevNo = wDevNo;				d.m_wDevPtNo = 199;				d.m_bValue = 0xff00;				m_pAllMgr->YX(&d, 1);			}			else if (m_wBreakCount[byAddr] < 5)				m_wBreakCount[byAddr]++;		}

⌨️ 快捷键说明

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