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

📄 iec8705101.h

📁 一个通讯管理机的源代码。比较好用。推荐
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef _IEC8705101_H#define _IEC8705101_Husing namespace std;namespace IEC8705101{enum DataType{	DT_eSIQ=1,		DT_eSIQT=2,		DT_eDIQ=3,			DT_eDIQT=4,	DT_eVTI=5,		DT_eVTIQT=6,	DT_eBO=7,		DT_eNVAQ=9,	DT_eNVAQT=10,		DT_eBCR=15,	DT_eBCRT=16,	DT_eSEPT=17,	DT_eSPET=18,	DT_eOCIT=19,	DT_eSCD = 20,		DT_eNVA=21,	DT_eBCD=232,	DT_eDCO=46,	DT_eRCO=47,	DT_eSETVALUE=48,	DT_eSETBS=51,	DT_eCOI = 70,	DT_eQOI=100,	DT_eQCC=101,	DT_eREAD=102,		DT_eTime=103,	DT_eTEST=104,	DT_eRESET=105,		DT_eLOADPARA = 110,	DT_eACTPARA=113,};class CTimeTag{public:	CTimeTag(){}	void Setup(WORD wMiseconds,BYTE byMinutes,bool bIV = true)	{		m_nMiseconds = wMiseconds;		m_nMinutes = byMinutes;		m_bitIV = bIV;	}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			WORD *pMS = (WORD *)pBuf;			m_nMiseconds = *pMS;			BYTE byMinutes = *(pBuf+2);			m_nMinutes = byMinutes & 0x3f;			m_bitIV = (byMinutes & 0x80) ? 1 : 0;			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		unsigned short *pMS = (unsigned short *)pBuf;		*pMS = m_nMiseconds;		*(pBuf + 2) = (m_bitIV<<7) | m_nMinutes;		return GetLen();	}	static BYTE GetLen() {return (BYTE)3;}	WORD GetMilliSecs() {return m_nMiseconds%1000;}protected:	WORD m_nMiseconds;	BYTE m_nMinutes:6;	BYTE m_bitIV:1;	BYTE m_bitRES:1;};class CLTime : public CTimeTag{public:	CLTime(){}	void Setup(WORD wYear,BYTE byMonths,BYTE byDay,BYTE byWeek,BYTE byHours,BYTE byMinutes,WORD wMiseconds,bool bIV = true)	{		CTimeTag::Setup(byMinutes,wMiseconds,bIV);		m_bitYears = wYear;		m_bitMonths = byMonths;		m_bitDay = byDay;		m_bitWeek = byWeek;		m_bitHours = byHours;	}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			CTimeTag::FromBuf(pBuf,bySize);			pBuf += CTimeTag::GetLen();			m_bitHours = *pBuf & 0x1f;			m_bitSU = (*pBuf++&0x80) >> 7;			m_bitDay = *pBuf & 0x1f;			m_bitWeek = (*pBuf++&0xe0) >> 5;			m_bitMonths = *pBuf++ & 0xf;			m_bitYears = *pBuf & 0x7f;			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		CTimeTag::ToBuf(pBuf);		pBuf += CTimeTag::GetLen();		*pBuf++ = (BYTE) (m_bitSU<<7 + m_bitHours);		*pBuf++ = (BYTE) (m_bitWeek<<5 + m_bitDay);		*pBuf++ = (BYTE) m_bitMonths;		*pBuf++ = (BYTE) m_bitYears;		return GetLen();	}	static BYTE GetLen() {return (BYTE) 4 + CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eTime;}	void Convert(struct tm* ptm)	{		ptm->tm_year = 100+m_bitYears;		ptm->tm_mon = m_bitMonths-1;		ptm->tm_mday = m_bitDay;		ptm->tm_hour = m_bitHours;		ptm->tm_min = m_nMinutes;		ptm->tm_sec = m_nMiseconds/1000;	}	void GetCurrentTime()	{		struct tm t;		CTimeVal tv;		tv.GetTime(&t); // 21000 / 480		m_bitYears = t.tm_year -100;		m_bitMonths = t.tm_mon+1;		m_bitDay = t.tm_mday;		m_bitHours = t.tm_hour;		m_nMinutes = t.tm_min;		m_nMiseconds = t.tm_sec*1000 + tv.GetMilliSecs() + 21000 / 480;	}protected:	BYTE	m_bitSU:1; //夏时制	BYTE	m_bitHours:5;	BYTE	m_bitWeek:3;	BYTE	m_bitDay:5;	BYTE	m_bitMonths:4;	BYTE	m_bitYears:7;};class CSIQ{public:	CSIQ(){}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			m_bitIV = (pBuf[0] & 0x80) >> 7;			m_bitNT = (pBuf[0] & 0x40) >> 6;			m_bitSB = (pBuf[0] & 0x20) >> 5;			m_bitBL = (pBuf[0] & 0x10) >> 4;			m_bitSPI = pBuf[0] & 0x1;			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		pBuf[0] = 0;		pBuf[0] = (m_bitIV << 7) | (m_bitNT<<6) | (m_bitSB<<5) | (m_bitBL<<4) | (m_bitSPI);		return GetLen();	}	static BYTE GetLen(){return (BYTE)1;}	static DataType	GetDT() {return DT_eSIQ;}protected:	BYTE	m_bitSPI:1;//<1>:On/<0>:Off	BYTE	m_bitBL:1;//封锁	BYTE	m_bitSB:1;//	BYTE	m_bitNT:1;//<0>:当前值	BYTE	m_bitIV:1;//<0>:有效	BYTE	m_bitRES:3;};class CSIQT : public CSIQ,public CTimeTag{public:	CSIQT(){}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = (bySize >= GetLen()) ? true : false;		if (bRet)		{			CSIQ::FromBuf(pBuf,bySize);			CTimeTag::FromBuf(pBuf+CSIQ::GetLen() ,bySize-CSIQ::GetLen());		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		CSIQ::ToBuf(pBuf);		pBuf += CSIQ::GetLen();		CTimeTag::ToBuf(pBuf);		return GetLen();	}	static BYTE GetLen() {return CSIQ::GetLen() + CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eSIQT;}};class CDIQ{public:	CDIQ(){}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			m_bitIV = (pBuf[0] & 0x80) >> 7;			m_bitNT = (pBuf[0] & 0x40) >> 6;			m_bitSB = (pBuf[0] & 0x20) >> 5;			m_bitBL = (pBuf[0] & 0x10) >> 4;			m_bitDPI = pBuf[0] & 0x3;			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		pBuf[0] = 0;		pBuf[0] = (m_bitIV << 7) | (m_bitNT<<6) | (m_bitSB<<5) | (m_bitBL<<4) | m_bitDPI;		return GetLen();	}	static BYTE GetLen(){return (BYTE)1;}	static DataType	GetDT() {return DT_eDIQ;}protected:	BYTE	m_bitDPI:2;//<2>:On/<1>:Off	BYTE	m_bitBL:1;//封锁	BYTE	m_bitSB:1;//	BYTE	m_bitNT:1;//<0>:当前值	BYTE	m_bitIV:1;//<0>:有效	BYTE m_bitRES:2;};class CDIQT : public CDIQ,public CTimeTag{public:	CDIQT(){}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = (bySize >= GetLen()) ? true : false;		if (bRet)		{			CDIQ::FromBuf(pBuf,bySize);			pBuf += CDIQ::GetLen();			bySize -= CDIQ::GetLen();			CTimeTag::FromBuf(pBuf ,bySize);		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		CDIQ::ToBuf(pBuf);		pBuf += CDIQ::GetLen();		CTimeTag::ToBuf(pBuf);		return GetLen();	}	static BYTE GetLen(){return CDIQ::GetLen()+CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eDIQT;}};class CQDS//品质描述{public:	CQDS(){}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			m_bitIV = (pBuf[0] & 0x80) >> 7;			m_bitNT = (pBuf[0] & 0x40) >> 6;			m_bitSB = (pBuf[0] & 0x20) >> 5;			m_bitBL = (pBuf[0] & 0x10) >> 4;			m_bitOV = pBuf[0] & 0x1;			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		pBuf[0] = 0;		pBuf[0] = (m_bitIV << 7) | (m_bitNT<<6) | (m_bitSB<<5) | (m_bitBL<<4) | m_bitOV;		return GetLen();	}	static BYTE GetLen(){return (BYTE)1;}protected:	BYTE	m_bitOV:1;//<1>:溢出	BYTE	m_bitBL:1;//封锁	BYTE	m_bitSB:1;//	BYTE	m_bitNT:1;//<0>:当前值	BYTE m_bitIV:1;//<0>:有效	BYTE m_bitRES:3;};class CVTI //瞬变状态指示的值{public:	CVTI() {}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			m_bitT = (pBuf[0] & 0x80) >> 7;			m_bitS = (pBuf[0] & 0x40) >> 6;			m_bitValue = pBuf[0] & 0x2f;			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		pBuf[0] = 0;		pBuf[0] = (m_bitT << 7) | (m_bitS<<6) | m_bitValue;		return GetLen();	}	static BYTE GetLen(){return (BYTE)1;}	static DataType	GetDT() {return DT_eVTI;}protected:	BYTE	m_bitValue:6;//	BYTE	m_bitS:1;//signed	BYTE	m_bitT:1;//<0>:设备未在瞬变状态};class CVTIQT : public CVTI,public CQDS,public CTimeTag //瞬变状态指示的值{public:	CVTIQT(){}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = (bySize >= GetLen()) ? true : false;		if (bRet)		{			CVTI::FromBuf(pBuf,bySize);			pBuf += CVTI::GetLen();			bySize -= CVTI::GetLen();			CQDS::FromBuf(pBuf,bySize);			pBuf += CQDS::GetLen();			bySize -= CQDS::GetLen();			CTimeTag::FromBuf(pBuf ,bySize);		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		CVTI::ToBuf(pBuf);		pBuf += CVTI::GetLen();		CQDS::ToBuf(pBuf);		pBuf += CQDS::GetLen();		CTimeTag::ToBuf(pBuf);		return GetLen();	}	static BYTE GetLen(){return CVTI::GetLen()+CQDS::GetLen()+CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eVTIQT;}};class CSEPT : public CTimeTag //继电保护单个事件{public:	CSEPT(){}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			m_bitIV = (pBuf[0] & 0x80) >> 7;			m_bitNT = (pBuf[0] & 0x40) >> 6;			m_bitSB = (pBuf[0] & 0x20) >> 5;			m_bitBL = (pBuf[0] & 0x10) >> 4;			m_bitEI = (pBuf[0] & 0x8)>>3;			m_bitES = pBuf[0] & 0x3;			WORD* pw = (WORD *)&pBuf[1];			m_wPMilliSecs = *pw;			CTimeTag::FromBuf(&pBuf[3],bySize-3);			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		pBuf[0] = 0;		pBuf[0] = (m_bitIV << 7) | (m_bitNT<<6) | (m_bitSB<<5) | (m_bitBL<<4) | (m_bitEI<<3) | m_bitES;		return GetLen();	}	static BYTE GetLen(){return (BYTE)3+CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eSEPT;}protected:	BYTE	m_bitES:2;//<1>:OFF,<2>:ON 事件状态	BYTE	m_bitEI:1;//动作时间有效	BYTE	m_bitBL:1;//封锁	BYTE	m_bitSB:1;//<1>:被取代	BYTE	m_bitNT:1;//<0>:当前值	BYTE m_bitIV:1;//<0>:事件有效	BYTE m_bitRES:1;protected:	WORD m_wPMilliSecs;//动作持续时间};class CQDP // 继电保护装置的品质描述{public:	static BYTE GetLen(){return (BYTE)1;}	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			m_bitIV = (pBuf[0] & 0x80) >> 7;			m_bitNT = (pBuf[0] & 0x40) >> 6;			m_bitSB = (pBuf[0] & 0x20) >> 5;			m_bitBL = (pBuf[0] & 0x10) >> 4;			m_bitEI = (pBuf[0] & 0x8)>>3;			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		pBuf[0] = 0;		pBuf[0] = (m_bitIV << 7) | (m_bitNT<<6) | (m_bitSB<<5) | (m_bitBL<<4) | (m_bitEI<<3);		return GetLen();	}protected:	BYTE	m_bitEI:1;//动作时间有效	BYTE	m_bitBL:1;//封锁	BYTE	m_bitSB:1;//<1>:被取代	BYTE	m_bitNT:1;//<0>:当前值	BYTE m_bitIV:1;//<0>:事件有效	BYTE m_bitRES:3;};class CSPET : public CQDP,public CTimeTag{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			m_bitSRD = (pBuf[0] & 0x80) >> 5;			m_bitSIE = (pBuf[0] & 0x40) >> 4;			m_bitSL3 = (pBuf[0] & 0x20) >> 3;			m_bitSL2 = (pBuf[0] & 0x10) >> 2;			m_bitSL1 = (pBuf[0] & 0x8)>>1;			m_bitGS = pBuf[0] & 0x1;			bySize -= 1;			CQDP::FromBuf(&pBuf[1],bySize);			WORD* pw = (WORD *)&pBuf[2];			m_wPMilliSecs = *pw;			bySize -=2;			CTimeTag::FromBuf(&pBuf[4],bySize);			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		pBuf[0] = 0;		pBuf[0] = (m_bitSRD << 5) | (m_bitSIE<<4) | (m_bitSL3<<3) | (m_bitSL2<<2) | (m_bitSL1<<1) | m_bitGS;		CQDP::ToBuf(&pBuf[1]);		WORD* pw = (WORD *)&pBuf[2];		*pw = m_wPMilliSecs;		CTimeTag::ToBuf(&pBuf[4]);		return GetLen();	}	static BYTE GetLen(){return (BYTE)3 + CQDP::GetLen() + CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eSEPT;}protected:	BYTE m_bitGS:1;//总启动	BYTE m_bitSL1:1;//A相启动	BYTE m_bitSL2:1;//B相启动	BYTE m_bitSL3:1;//C相启动	BYTE m_bitSIE:1;//<1>:接地电流保护启动	BYTE m_bitSRD:1;//<1>:保护反向启动	BYTE m_bitRES:2;protected:	WORD m_wPMilliSecs;//动作持续时间};class COCIT : public CQDP,public CTimeTag{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			m_bitCL3 = (pBuf[0] & 0x20) >> 3;			m_bitCL2 = (pBuf[0] & 0x10) >> 2;			m_bitCL1 = (pBuf[0] & 0x8)>>1;			m_bitGC = pBuf[0] & 0x1;			bySize -= 1;			CQDP::FromBuf(&pBuf[1],bySize);			WORD* pw = (WORD *)&pBuf[2];			m_wPMilliSecs = *pw;			bySize -=2;			CTimeTag::FromBuf(&pBuf[4],bySize);			bRet = true;		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		pBuf[0] = 0;		pBuf[0] = (m_bitCL3<<3) | (m_bitCL2<<2) | (m_bitCL1<<1) | m_bitGC;		CQDP::ToBuf(&pBuf[1]);		WORD* pw = (WORD *)&pBuf[2];		*pw = m_wPMilliSecs;		CTimeTag::ToBuf(&pBuf[4]);		return GetLen();	}	static BYTE GetLen(){return (BYTE)3 + CQDP::GetLen() + CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eOCIT;}protected:	BYTE m_bitGC:1;//总命令输出至输出电路	BYTE m_bitCL1:1;//A相保护输出	BYTE m_bitCL2:1;//B相保护输出	BYTE m_bitCL3:1;//C相保护输出	BYTE m_bitRES:4;protected:	WORD m_wPMilliSecs;//动作持续时间};class CBCR //电能脉冲计数量{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			long* pl = (long *)pBuf;			m_lValue = *pl;			m_bitIV = (pBuf[4] & 0x80) >> 7;			m_bitCA = (pBuf[4] & 0x40) >> 6;			m_bitCY = (pBuf[4] & 0x30)>>5;			m_bitSQ = pBuf[4] & 0x1f;					}		return bRet;		}	BYTE ToBuf(BYTE * pBuf)	{		long* pl = (long *)pBuf;		*pl = m_lValue;		pBuf[4] = (m_bitIV<<7) | (m_bitCA<<6) | (m_bitCY<<5) | m_bitSQ;		return GetLen();	}	static BYTE GetLen(){return (BYTE)5;}	static DataType	GetDT() {return DT_eBCR;}protected:	BYTE	m_bitSQ:5;//顺序号	BYTE	m_bitCY:1;//<0>:在相应的累加周期内未溢出	BYTE	m_bitCA:1;//<0>:上次读数后计数器未被调整	BYTE m_bitIV:1;//<0>:有效	long m_lValue;};class CBCRT : public CBCR,public CTimeTag{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = (bySize >= GetLen()) ? true : false;		if (bRet)		{			CBCR::FromBuf(pBuf,bySize);			pBuf += CBCR::GetLen();			bySize -= CBCR::GetLen();			CTimeTag::FromBuf(pBuf ,bySize);		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		CBCR::ToBuf(pBuf);		pBuf += CBCR::GetLen();		CTimeTag::ToBuf(pBuf);		return GetLen();	}	static BYTE GetLen(){return CBCR::GetLen() + CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eBCRT;}};class CNVA//模拟量{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			short* psh = (short *)pBuf;			m_shValue = *psh;		}		return bRet;		}	BYTE ToBuf(BYTE * pBuf)	{		short* psh = (short *)pBuf;		*psh = m_shValue;		return GetLen();	}	static BYTE GetLen(){return (BYTE)2;}	static DataType	GetDT() {return DT_eNVA;}protected:	short	m_shValue;//};class CNVAQ : public CNVA,public CQDS{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = (bySize >= GetLen()) ? true : false;		if (bRet)		{			CNVA::FromBuf(pBuf,bySize);			pBuf += CNVA::GetLen();			bySize -= CNVA::GetLen();			CQDS::FromBuf(pBuf,bySize);		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		CNVA::ToBuf(pBuf);		pBuf += CNVA::GetLen();		CQDS::ToBuf(pBuf);		return GetLen();	}	static BYTE GetLen(){return CNVA::GetLen()+CQDS::GetLen();}	static DataType	GetDT() {return DT_eNVAQ;}protected:};class CNVAQT : public CNVAQ,public CTimeTag{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = (bySize >= GetLen()) ? true : false;		if (bRet)		{			CNVAQ::FromBuf(pBuf,bySize);			pBuf += CNVAQ::GetLen();			bySize -= CNVAQ::GetLen();			CTimeTag::FromBuf(pBuf,bySize);		}		return bRet;	}	BYTE ToBuf(BYTE * pBuf)	{		CNVAQ::ToBuf(pBuf);		pBuf += CNVAQ::GetLen();		CTimeTag::ToBuf(pBuf);		return GetLen();	}	static BYTE GetLen(){return CNVAQ::GetLen()+CTimeTag::GetLen();}	static DataType	GetDT() {return DT_eNVAQT;}};class CSetVal //设定值和上、下限值{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{			short* psh = (short *)pBuf;			m_shValue = *psh;			m_bitS_E = (pBuf[4] & 0x80)>>7;			m_bitQL = pBuf[4] & 0x7f;					}		return bRet;		}	BYTE ToBuf(BYTE * pBuf)	{		short* psh = (short *)pBuf;		*psh = m_shValue;		pBuf[2] = (m_bitS_E<<7) | m_bitQL;		return GetLen();	}	static BYTE GetLen(){return (BYTE)3;}	static DataType	GetDT() {return DT_eSETVALUE;}	short GetValue() {return m_shValue;}protected:	short	m_shValue;//	BYTE		m_bitS_E:1;//<0>:执行;<1>:选择	BYTE		m_bitQL:7; //	};class CBCD : public CQDS{public:	bool FromBuf(BYTE* pBuf,BYTE bySize)	{		bool bRet = false;		if (bySize >= GetLen())		{

⌨️ 快捷键说明

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