📄 dnp3.h
字号:
#ifndef DNP3_H#define DNP3_H#include "msystem.h"#include <math.h>#include "dnp3ycset.h"#include "dnp3yxset.h"#include "dnp3ykset.h"#include "dnp3ddset.h"struct struIINs //IIN: internal indications{ WORD bitRecvBroadcast:1; WORD bitReadyFor1Class:1; WORD bitReadyFor2Class:1; WORD bitReadyFor3Class:1; WORD bitRequestClockSync:1; WORD bitLocalCtrl:1; WORD bitDevFault:1; WORD bitRestart:1; WORD bitFCNotComplete:1; WORD bitNoQueryData:1; WORD bitQueryError:1; WORD bitMemOverflow:1; WORD bitRequestAck:1; WORD bitCnfgFail:1; WORD bitReserved:2;};struct struFlag{ BYTE bitOnLine:1; BYTE bitRestart:1; BYTE bitCommLost:1; BYTE bitRemoteForcedData:1; BYTE bitLocalForcedData:1; BYTE bitRollOver:1; BYTE bitReserved:1; BYTE bitState:1; //yx};struct struCtrlBlk { BYTE byCode:4; BYTE bitQueue:1; BYTE bitClear:1; BYTE byTrip:2; BYTE byCount; WORD wOnMS; WORD wOffMS; BYTE byStatus:7; BYTE byReserved:1;};class CDNP3YKInfo{public: CDNP3YKInfo(WORD wIndex) { m_wIndex = wIndex; } CDNP3YKInfo(CDNP3YKSet& setYK) { m_wIndex = setYK.m_wRouteNo&0xff; m_wDevNo = setYK.m_wDevNo; m_wDevPubAddr = setYK.m_wPointNo; m_bSelected = false; } bool operator<(CDNP3YKInfo info) const { bool bRet = false; if (m_wIndex< info.m_wIndex) bRet = true; return bRet; } bool operator ==(CDNP3YKInfo info) const { bool bRet = false; if (m_wIndex == info.m_wIndex) bRet = true; return bRet; } bool operator !=(CDNP3YKInfo info) const { bool bRet = false; if (m_wIndex != info.m_wIndex) bRet = true; return bRet; } WORD m_wIndex;//<=255 WORD m_wDevNo; WORD m_wDevPubAddr; bool m_bSelected; bool m_bOn; CTimeVal m_tv; void Cancel() { m_bSelected = false; } void Select(bool bOn) { m_bSelected = true; m_bOn = bOn; m_tv.GetCurrentTime(); } bool Operate(WORD& wDevNo,WORD& wDevPubAddr,bool& bOn) { bool bRet = false; if (m_bSelected) { CTimeVal tv; CTimeValSpan tvs = tv-m_tv; if (tvs.GetASecs() < 20) { wDevNo = m_wDevNo; wDevPubAddr = m_wDevPubAddr; bOn = m_bOn; bRet = true; } } m_bSelected = false; return bRet; }};typedef vector<CDNP3YKInfo> CDNP3YKVector;class CDNP3YKInfos{public: void Load(); void Sort() { sort(m_setYKInfo.begin(),m_setYKInfo.end()); } bool Select(WORD wIndex,bool bOn) { bool bRet = false; CDNP3YKVector::iterator pDNP3YKInfo = lower_bound(m_setYKInfo.begin(),m_setYKInfo.end(),CDNP3YKInfo(wIndex)); if ((pDNP3YKInfo != m_setYKInfo.end()) && (pDNP3YKInfo->m_wIndex == wIndex)) { pDNP3YKInfo->Select(bOn); bRet = true; } return bRet; } bool Operate(WORD wIndex,WORD& wDevNo,WORD& wDevPubAddr,bool& bOn) { bool bRet = false; CDNP3YKVector::iterator pDNP3YKInfo = lower_bound(m_setYKInfo.begin(),m_setYKInfo.end(),CDNP3YKInfo(wIndex)); if ((pDNP3YKInfo != m_setYKInfo.end()) && (pDNP3YKInfo->m_wIndex == wIndex)) bRet = pDNP3YKInfo->Operate(wDevNo,wDevPubAddr,bOn); return bRet; } bool Cancel(WORD wIndex) { bool bRet = false; CDNP3YKVector::iterator pDNP3YKInfo = lower_bound(m_setYKInfo.begin(),m_setYKInfo.end(),CDNP3YKInfo(wIndex)); if ((pDNP3YKInfo != m_setYKInfo.end()) && (pDNP3YKInfo->m_wIndex == wIndex)) { pDNP3YKInfo->Cancel(); bRet = true; } return bRet; } void Add(CDNP3YKSet& setYK) { CDNP3YKInfo d(setYK); m_setYKInfo.push_back(d); }protected: CDNP3YKVector m_setYKInfo;};class CDNP3YXInfo{public: CDNP3YXInfo(WORD wIndex) { m_wIndex = wIndex; m_bChanged = false; BYTE* pby = (BYTE *)&m_flag; *pby = 0; m_flag.bitOnLine = 0; m_flag.bitRestart = 1; } CDNP3YXInfo(CDNP3YXSet& setYX) { m_wIndex = setYX.m_wLocalNo; m_wDevNo = setYX.m_dwYXNo/10000; m_wDevPubAddr = setYX.m_dwYXNo%10000; BYTE* pby = (BYTE *)&m_flag; *pby = 0; m_flag.bitOnLine = 0; m_flag.bitRestart = 1; m_bChanged = false; m_flag.bitState = false; } bool operator <(CDNP3YXInfo info) const { bool bRet = false; if (m_wIndex < info.m_wIndex) bRet = true; return bRet; } bool operator ==(CDNP3YXInfo info) const { bool bRet = false; if (m_wIndex == info.m_wIndex) bRet = true; return bRet; } bool operator !=(CDNP3YXInfo info) const { bool bRet = false; if (m_wIndex != info.m_wIndex) bRet = true; return bRet; } WORD m_wIndex; WORD m_wDevNo; WORD m_wDevPubAddr; bool m_bChanged; struFlag m_flag; WORD GetIndex() {return m_wIndex;} BYTE GetFlag() {BYTE* pby = (BYTE *)&m_flag;m_bChanged = false;return *pby;} bool SetValue(bool bValue)//ret==true:产生变位遥信 { if ((m_flag.bitState != bValue) || (m_flag.bitRestart == 1) || (m_flag.bitOnLine == 0)) m_bChanged = true; m_flag.bitRestart = 0; m_flag.bitOnLine = 1; m_flag.bitState = bValue?1:0; return m_bChanged; } bool GetValue(){m_bChanged = false;return (m_flag.bitState==1)?true:false;}};typedef vector<CDNP3YXInfo> CDNP3YXVector;typedef map<CDevFactor,CDNP3YXVector::iterator,less<CDevFactor> > CDNP3YXMap;class CDNP3YXInfos{public: void Sort() { sort(m_setYXInfo.begin(),m_setYXInfo.end()); CDNP3YXVector::iterator p = m_setYXInfo.begin(); for ( ;p != m_setYXInfo.end(); p++) { CDevFactor df(p->m_wDevNo,p->m_wDevPubAddr);// cout << "DNP3YXNo: " << p->m_wDevNo << "|" << p->m_wDevPubAddr << endl; m_mapYXInfo.insert(CDNP3YXMap::value_type(df,p)); } } void Load(); void SetValue(WORD wDevNo,WORD wDevPubAddr,bool bValue) { CDNP3YXVector::iterator it = m_setYXInfo.end(); CDNP3YXMap::iterator p = m_mapYXInfo.find(CDevFactor(wDevNo,wDevPubAddr)); if (p != m_mapYXInfo.end()) { pair<CDevFactor,CDNP3YXVector::iterator> temp = *p; it = temp.second; } if (it != m_setYXInfo.end()) it->SetValue(bValue); } bool GetValue(WORD wIndex,BYTE* pData,WORD& wSize,BYTE byType)//0:=all; 1:=0xf0; ... { bool bRet = false; CDNP3YXInfo x(wIndex); CDNP3YXVector::iterator it = lower_bound(m_setYXInfo.begin(),m_setYXInfo.end(),x); if ((it!=m_setYXInfo.end()) && (it->m_wIndex == wIndex)) { BYTE* pby = (BYTE *)&pData[wSize]; if (byType == 2) { *pby = it->GetFlag(); wSize += 1; bRet = true; } } return bRet; } bool GetAllValues(BYTE* pData,WORD& wSize,BYTE byType) //byType:=Variation { bool bRet = false; CDNP3YXVector::iterator it = m_setYXInfo.begin(); WORD w=0; WORD www = 0; for (;it!=m_setYXInfo.end();w++,it++) { if (byType == 1) { if (w%8 == 0) pData[w/8] = 0; pData[w/8] |= ((BYTE)(it->GetValue()?1:0) << (w%8)); } else if (byType == 2) { BYTE* pbyFlag = (BYTE *)&pData[www]; *pbyFlag++ = it->GetFlag(); wSize += 1; www += 1; } bRet = true; } if (byType == 1) wSize += (w-1)/8 + (((w-1)%8)?1:0); return bRet; } WORD GetChangedValues(BYTE* pData,WORD& wSize,BYTE byType) //byType:=Variation { WORD wRet = 0; WORD www = 0; CDNP3YXVector::iterator it = m_setYXInfo.begin(); for (;it!=m_setYXInfo.end();it++) { if (it->m_bChanged) { WORD* pw = (WORD *)&pData[www]; *pw++ = it->GetIndex(); wSize += 2; www += 2; BYTE* pbyFlag = (BYTE *)pw; *pbyFlag++ = it->GetFlag(); wSize += 1; www += 1; wRet++; } } return wRet; } bool HasChanged() { bool bRet = false; CDNP3YXVector::iterator it = m_setYXInfo.begin(); for (;it!=m_setYXInfo.end();it++) { if (it->m_bChanged) { bRet = true; break; } } return bRet; } void Add(CDNP3YXSet& set) { CDNP3YXInfo d(set); m_setYXInfo.push_back(d); } WORD GetSize() { return m_setYXInfo.size(); }protected: CDNP3YXVector m_setYXInfo; CDNP3YXMap m_mapYXInfo;};class CDNP3YCInfo{public: CDNP3YCInfo(WORD wIndex) { m_wIndex = wIndex; BYTE* pby = (BYTE *)&m_flag; *pby = 0; m_flag.bitOnLine = 0; m_flag.bitRestart = 1; m_bChanged = false; } CDNP3YCInfo(CDNP3YCSet& setYC) { m_wIndex = setYC.m_wLocalNo;//pstruDNP3->m_wPubAddr&0xff; m_wDevNo = setYC.m_dwYCNo/10000; m_wDevPubAddr = setYC.m_dwYCNo%10000; m_fCoef = setYC.m_fCoef; m_fDeadband = setYC.m_fDeadband; if (setYC.m_dwYCNo == 0) m_bValid = true; else m_bValid = false; BYTE* pby = (BYTE *)&m_flag; *pby = 0; m_flag.bitOnLine = 0; m_flag.bitRestart = 1; m_bChanged = false; } bool operator <(CDNP3YCInfo info) const { bool bRet = false; if (m_wIndex < info.m_wIndex) bRet = true; return bRet; } bool operator ==(CDNP3YCInfo info) const { bool bRet = false; if (m_wIndex == info.m_wIndex) bRet = true; return bRet;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -