📄 dnp3frame.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 + -