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

📄 yd20mas.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
字号:
#include "msystem.h"#include "YD20Mas.h"void* YD20Master(void *pVoid)//Period and Cycle	for	PRM=1; Wait	IND	for	PRM=0{	CYD20Mas *pAS =	(CYD20Mas *)pVoid;	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);	sleep(2);	while (1) {		pAS->Query();	}}CYD20Mas::~CYD20Mas(){	if (m_hThread >	0)	{		cout <<	"CYD20Mas" << m_hThread	<< endl;		pthread_cancel(m_hThread);	}}bool CYD20Mas::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,YD20Master,(void *)this) ==	0)		bRet = true;	pthread_attr_destroy(&attr);	return bRet;}void CYD20Mas::Query(){	while (!m_subdevmgr.HasOn()) sleep(1);/*	for (BYTE byA=1;byA<20;byA++)		cout << m_subdevmgr.GetDevNoFrmAddr(byA) <<endl;*///	while ((m_subdevmgr.GetNum() != 8)  && (m_subdevmgr.GetNum() != 9)) sleep(1);/*	CTimeVal tmCurrent;	CTimeValSpan tvs;	if (tmCurrent > m_tmRectify)	 	tvs = tmCurrent - m_tmRectify;	 else tvs = m_tmRectify - tmCurrent;//	CTimeValSpan tvs = tmCurrent - m_tmRectify;	if (m_bFirst ||	(tvs.GetMinute() >= 1))	{		m_bFirst = false;		SyncClock();		m_tmRectify	= tmCurrent;	}		else*/	{		if((m_bySendOrder++>=1)	|| (m_bySendNo == 0xff))		{			m_bySendOrder =	0;			m_bySendNo = m_subdevmgr.GetNextNo(m_bySendNo);		}		BYTE byAddr	= m_subdevmgr.GetAddrFrmNo(m_bySendNo);		if (byAddr == 0xff)	return;		switch(m_bySendOrder)		{		case 0:			GetYC(byAddr);			break;		case 1:			GetYE(byAddr);			break;		default:			break;		}	}	usleep(m_dwIntervalMS * 1000);}//void CYD20Mas::SyncClock(/*BYTE byAddr,BYTE byType*/)/*{	pthread_mutex_lock(&m_mutex);	CFrameNode FNSend,FNRecv;	FNSend.m_byCID = 0x10;	FNSend.m_byDesAddr =0;//byAddr; //广播地址	FNSend.SetSize(9);	WORD *pwTemp = (WORD *)FNSend.m_pbyData;	*pwTemp++ = CW(1200);		*pwTemp++ =	CW(2);	BYTE* pby = (BYTE * )   pwTemp;	*pby++ = 4;	CTimeVal tv;	DWORD *pdwTemp = (DWORD	*)pby;	*pdwTemp = CHDW(tv.Get_sec()+8*3600);	m_DLService.REQ(0,&FNSend,FNRecv,0,false);//Send - No Respond		pthread_mutex_unlock(&m_mutex);}*/bool CYD20Mas::YK(WORD wDevNo,BYTE byRoute,bool	bIsOn){	bool bRet =	false;/*	pthread_mutex_lock(&m_mutex);		BYTE byAddr	= m_subdevmgr.GetAddrFrmDevNo(wDevNo);	if (byAddr != 0xff)	{			BYTE byRoadNo =	byRoute	- 1;		CFrameNode FNSend,FNRecv;		FNSend.m_byCID = 0x5;		FNSend.m_byDesAddr = byAddr;		FNSend.SetSize(4);		WORD* pData	= (WORD	*)FNSend.m_pbyData;		pData[0] = CW(byRoadNo); //select		pData[1] = bIsOn ? CW(0xff00) :	0;		m_DLService.SetEchoLen(8);		if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) ==	1)//Send - Respond		{			if (FNRecv.m_byCID == 0x5)				bRet = true;		}	}	pthread_mutex_unlock(&m_mutex);*/	return bRet;}void CYD20Mas::GetYC(BYTE	byAddr){	pthread_mutex_lock(&m_mutex);	CFrameNode FNSend,FNRecv;	FNSend.m_byCID = 0x3;	FNSend.m_byDesAddr = byAddr;	FNSend.SetSize(4);	WORD* pData	= (WORD	*)FNSend.m_pbyData;	pData[0] = 0;	pData[1] = CW(0x20);	m_DLService.SetEchoLen(5+0x20*2);	if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) ==	1)//Send - Respond	{		if (FNRecv.m_wSize == 65)			ExpYC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);		if (m_wBreakCount[FNRecv.m_bySrcAddr] >	0)		{			YXData d;			d.m_wDevNo = m_subdevmgr.GetDevNoFrmAddr(FNRecv.m_bySrcAddr);			d.m_wDevPtNo = 199;			d.m_bValue = 0xff;			m_pAllMgr->YX(&d, 1);		}		m_wBreakCount[FNRecv.m_bySrcAddr] =	0;	}	else	{		if (m_wBreakCount[byAddr] >= 5)		{			YXData d;			d.m_wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr);			d.m_wDevPtNo = 199;			d.m_bValue = 0xff00;			m_pAllMgr->YX(&d, 1);			m_wBreakCount[byAddr] = 0;		}		else m_wBreakCount[byAddr]++;	}				pthread_mutex_unlock(&m_mutex);}void CYD20Mas::ExpYC(BYTE	byAddr,BYTE* pbyData,BYTE bySize){	BYTE* pbyTemp =	pbyData	+ 1;	bool bUZ = false;	WORD wDevNo	= m_subdevmgr.GetDevNoFrmAddr(byAddr);	BYTE byType	= m_subdevmgr.GetTypeFrmAddr(byAddr);	YCData*	pData =	new	YCData [bySize/2];		WORD* pwOrigValue =	(WORD *)pbyTemp;	WORD w =0,w1=0;	for	(; w<bySize/2; w++)	{		pData[w1].m_wDevNo = wDevNo;		pData[w1].m_wDevPtNo = w+1;		if (((w >= 0x8/2) && (w<= 0xc/2)) ||  ((w >= 0x18/2) && (w<= 0x1c/2))			|| ((w >= 0x28/2) && (w<= 0x2c/2)) || ((w >= 0x38/2) && (w<= 0x3c/2))) //short		{			WORD www = CW(*pwOrigValue++);			short* pInt	= (short *)&www;			float ffValue =	*pInt;			pData[w1++].m_fValue = ffValue;		}		else if ((w == 0x6/2) || (w == 0x16/2) || (w == 0x26/2))		{			if ((byType == dt_eYD2100) && (w == 0x6/2))			{				YXData	aYXData[6];//8+6				WORD wStatus = CW(*pwOrigValue);				BYTE byA = 1;				for	(BYTE b=0; b<6;	b++,byA<<=1)				{					aYXData[b].m_wDevNo	= wDevNo;					aYXData[b].m_wDevPtNo =	b +	1;					aYXData[b].m_bValue	= (wStatus & byA)?0xff00:0xff;				}				m_pAllMgr->YX(aYXData, 6);			}			pwOrigValue++;			//else  m_pAllMgr->YX(pYXData, 3);		}		else //word		{			float ffValue =	CW(*pwOrigValue++);			pData[w1++].m_fValue = ffValue;/*			if (((w+1) == 26) &&  (ffValue < 28))				bUZ = true;			if (((w+1) == 28) && ( ffValue == 0) && !bUZ)			{				delete [] pData;				return;			}*/		}	}		m_pAllMgr->YC(pData,w1);	delete [] pData;}void CYD20Mas::GetYE(BYTE byAddr){	pthread_mutex_lock(&m_mutex);	CFrameNode FNSend,FNRecv;	FNSend.m_byCID = 0x3;	FNSend.m_byDesAddr = byAddr;	FNSend.SetSize(4);	WORD* pData	= (WORD	*)FNSend.m_pbyData;	pData[0] = CW(0x42);	pData[1] = CW(8*2);	m_DLService.SetEchoLen(5+2*2*8);	if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send -	Respond	{		if (FNRecv.m_wSize == 33)			ExpYE(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize);	}	pthread_mutex_unlock(&m_mutex);}void CYD20Mas::ExpYE(BYTE byAddr,BYTE*	pbyData,BYTE bySize){//	WORD wSOENum = 0;	BYTE* pbyTemp =	pbyData	+ 1;	WORD wDevNo	= m_subdevmgr.GetDevNoFrmAddr(byAddr);	YCData*	pData =	new	YCData [bySize/4];	DWORD* pdw =	(DWORD *)pbyTemp;	WORD w =0;	for	(;	w<bySize/4;  w++,pdw++)	{		pData[w].m_wDevNo = wDevNo;		pData[w].m_wDevPtNo = w+34;		float ffValue =	CHDW(*pdw);		pData[w].m_fValue = ffValue;	}	m_pAllMgr->YC(pData,w);	delete [] pData;}

⌨️ 快捷键说明

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