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

📄 dnp3tl.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
字号:
// TLayer.cpp: implementation of the CTLayer class.////////////////////////////////////////////////////////////////////////#include "dnp3tl.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CDNP3TL::CDNP3TL(CSerialPortDef* pChannel,bool bDIR,WORD wSrcAddr,WORD wDesAddr)	: m_DLService(pChannel,bDIR,wSrcAddr,wDesAddr){}CDNP3TL::~CDNP3TL(){}int CDNP3TL::IND(CFrameNode& FNRecv){	CFrameNode* pFNRecv1;	int nIndications = 0;	if (m_DLService.IND(pFNRecv1) > 0)	{		if (pFNRecv1->m_wSize == 1)		{			nIndications = 2;//通信回合失败			m_queIND.RemoveAll();			delete pFNRecv1;		}		else if (pFNRecv1->m_wSize)		{			bool bAdd = false;			if ((pFNRecv1->m_pbyData[0]&0x40) == 0x40)			{				m_bySequence = pFNRecv1->m_pbyData[0] & 0x3f;				if (m_queIND.Size())					m_queIND.RemoveAll();				m_queIND.Add(pFNRecv1);				bAdd = true;			}			else if (m_queIND.Size())			{				BYTE bySequence = pFNRecv1->m_pbyData[0] & 0x3f;				if ((m_bySequence+1)%64 == bySequence)				{					m_queIND.Add(pFNRecv1);					m_bySequence++;					bAdd = true;				}			}			if (bAdd)			{				if ((pFNRecv1->m_pbyData[0]&0x80) == 0x80)				{					if (Combination(&FNRecv))						nIndications = 1;					else nIndications = 2;				}			}			else delete pFNRecv1;		}	}	return nIndications;}int CDNP3TL::REQ(BYTE byService,CFrameNode *pFNSend,BYTE byPriority/*0:H;1:L*/,bool bRetry){	int nRet = 0; //success	WORD wCount = Separation(pFNSend);	for (WORD w=0; w<wCount; w++)	{		CFrameNode* pfn;		if (m_queREQ.Get(pfn))		{			nRet = m_DLService.REQ(byService,pfn,byPriority,bRetry);			delete pfn;		}		if (nRet) //0 := ok		{			m_queREQ.RemoveAll();			break;		}	}	return nRet;}bool CDNP3TL::Combination(CFrameNode* pfn) //认为srcaddr恒等{	bool bRet = false;	for (int nCount=0; nCount<m_queIND.Size(); nCount++)	{		CFrameNode* pfnTemp;		m_queIND.Get(pfnTemp);		if (nCount == 0)		{			pfn->m_wDAddr = pfnTemp->m_wDAddr;			pfn->m_wSAddr = pfnTemp->m_wSAddr;		}		pfn->AddData(pfnTemp->m_pbyData+1,pfnTemp->m_wSize-1);		delete pfnTemp;		bRet = true;	}	return bRet;}WORD CDNP3TL::Separation(CFrameNode* pfn) //retval =: queREQ.size(){	WORD wRet = 0;	m_queREQ.RemoveAll();	if (pfn->m_pbyData && pfn->m_wSize)	{		wRet = pfn->m_wSize/249 + (pfn->m_wSize%249 ? 1 : 0);		BYTE abyBuf[250];		for (WORD w=0; w< wRet; w++)		{			abyBuf[0] = w%64;			if (w==0) abyBuf[0] |= 0x40;			if (w+1 == wRet) abyBuf[0] |= 0x80;			WORD wSize = pfn->m_wSize - w * 249;			if (wSize > 249) wSize = 249;			memcpy(abyBuf+1,pfn->m_pbyData + w * 249,wSize);			timeval tv;			gettimeofday(&tv,NULL);			// this can lead to memory leak			CFrameNode* pfnTemp = new CFrameNode(tv,abyBuf,wSize+1,pfn->m_wDAddr,pfn->m_wSAddr);			m_queREQ.Add(pfnTemp);		}	}	return wRet;}

⌨️ 快捷键说明

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