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

📄 pm500mal.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
字号:
#include "pm500mal.h"#include "allmgr.h"CPM500Mas::~CPM500Mas(){	if (m_hThread > 0)	{		cout << "PM500Mas" << m_hThread << endl;		pthread_cancel(m_hThread);	}}void* PM500Master(void *pVoid)//Period and Cycle for PRM=1; Wait IND for PRM=0{	CPM500Mas *pAS = (CPM500Mas *)pVoid;	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);	while (1) {		pAS->Run();	}}bool CPM500Mas::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,PM500Master,(void *)this) == 0)		bRet = true;	pthread_attr_destroy(&attr);	return bRet;}void CPM500Mas::Run(){	while (m_DLService.Status() != 0) sleep(1);	CFrameNode FNSend;	CFrameNode FNRecv;	int nEcho = GetPeriod(FNSend);	pthread_mutex_lock(&m_mutex);	//nEcho=0:Send no reply;=1:Send - Respond;=-1:No send;	WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(FNSend.m_byDesAddr );	if ((nEcho!=-1) && (m_DLService.REQ((BYTE) nEcho,&FNSend,FNRecv,(BYTE) 0,true) == 1))	{		ExplainRESP(&FNRecv);		if (m_wBreakCount[FNSend.m_byDesAddr ] > 5)		{			YXData d;			d.m_wDevNo = wDevNo;			d.m_wDevPtNo = 199;			d.m_bValue = false;			m_pAllMgr->YX(&d, 1);		}		m_wBreakCount[FNSend.m_byDesAddr ] = 0;	}	else	{		if (m_wBreakCount[FNSend.m_byDesAddr ] > 5)		{			YXData d;			d.m_wDevNo = wDevNo;			d.m_wDevPtNo = 199;			d.m_bValue = true;			m_pAllMgr->YX(&d, 1);		}		else m_wBreakCount[FNSend.m_byDesAddr ]++;	}	pthread_mutex_unlock(&m_mutex);}int CPM500Mas::GetPeriod(CFrameNode& fn) //ret -1:no send data; 0:no echo frame; 1:have echo frame//bool CPM500Mas::GetSendData(CFrameNode& fn){	int nRet = -1;	while (!m_subdevmgr.HasOn()) sleep(1);	while (m_subdevmgr.GetNum() != 10) sleep(1);	if((m_bySendOrder++>=1) || (m_bySendNo == 0xff))	{		m_bySendOrder = 0;		m_bySendNo = m_subdevmgr.GetNextNo(m_bySendNo);	}	switch(m_bySendOrder)	{	case 0:		GetYC(m_bySendNo,fn,0x300,0x30);		nRet = 1;		break;	case 1:		GetYC(m_bySendNo,fn,0x356,0x34);		nRet = 1;		break;	}	return nRet;}void CPM500Mas::ExplainRESP(CFrameNode* pFNRecv)//void CPM500Mas::ExplainRecvData(BYTE* pbyInBuf,WORD wInSize){	BYTE* pbyData = pFNRecv->m_pbyData;	BYTE bySize = (BYTE) pFNRecv->m_wSize;	if (pbyData && bySize)	{		BYTE byAddr = pFNRecv->m_bySrcAddr;		ExpYCData(byAddr,pbyData,bySize);	}}void CPM500Mas::GetYC(BYTE byNo,CFrameNode& fn,WORD wAddr,BYTE byLen){	BYTE byAddr = m_subdevmgr.GetAddrFrmNo(m_bySendNo);	if (byAddr == 0xff) return;	fn.m_byDesAddr = byAddr;	fn.m_byCID = 0x3;	fn.SetSize(4);	WORD* pData = (WORD *)fn.m_pbyData;	pData[0] = CW(wAddr);	pData[1] = CW(byLen);	m_DLService.SetEchoLen(5+byLen*2);}void CPM500Mas::ExpYCData(BYTE byAddr,BYTE* pbyData,BYTE bySize){	BYTE* pbyTemp = pbyData + 1;	WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr);	YCData* pData = new YCData [bySize/4];	DWORD* pdwOrigValue = (DWORD *)pbyTemp;	for (WORD w=0; w<bySize/4; w++)	{		pData[w].m_wDevNo = wDevNo;		pData[w].m_wDevPtNo = w + 1 + ((m_bySendOrder%2)?(0x56/2):0);				if (((pData[w].m_wDevPtNo >=16) && (pData[w].m_wDevPtNo <= 24))			|| (pData[w].m_wDevPtNo ==12)  || (pData[w].m_wDevPtNo ==13)			|| ((pData[w].m_wDevPtNo >=52) && (pData[w].m_wDevPtNo <= 55)))		{			DWORD dwValue = CDW(*pdwOrigValue++);			int* pInt = (int *)&dwValue;			pData[w].m_fValue = *pInt;		}		else pData[w].m_fValue =  CDW(*pdwOrigValue++);			}	m_pAllMgr->YC(pData,(WORD)bySize/4);//	MailYC(m_subdevmgr.GetDeviceNo(byNo),pData, wSendSize);	delete pData;}

⌨️ 快捷键说明

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