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