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

📄 dnp3.h

📁 一个通讯管理机的源代码。比较好用。推荐
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -