📄 iec8705101.h
字号:
#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 + -