📄 103device.cpp~
字号:
{ Data.SetSize(0); if (ReceData(Data)) { if ((*it).DCD.DevToCtrl.FunCode == 11) { (*it).bLinkStatus = true; } else (*it).bLinkStatus = false; } else return false; } else return false; return true;}bool C103Device::ResetFCB(){ CByteArray Data; (*it).CCD.byte = 0x47; Data.SetSize(0); if (SendData(Data)) { Data.SetSize(0); if (ReceData(Data)) { if (!m_bHaveL1UserData) { if (!RequestL2UserData()) return false; } int itimes = 0; while (m_bHaveL1UserData) { if (!RequestL1UserData()) return false;//之后一直是一级用户数据 if (m_ReceData.GetSize() == 0) { if (itimes++ > 5) break; } else { itimes = 0; ProcessData(); } } } else return false; } else return false; return true;}bool C103Device::ResetCU(){ (*it).bInit = false;//设初始化状态为否 CByteArray Data; (*it).CCD.byte = 0x40; Data.SetSize(0); if (SendData(Data)) { Data.SetSize(0); if (ReceData(Data)) { if (!m_bHaveL1UserData)//此处应该是有一级用户数据,没有只在请求一次,也可认为完成. { if (!RequestL2UserData()) return false; } int itimes = 0; while (m_bHaveL1UserData) { if (!RequestL1UserData()) return false; if (m_ReceData.GetSize() == 0) { if (itimes++ > 10) break; } else itimes = 0; if (m_ReceData.GetSize() > 0) ProcessData(); } } else return false; } else return false; (*it).bInit = true; return true;}bool C103Device::RequestL1UserData(){ CByteArray Data; (*it).CCD.CtrlToDev.FCV = 1; (*it).CCD.CtrlToDev.PRM = 1; FlibFCB(); (*it).CCD.CtrlToDev.FunCode = 10; m_ReceData.SetSize(0); Data.SetSize(0); if (SendData(Data)) { Data.SetSize(0); if (ReceData(Data)) { if (Data.GetSize() > 0) { m_ReceData.Copy(Data); m_ReceData.FreeExtra(); Data.SetSize(0); } } else return false; } else return false; return true;}bool C103Device::RequestL2UserData(){ CByteArray Data; (*it).CCD.CtrlToDev.FCV = 1; (*it).CCD.CtrlToDev.PRM = 1; FlibFCB(); (*it).CCD.CtrlToDev.FunCode = 11; Data.SetSize(0); if (SendData(Data)) { Data.SetSize(0); if (ReceData(Data)) { if (Data.GetSize() > 0)//此处可加上对循环上送的报文的处理 { } Data.SetSize(0); } else return false; } else return false; return true;}bool C103Device::SendAsdu21(BYTE iGroup, BYTE iEntry, BYTE iKod){ CAsdu21 a21; a21.m_Addr = (*it).AsduAddress; a21.m_INF = 0xf1;//241 a21.m_NOG = 1; DataSet* pDataSet = new DataSet; pDataSet->gin.GROUP = iGroup; pDataSet->gin.ENTRY = iEntry; pDataSet->kod = iKod; a21.m_DataSets.append(pDataSet); CByteArray sData; a21.BulidArray(sData); if (!SendConfirm(sData)) return false; return true;}bool C103Device::SendAsdu24(WORD iFAN, BYTE iTOO, BYTE iTOV, BYTE iACC){ CAsdu24 a24; a24.m_Addr = (*it).AsduAddress; a24.m_FUN = (*it).FunCode; a24.m_FAN = iFAN; a24.m_TOO = iTOO; a24.m_TOV = iTOV; a24.m_ACC = iACC; CByteArray sData; a24.BulidArray(sData); if (!SendConfirm(sData)) return false; return true;}bool C103Device::SendAsdu25(WORD iFAN, BYTE iTOO, BYTE iTOV, BYTE iACC){ CAsdu25 a25; a25.m_Addr = (*it).AsduAddress; a25.m_FUN = (*it).FunCode; a25.m_FAN = iFAN; a25.m_TOO = iTOO; a25.m_TOV = iTOV; a25.m_ACC = iACC; CByteArray sData; a25.BulidArray(sData); if (!SendConfirm(sData)) return false; return true;}bool C103Device::SendConfirm(CByteArray& sData){ (*it).CCD.CtrlToDev.FCV = 1; (*it).CCD.CtrlToDev.PRM = 1; FlibFCB(); (*it).CCD.CtrlToDev.FunCode = 3; CByteArray rData; int itimes = 3; if (sData.GetSize() > 0) { while (itimes > 0) { if (!SendData(sData)) { sData.SetSize(0); return false; } if (ReceData(rData)) { if (rData.GetSize() > 0)//防止在回复命令时带有一级用户数据 { m_ReceData.SetSize(0); m_ReceData.Copy(rData); m_ReceData.FreeExtra(); ProcessData(); rData.SetSize(0); } if ((*it).DCD.DevToCtrl.FunCode == 0) break; else if ((*it).DCD.DevToCtrl.FunCode == 1) { (*it).bLinkBusy = true; return false; } else return false; } else if (m_bCommError == true) return false; itimes--; } if (itimes == 0) return false; } return true;}bool C103Device::SendNoConfirm(CByteArray& sData){//FCB位不用变位 (*it).CCD.CtrlToDev.FCV = 0; (*it).CCD.CtrlToDev.PRM = 1; (*it).CCD.CtrlToDev.FunCode = 4; if (sData.GetSize() > 0) { if (!SendData(sData)) { sData.SetSize(0); return false; } } sData.SetSize(0); return true;}bool C103Device::GI(){ CAsdu07 a7; a7.m_Addr = (*it).AsduAddress; a7.m_SCN = 0x00; m_bGIFinished = false; CByteArray sData; a7.BulidArray(sData); if (!SendConfirm(sData)) { FlibFCB(); return false; } return true;}void C103Device::ProcessData(){ if (m_ReceData.GetSize() == 0) return; switch (m_ReceData[0]) { case 0x01://asdu01 ProcessAsdu1(); break; case 0x02://asdu02 ProcessAsdu2(); break; case 0x03://asdu03 ProcessAsdu3(); break; case 0x04://asdu04 ProcessAsdu4(); break; case 0x06://asdu06 ProcessAsdu6(); break; case 0x08://asdu08 ProcessAsdu8(); break; case 0x09://asdu09 ProcessAsdu9(); break; case 0x0a://asdu10 ProcessAsdu10(); break; case 0x17://asdu23 ProcessAsdu23(); break; case 0x1A://asdu26 ProcessAsdu26(); break; case 0x1B://asdu27 ProcessAsdu27(); break; case 0x1C://asdu28 ProcessAsdu28(); break; case 0x1D://asdu29 ProcessAsdu29(); break; case 0x1E://asdu30 ProcessAsdu30(); break; case 0x1F://asdu31 ProcessAsdu31(); break; default : m_ReceData.SetSize(0); break;}}void C103Device::ProcessAsdu1(){ CAsdu01 a1; a1.SaveAsdu(m_ReceData); a1.ExplainAsdu(); if (a1.m_COT == 9)//申请开关量的数据 { CString sztmp = "", szfun = "", szinf = ""; sztmp.sprintf("%d", (*it).CpuNo); szfun.sprintf("%d", a1.m_FUN); szinf.sprintf("%d", a1.m_INF); QDomNode node, cnode; node = m_pxml->GetDomNode("body", "SWITCH", "pcpuno", sztmp); if (node.isNull()) return; if (!m_pxml->GetNodeAttr(node, "group", sztmp)) return; int igroup = sztmp.toInt(); if (!m_pxml->GetNodeAttr(node, "cpuno", sztmp)) return; int icpuno = sztmp.toInt(); cnode = m_pxml->GetChildNode(node, "ELEMENT", "pfun", szfun, "pinf", szinf); if (cnode.isNull()) return; if (!m_pxml->GetNodeAttr(cnode, "pfun", szfun)) return; int ifun = szfun.toInt(); if (!m_pxml->GetNodeAttr(cnode, "pinf", szinf)) return; int iinf = szinf.toInt(); if (!m_pxml->GetNodeAttr(cnode, "entry", sztmp)) return; int ientry = sztmp.toInt(); if (!m_pxml->GetNodeAttr(cnode, "desc", sztmp)) return; st_switchvalue SwitchValue; memset(&SwitchValue, 0x00, sizeof(st_switchvalue)); SwitchValue.m_StationNo = g_PublicClass.m_StationNo; SwitchValue.m_MachineNo = m_DevInfo.m_EquipNo; SwitchValue.m_CpuNo = icpuno; SwitchValue.m_FunCode = ifun; SwitchValue.m_EventCode = iinf; SwitchValue.m_GroupNo = igroup; SwitchValue.m_Entry = ientry; SwitchValue.m_State = a1.m_Dpi.dpi.dpi; if (SwitchValue.m_State == 1) strcpy(SwitchValue.m_Value, m_szSDpi1); else strcpy(SwitchValue.m_Value, m_szSDpi2); m_SwitchValue.Add(SwitchValue); } else if (a1.m_COT == 1) { CString sztmp = "", szfun = "", szinf = "", szDate = ""; sztmp.sprintf("%d", (*it).CpuNo); szfun.sprintf("%d", a1.m_FUN); szinf.sprintf("%d", a1.m_INF); QDomNode node, cnode; int ifun = 0, iinf = 0, ientry = 0, igroup = 0, icpuno = 0; CDataNode* pNode = NULL; QDate date = QDate::currentDate(); st_event* pRpt_Event = NULL; st_eventact* pEventAct = NULL; node = m_pxml->GetDomNode("body", "ALERT", "pcpuno", sztmp); if (node.isNull()) goto fault; if (!m_pxml->GetNodeAttr(node, "group", sztmp)) return; igroup = sztmp.toInt(); if (!m_pxml->GetNodeAttr(node, "cpuno", sztmp)) return; icpuno = sztmp.toInt(); cnode = m_pxml->GetChildNode(node, "ELEMENT", "pfun", szfun, "pinf", szinf); if (cnode.isNull()) return; if (!m_pxml->GetNodeAttr(cnode, "pfun", szfun)) return; ifun = szfun.toInt(); if (!m_pxml->GetNodeAttr(cnode, "pinf", szinf)) return; iinf = szinf.toInt(); if (!m_pxml->GetNodeAttr(cnode, "entry", sztmp)) return; ientry = sztmp.toInt(); if (!m_pxml->GetNodeAttr(cnode, "desc", sztmp)) return; pRpt_Event = new st_event; memset(pRpt_Event, 0x00, sizeof(st_event)); pEventAct = new st_eventact; memset(pEventAct, 0x00, sizeof(st_eventact)); pRpt_Event->m_StationNo = g_PublicClass.m_StationNo; pRpt_Event->m_MachineNo = m_DevInfo.m_EquipNo; pRpt_Event->m_CpuNo = icpuno; pRpt_Event->m_Entry = 0; pRpt_Event->m_FaultNum = ++m_iFaultNo; strcpy(pRpt_Event->m_MachineName, m_DevInfo.m_Equipment); szDate.sprintf("%04d%02d%02d%02d%02d%02d%03d", date.year(), date.month(), date.day(), a1.m_Cp32Time.Time.Hours, a1.m_Cp32Time.Time.Minutes, a1.m_Cp32Time.Time.Milliseconds/1000, a1.m_Cp32Time.Time.Milliseconds%1000); memcpy(pRpt_Event->m_ActionTime, szDate.data(), szDate.length()); pEventAct->m_MachineNo = m_DevInfo.m_EquipNo; pEventAct->m_CpuNo = icpuno; pEventAct->m_FaultNum = m_iFaultNo; pEventAct->m_ActNo = 0; pEventAct->m_ActTime = 0; pEventAct->m_Dpi = a1.m_Dpi.dpi.dpi; if (a1.m_Dpi.dpi.dpi == 1) sztmp += m_szDpi1; else sztmp += m_szDpi2; memcpy(pEventAct->m_ActElement, sztmp.data(), sztmp.length()); pEventAct->m_FunCode = ifun; pEventAct->m_EventCode = iinf; pEventAct->m_GroupNo = igroup; pEventAct->m_Entry = ientry; pNode = new CDataNode(); memcpy(&pNode->m_nodeinfo, &m_CmdInfo, sizeof(st_nodeinfo)); pNode->m_nodeinfo.mtype = g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype; pNode->m_nodeinfo.requestid = g_PublicClass.m_SelfPid; pNode->m_nodeinfo.m_iResult = 1; pNode->m_nodeinfo.m_SegmentPid = (long)pRpt_Event; pNode->m_nodeinfo.m_iSize = sizeof(st_event); pNode->m_nodeinfo.m_DataType = DATA_EVENT; g_PublicClass.m_NodeManage.AddSendDataNode((void*)pNode); pNode = new CDataNode(); memcpy(&pNode->m_nodeinfo, &m_CmdInfo, sizeof(st_nodeinfo)); pNode->m_nodeinfo.mtype = g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype; pNode->m_nodeinfo.requestid = g_PublicClass.m_SelfPid; pNode->m_nodeinfo.m_iResult = 1; pNode->m_nodeinfo.m_SegmentPid = (long)pEventAct; pNode->m_nodeinfo.m_iSize = sizeof(st_eventact); pNode->m_nodeinfo.m_DataType = DATA_EVENTACT; g_PublicClass.m_NodeManage.AddSendDataNode((void*)pNode); pNode = new CDataNode(); memcpy(&pNode->m_nodeinfo, &m_CmdInfo, sizeof(st_nodeinfo)); pNode->m_nodeinfo.mtype = g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype; pNode->m_nodeinfo.requestid = g_PublicClass.m_SelfPid; pNode->m_nodeinfo.m_iResult = m_iFaultNo; pNode->m_nodeinfo.m_SegmentPid = (long)0; pNode->m_nodeinfo.m_iSize = 0; pNode->m_nodeinfo.m_DataType = DATA_EVENTOVER; g_PublicClass.m_NodeManage.AddSendDataNode((void*)pNode); node = m_pxml->GetDomNode("body", "DEVCONFIG"); sztmp.sprintf("%s", m_DevInfo.m_Equipment); cnode = m_pxml->GetChildNode(node, "FAULTNO", "devname", sztmp); sztmp.sprintf("%d", m_iFaultNo); m_pxml->InsertNodeAttr(cnode, "value", sztmp); m_pxml->SaveXmlFile(); return; fault://某些103保护也用ASDU1送故障信息,如国电南自PSL系列串口通信保护 node = m_pxml->GetDomNode("body", "FAULT", "pcpuno", sztmp); if (node.isNull()) goto fault; if (!m_pxml->GetNodeAttr(node, "group", sztmp)) return; igroup = sztmp.toInt(); if (!m_pxml->GetNodeAttr(node, "cpuno", sztmp)) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -