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

📄 bwdmas.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
字号:
#include "msystem.h"#include "BWDMas.h"void* BWDMaster(void *pVoid)//Period and Cycle	for	PRM=1; Wait	IND	for	PRM=0{	CBWDMas *pAS =	(CBWDMas *)pVoid;	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);	sleep(2);	while (1) {		pAS->Query();//		usleep(500000);	}}CBWDMas::~CBWDMas(){	if (m_hThread >	0)	{		cout <<	"CBWDMas" << m_hThread	<< endl;		pthread_cancel(m_hThread);	}}bool CBWDMas::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,BWDMaster,(void *)this) ==	0)		bRet = true;	pthread_attr_destroy(&attr);	return bRet;}void CBWDMas::Query(){	while (!m_subdevmgr.HasOn()) sleep(1);//	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:			GetData(byAddr);			break;		default:			break;		}	}	usleep(m_dwIntervalMS * 1000);}//void CBWDMas::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 CBWDMas::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 CBWDMas::GetData(BYTE byAddr){	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);	WORD* pData	= (WORD	*)FNSend.m_pbyData;	pData[0] = CW(0);	pData[1] = CW(5);	m_DLService.SetEchoLen(5+2*5);	if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send -	Respond	{		ExpData(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 CBWDMas::ExpData(BYTE byAddr,BYTE*	pbyData,BYTE bySize){	BYTE* pbyTemp =	pbyData	+ 1;	WORD wDevNo	= m_subdevmgr.GetDevNoFrmAddr(byAddr);	YCData*	pData =	new	YCData [bySize/2];	YXData*	pYXData	= new YXData [8];//8+6	WORD* pw =	(WORD *)pbyTemp;	WORD w =0;	for	(;	w<bySize/2;  w++,pw++)	{		if	(w == 0)		{			WORD wStatus = CW(*pw);			BYTE byA = 1;			for	(BYTE b=0; b<8;	b++,byA<<=1)			{				pYXData[b].m_wDevNo	= wDevNo;				pYXData[b].m_wDevPtNo =	b +	1;				pYXData[b].m_bValue	= (wStatus & byA)?0xff00:0xff;			}			m_pAllMgr->YX(pYXData, 8);		}		else		{			pData[w-1].m_wDevNo = wDevNo;			pData[w-1].m_wDevPtNo = w;			float ffValue =	CW(*pw)-((w==4)?0:0x23);			pData[w-1].m_fValue = ffValue;		}	}	m_pAllMgr->YC(pData,w-1);	delete [] pData;	delete [] pYXData;}

⌨️ 快捷键说明

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