📄 asdu.cpp
字号:
pDataSet = m_DataSets.at(i); Data.Add(pDataSet->gin.GROUP); Data.Add(pDataSet->gin.ENTRY); Data.Add(pDataSet->kod); for (int j=0; j<(int)sizeof(pDataSet->gdd.byte); j++) { Data.Add(pDataSet->gdd.byte[j]); } Data.Append(pDataSet->gid); } Data.FreeExtra();}void CAsdu10::ExplainAsdu(CFaultExplain& FExplain){ m_RII = m_ASDUData[0]; m_NGD.byte = m_ASDUData[1]; GIN gin; gin.GROUP = m_ASDUData[2]; gin.ENTRY = m_ASDUData[3]; m_ASDUData.RemoveAt(0, 5); FExplain.m_ActTime = 0; FExplain.m_FAN = 0; FExplain.m_FaultDistance = 0.0; FExplain.m_iType = 0; FExplain.m_MaxFaultCurrent = 0.0; FExplain.m_MaxZeroCurrent = 0.0; FExplain.m_szFaultPhase = ""; if (gin.ENTRY == 1)//最大故障电流 { if (m_ASDUData.GetAt(0) == 0xcd && m_ASDUData.GetAt(1) == 0x0f && m_ASDUData.GetAt(2) == 0x01) { m_ASDUData.RemoveAt(0, 3); memcpy(&FExplain.m_MaxFaultCurrent, m_ASDUData.GetData(), sizeof(float)); m_ASDUData.RemoveAt(0, sizeof(float)); memcpy(&FExplain.m_ActTime, m_ASDUData.GetData(), sizeof(WORD)); m_ASDUData.RemoveAt(0, sizeof(WORD)); memcpy(&FExplain.m_FAN, m_ASDUData.GetData(), sizeof(WORD)); m_ASDUData.SetSize(0); FExplain.m_iType = 1; } } else if (gin.ENTRY == 2)//最大零序电流 { if (m_ASDUData.GetAt(0) == 0xcd && m_ASDUData.GetAt(1) == 0x0f && m_ASDUData.GetAt(2) == 0x01) { m_ASDUData.RemoveAt(0, 3); memcpy(&FExplain.m_MaxZeroCurrent, m_ASDUData.GetData(), sizeof(float)); m_ASDUData.RemoveAt(0, sizeof(float)); memcpy(&FExplain.m_ActTime, m_ASDUData.GetData(), sizeof(WORD)); m_ASDUData.RemoveAt(0, sizeof(WORD)); memcpy(&FExplain.m_FAN, m_ASDUData.GetData(), sizeof(WORD)); m_ASDUData.SetSize(0); FExplain.m_iType = 2; } } else if (gin.ENTRY == 3)//短路位置 { if (m_ASDUData.GetAt(0) == 0x17 && m_ASDUData.GetAt(1) == 0x16 && m_ASDUData.GetAt(2) == 0x01) { m_ASDUData.RemoveAt(0, 6); memcpy(&FExplain.m_FaultDistance, m_ASDUData.GetData(), sizeof(float)); m_ASDUData.RemoveAt(0, 17); memcpy(&FExplain.m_FAN, m_ASDUData.GetData(), sizeof(WORD)); m_ASDUData.SetSize(0); FExplain.m_iType = 3; } } else if (gin.ENTRY == 4)//故障选相 { if (m_ASDUData.GetAt(0) == 0x17 && m_ASDUData.GetAt(1) == 0x13 && m_ASDUData.GetAt(2) == 0x01) { m_ASDUData.RemoveAt(0, 6); BYTE btmp = m_ASDUData.GetAt(0); FExplain.m_szFaultPhase = ""; if ((btmp&0x01) == 1) FExplain.m_szFaultPhase += "A"; if ((btmp&0x02) == 2) FExplain.m_szFaultPhase += "B"; if ((btmp&0x04) == 4) FExplain.m_szFaultPhase += "C"; if ((btmp&0x08) == 8) FExplain.m_szFaultPhase += "N"; m_ASDUData.RemoveAt(0, 14); memcpy(&FExplain.m_FAN, m_ASDUData.GetData(), sizeof(WORD)); m_ASDUData.SetSize(0); FExplain.m_iType = 4; } }}/////////// ASDU21 /////////CAsdu21::CAsdu21(){ m_TYP = 0x15; m_VSQ.byte = 0x81; m_COT = 0x2a; m_FUN = 0xfe; m_INF = 0xf1; m_RII = 0x00; m_DataSets.clear(); m_DataSets.setAutoDelete(true);}CAsdu21::~CAsdu21(){ m_DataSets.clear();}void CAsdu21::BulidArray(CByteArray& Data){ if (m_NOG != m_DataSets.count()) { m_iResult = 0; return; } m_iResult = 1; Data.SetSize(0); Data.Add(m_TYP); Data.Add(m_VSQ.byte); Data.Add(m_COT); Data.Add(m_Addr); Data.Add(m_FUN); Data.Add(m_INF); Data.Add(m_RII); Data.Add(m_NOG); DataSet* pDataSet = NULL; for (int i=0; i<m_NOG; i++) { pDataSet = m_DataSets.at(i); Data.Add(pDataSet->gin.GROUP); Data.Add(pDataSet->gin.ENTRY); Data.Add(pDataSet->kod); } Data.FreeExtra();}/////////// ASDU23 /////////void CAsdu23::ExplainAsdu(int iProcessType /* =0 */){ if (iProcessType == 0)//标准103的ASDU23的解释处理 { if (m_ASDUData.GetSize() != (int)(m_VSQ.vsq.num*10*sizeof(BYTE))) { m_ASDUData.SetSize(0); m_iResult = 0; return; } DistrubDataTable DDTable; m_iResult = 1; for (int i=0; i<m_VSQ.vsq.num; i++) { DDTable.addr = m_Addr; DDTable.FAN = *(WORD*)(m_ASDUData.GetData()); DDTable.SOF = m_ASDUData[2]; memcpy(DDTable.Cp56Time.byte, m_ASDUData.GetData()+3, sizeof(DDTable.Cp56Time.byte)); m_DDTables.Add(DDTable); m_ASDUData.RemoveAt(0, 10); } } m_ASDUData.SetSize(0);}/////////// ASDU24 /////////CAsdu24::CAsdu24(){ m_TYP = 0x18; m_VSQ.byte = 0x81; m_COT = 0x1f; m_TOO = 0x00; m_TOV = 0x00; m_FAN = 0; m_ACC = 0x00;}void CAsdu24::BulidArray(CByteArray& Data){ Data.SetSize(11); Data.FreeExtra(); m_iResult = 1; Data.SetAt(0, m_TYP); Data.SetAt(1, m_VSQ.byte); Data.SetAt(2, m_COT); Data.SetAt(3, m_Addr); Data.SetAt(4, m_FUN); Data.SetAt(5, m_INF); Data.SetAt(6, m_TOO); Data.SetAt(7, m_TOV); Data.SetAt(10, m_ACC); memcpy(&Data[8], &m_FAN, 2*sizeof(BYTE));}/////////// ASDU25 /////////CAsdu25::CAsdu25(){ m_TYP = 0x19; m_VSQ.byte = 0x81; m_COT = 0x1f; m_TOO = 0x00; m_TOV = 0x00; m_FAN = 0; m_ACC = 0x00;}void CAsdu25::BulidArray(CByteArray& Data){ Data.SetSize(11); Data.FreeExtra(); m_iResult = 1; Data.SetAt(0, m_TYP); Data.SetAt(1, m_VSQ.byte); Data.SetAt(2, m_COT); Data.SetAt(3, m_Addr); Data.SetAt(4, m_FUN); Data.SetAt(5, m_INF); Data.SetAt(6, m_TOO); Data.SetAt(7, m_TOV); Data.SetAt(10, m_ACC); memcpy(&Data[8], &m_FAN, 2*sizeof(BYTE));}/////////// ASDU26 /////////CAsdu26::CAsdu26(){ m_TOV = 0x00; m_FAN = 0; m_NOF = 0; m_NOC = 0x00; m_NOE = 0; m_INT = 0; memset(m_Cp32Time.byte, 0x00, sizeof(m_Cp32Time.byte));}void CAsdu26::ExplainAsdu(int iProcessType /* =0 */){ if (iProcessType == 0)//标准103的ASDU26的解释处理 { if (m_ASDUData.GetSize() != 15*sizeof(BYTE)) { m_ASDUData.SetSize(0); m_iResult = 0; return; } m_iResult = 1; m_TOV = m_ASDUData[1]; m_ASDUData.RemoveAt(0, 2); m_FAN = *(WORD*)(m_ASDUData.GetData()); m_ASDUData.RemoveAt(0, 2); m_NOF = *(WORD*)(m_ASDUData.GetData()); m_ASDUData.RemoveAt(0, 2); m_NOC = m_ASDUData[0]; m_ASDUData.RemoveAt(0); m_NOE = *(WORD*)(m_ASDUData.GetData()); m_ASDUData.RemoveAt(0, 2); m_INT = *(WORD*)(m_ASDUData.GetData()); m_ASDUData.RemoveAt(0, 2); memcpy(m_Cp32Time.byte, m_ASDUData.GetData()+11, sizeof(m_Cp32Time.byte)); } m_ASDUData.SetSize(0);}/////////// ASDU27 /////////CAsdu27::CAsdu27(){ m_TOV = 0x00; m_FAN = 0; m_ACC = 0x00; m_RPV = 0.0; m_RSV = 0.0; m_RFA = 0.0;}void CAsdu27::ExplainAsdu(int iProcessType /* =0 */){ if (iProcessType == 0)//标准103的ASDU27的解释处理 { if (m_ASDUData.GetSize() != 17*sizeof(BYTE)) { m_ASDUData.SetSize(0); m_iResult = 0; return; } m_iResult = 1; m_TOV = m_ASDUData[1]; m_FAN = *(WORD*)(m_ASDUData.GetData()+2); m_ACC = m_ASDUData[4]; m_RPV = *(float*)(m_ASDUData.GetData()+5); m_RSV = *(float*)(m_ASDUData.GetData()+9); m_RFA = *(float*)(m_ASDUData.GetData()+13); } m_ASDUData.SetSize(0);}/////////// ASDU28 /////////CAsdu28::CAsdu28(){ m_FAN = 0;}void CAsdu28::ExplainAsdu(int iProcessType /* =0 */){ if (iProcessType == 0)//标准103的ASDU28的解释处理 { if (m_ASDUData.GetSize() != 4*sizeof(BYTE)) { m_ASDUData.SetSize(0); m_iResult = 0; return; } m_iResult = 1; m_FAN = *(WORD*)(m_ASDUData.GetData()+2); } m_ASDUData.SetSize(0);}/////////// ASDU29 /////////CAsdu29::CAsdu29(){}void CAsdu29::ExplainAsdu(int iProcessType /* =0 */){ if (iProcessType == 0)//标准103的ASDU29的解释处理 { if (m_ASDUData.GetSize() >= 3) { if (m_ASDUData.GetSize() != (int)((5+m_ASDUData.GetAt(2)*3)*sizeof(BYTE))) { m_ASDUData.SetSize(0); m_iResult = 0; return; } m_iResult = 1; m_FAN = *(WORD*)(m_ASDUData.GetData()); } else { m_ASDUData.SetSize(0); m_iResult = 0; return; } } m_ASDUData.RemoveAt(0, 2); m_ASDUData.FreeExtra();}/////////// ASDU30 /////////CAsdu30::CAsdu30(){ m_TOV = 0x00; m_FAN = 0;}void CAsdu30::ExplainAsdu(int iProcessType /* =0 */){ if (iProcessType == 0)//标准103的ASDU30的解释处理 { if (m_ASDUData.GetSize() >= 7) { BYTE btmp = m_ASDUData.GetAt(5); if (m_ASDUData.GetSize() != (int)((8+btmp*2)*sizeof(BYTE))) { m_ASDUData.SetSize(0); m_iResult = 0; return; } m_iResult = 1; m_ASDUData.RemoveAt(0); m_TOV = m_ASDUData[0]; m_FAN = *(WORD*)(m_ASDUData.GetData()+1); } else { m_ASDUData.SetSize(0); m_iResult = 0; return; } } m_ASDUData.RemoveAt(0, 3); m_ASDUData.FreeExtra();}/////////// ASDU31 /////////CAsdu31::CAsdu31(){ m_TOO = 0x00; m_TOV = 0x00; m_FAN = 0; m_ACC = 0x00;}void CAsdu31::ExplainAsdu(int iProcessType /* =0 */){ if (iProcessType == 0)//标准103的ASDU31的解释处理 { if (m_ASDUData.GetSize() != 5) { m_ASDUData.SetSize(0); m_iResult = 0; return; } m_iResult = 1; m_TOO = m_ASDUData[0]; m_TOV = m_ASDUData[1]; m_FAN = *(WORD*)(m_ASDUData.GetData()+2); m_ACC = m_ASDUData[4]; } m_ASDUData.SetSize(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -