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

📄 dnp3frame.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
字号:
#include "DNP3Frame.h"////////////////////////////////////////////////////////////////WORD CDNP3Frame::GetCRC(BYTE* byData,WORD wLen){	WORD X;	static const WORD crctable[256] = {//DNPcrc校验表 0x3d65 	0x0000,0x365e,0x6cbc,0x5ae2,0xd978,0xef26,0xb5c4,0x839a,0xff89,0xc9d7,0x9335,0xa56b,0x26f1,0x10af,0x4a4d,0x7c13,	0xb26b,0x8435,0xded7,0xe889,0x6b13,0x5d4d,0x07af,0x31f1,0x4de2,0x7bbc,0x215e,0x1700,0x949a,0xa2c4,0xf826,0xce78,	0x29af,0x1ff1,0x4513,0x734d,0xf0d7,0xc689,0x9c6b,0xaa35,0xd626,0xe078,0xba9a,0x8cc4,0x0f5e,0x3900,0x63e2,0x55bc,	0x9bc4,0xad9a,0xf778,0xc126,0x42bc,0x74e2,0x2e00,0x185e,0x644d,0x5213,0x08f1,0x3eaf,0xbd35,0x8b6b,0xd189,0xe7d7,	0x535e,0x6500,0x3fe2,0x09bc,0x8a26,0xbc78,0xe69a,0xd0c4,0xacd7,0x9a89,0xc06b,0xf635,0x75af,0x43f1,0x1913,0x2f4d,	0xe135,0xd76b,0x8d89,0xbbd7,0x384d,0x0e13,0x54f1,0x62af,0x1ebc,0x28e2,0x7200,0x445e,0xc7c4,0xf19a,0xab78,0x9d26,	0x7af1,0x4caf,0x164d,0x2013,0xa389,0x95d7,0xcf35,0xf96b,0x8578,0xb326,0xe9c4,0xdf9a,0x5c00,0x6a5e,0x30bc,0x06e2,	0xc89a,0xfec4,0xa426,0x9278,0x11e2,0x27bc,0x7d5e,0x4b00,0x3713,0x014d,0x5baf,0x6df1,0xee6b,0xd835,0x82d7,0xb489,	0xa6bc,0x90e2,0xca00,0xfc5e,0x7fc4,0x499a,0x1378,0x2526,0x5935,0x6f6b,0x3589,0x03d7,0x804d,0xb613,0xecf1,0xdaaf,	0x14d7,0x2289,0x786b,0x4e35,0xcdaf,0xfbf1,0xa113,0x974d,0xeb5e,0xdd00,0x87e2,0xb1bc,0x3226,0x0478,0x5e9a,0x68C4,	0x8f13,0xb94d,0xe3af,0xd5f1,0x566b,0x6035,0x3ad7,0x0c89,0x709a,0x46c4,0x1c26,0x2a78,0xa9e2,0x9fbc,0xc55e,0xf300,	0x3d78,0x0b26,0x51c4,0x679a,0xe400,0xd25e,0x88bc,0xbee2,0xc2f1,0xf4af,0xae4d,0x9813,0x1b89,0x2dd7,0x7735,0x416b,	0xf5e2,0xc3bc,0x995e,0xaf00,0x2c9a,0x1ac4,0x4026,0x7678,0x0a6b,0x3c35,0x66d7,0x5089,0xd313,0xe54d,0xbfaf,0x89f1,	0x4789,0x71d7,0x2b35,0x1d6b,0x9ef1,0xa8af,0xf24d,0xc413,0xb800,0x8e5e,0xd4bc,0xe2e2,0x6178,0x5726,0x0dc4,0x3b9a,	0xdc4d,0xea13,0xb0f1,0x86af,0x0535,0x336b,0x6989,0x5fd7,0x23c4,0x159a,0x4f78,0x7926,0xfabc,0xcce2,0x9600,0xa05e,	0x6e26,0x5878,0x029a,0x34c4,0xb75e,0x8100,0xdbe2,0xedbc,0x91af,0xa7f1,0xfd13,0xcb4d,0x48d7,0x7e89,0x246b,0x1235	};	X = 0;	for (WORD i=0;i<wLen; i++)		X = (X / 256) ^ (crctable[(X % 256) ^ byData[i]]) ;	return (X ^ 0xffff);}bool CDNP3Frame::FrameToBuffer(CDataNode &dn){	bool bRet = false;	if(m_bIsSetup) 	{ 		BYTE* pbyTemp = dn.m_pbyData;		BYTE* pbyHTemp = pbyTemp;		WORD wDataSize = GetDataSize();//		dn.m_wSize = GetSize();//2*(wDataSize/16 + (wDataSize%16?1:0)) +wDataSize + 10;		dn.SetSize(GetSize());		WORD* pwTemp;		*pbyTemp++ = 0x05;		*pbyTemp++ = 0x64;		//len		*pbyTemp++ = wDataSize + 5;		*pbyTemp++ = m_byCID; 		pwTemp = (WORD *)pbyTemp;		*pwTemp++ = m_wDAddr;		*pwTemp++ = m_wSAddr;		*pwTemp++ = GetCRC(pbyHTemp,8);		for (BYTE b=0; b<wDataSize; b+=16)		{			pbyHTemp = pbyTemp = (BYTE *)pwTemp;			BYTE byLen = ((wDataSize-b)>16) ? 16 : (BYTE)(wDataSize-b);			memcpy(pbyTemp,&m_pData[b],byLen);			pbyTemp += byLen;			pwTemp = (WORD *)pbyTemp;			*pwTemp++ = GetCRC(pbyHTemp,byLen);		}		bRet = true;	} 	return bRet;}void CDNP3Frame::SetupFrame(CFrameNode *pFNSend){	m_wDAddr = pFNSend->m_wDAddr;	m_wSAddr = pFNSend->m_wSAddr;	if (pFNSend->m_pbyData && pFNSend->m_wSize)	{		m_wLength = pFNSend->m_wSize;		memcpy(m_pData,pFNSend->m_pbyData,pFNSend->m_wSize);	}	else m_wLength = 0;	m_byCID = pFNSend->m_byCID;	m_bIsSetup = true;}void CDNP3Frame::FrameToBuf(CFrameNode& fn){	fn.m_byCID = m_byCID;	fn.m_wSAddr = m_wSAddr;	fn.m_wDAddr = m_wDAddr;	fn.m_wSize = m_wLength;	if (fn.m_wSize > 0)	{		fn.SetSize(fn.m_wSize);		memcpy(fn.m_pbyData,m_pData,fn.m_wSize);	}}bool CDNP3Frame::BufferToFrame(CDQue* pPhyDQ){	Reset();	CDataNode* pdn;	bool bRet = false;	while (pPhyDQ->Get(pdn,50))	{		if (m_wInLength + pdn->m_wSize > DATAQUEUESIZE)		{			delete pdn;			break;		}		memcpy(&m_pbyInBuf[m_wInLength],pdn->m_pbyData,pdn->m_wSize);		m_wInLength += pdn->m_wSize;		delete pdn;		if (m_wInLength>2)		{			if ((m_pbyInBuf[0] == 0x5) && (m_pbyInBuf[1] == 0x64))			{				if (m_wInLength >= 8)				{					BYTE byLen = m_pbyInBuf[2];					if (byLen < 5) break;					WORD wSize = ((byLen-5) /16 + ((byLen-5)%16 ? 1 : 0))*2 + byLen + 5;					if (m_wInLength >= wSize)					{						BYTE* pbyTemp = m_pbyInBuf;						BYTE* pbyHTemp = pbyTemp;						WORD* pwTemp;						pbyTemp += 8;						pwTemp = (WORD *)pbyTemp;						if (*pwTemp++ != GetCRC(pbyHTemp,8))							break;						wSize -= 10;						bRet = true;						for (BYTE b=0; b<wSize; b+=18)						{							pbyHTemp = pbyTemp = (BYTE *)pwTemp;							BYTE byLen = ((wSize-b)>18) ? 18 : (BYTE)(wSize-b);							if (byLen > 2)							{								pbyTemp += byLen-2;								pwTemp = (WORD *)pbyTemp;								if (*pwTemp++ == GetCRC(pbyHTemp,byLen-2))									bRet = true;								else								{									bRet = false;									break;								}							}							else							{								bRet = false;								break;							}						}						break;					}				}			}			else break;		}	}	if (bRet)	{/*cout << endl <<"IND:";for (WORD w=0; w<m_wInLength; w++){	char c[16];	sprintf(c," %02x" ,m_pbyInBuf[w]);	cout << c;}cout <<endl;*/		BYTE* pbyTemp = m_pbyInBuf;		WORD* pwTemp;		pbyTemp += 2;		m_wLength = *pbyTemp++ - 5;		m_byCID = *pbyTemp++;			pwTemp = (WORD *)pbyTemp;		m_wDAddr = *pwTemp++;		m_wSAddr = *pwTemp++;		pwTemp++;		pbyTemp = (BYTE *)pwTemp;		for (BYTE b=0; b<m_wLength; b+=16)		{			BYTE byLen = ((m_wLength-b)>16) ? 16 : (BYTE)(m_wLength-b);			memcpy(m_pData+b,pbyTemp,byLen);			pbyTemp += byLen+2;		}	}	return bRet;}

⌨️ 快捷键说明

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