📄 nrlan103.cpp
字号:
{ GroupHandler (a10); return; } if (a10.m_COT == 0x02) //循环上送数据,暂不处理 { } else if (a10.m_COT == 0x01) //突发数据 { msg = "bust asdu10"; communicator.printData (NULL, 0, msg.data (), 1); DataSet *pDataSet = NULL; QString szgroup = "", szentry = "", szcpuno = "", sztmp ="", szcpuaddr = "", szdevaddr = ""; szcpuaddr.sprintf ("%d", a10.m_Addr); szdevaddr.sprintf ("%d", m_DevInfo.m_MachineAddr);#ifndef USE_LIBXML2 QDomNode node, cnode; node = m_pxml->GetDomNode (QString("body"),QString("config")/*, "devaddr",szdevaddr*/); node = m_pxml->GetChildNode(node,"CPUCONFIG", "index","1",NULL,NULL);#else Node node,attrNode; XPathProcessor xprc(*m_pConfDoc); Element rootElem=m_pConfDoc->getRootElement(); node=xprc.selectSingleNode(rootElem,"//CPUCONFIG[@index='1']");#endif ///temp solution szcpuno="1"; ///m_pxml->GetNodeAttr (node, "cpuno", szcpuno); if (!node.isNull ()) { for (int i = 0; i < (int) a10.m_NGD.byte; i++) { pDataSet = a10.m_DataSets.at (i); szgroup.sprintf ("%d", pDataSet->gin.GROUP); szentry.sprintf ("%d", pDataSet->gin.ENTRY);#ifndef USE_LIBXML2 cnode = m_pxml->GetChildNode (node, "GROUP", "value", szgroup.data(),NULL,NULL);#else char exprBuff[100]; bzero(exprBuff,100); sprintf(exprBuff,"GROUP[@value='%s']/charc",szgroup.data()); attrNode=xprc.selectSingleNode(node,exprBuff);#endif#ifndef USE_LIBXML2 if (m_pxml->GetNodeAttr (cnode, "charc", sztmp)) {#else if(!attrNode.isNull()) { sztmp=attrNode.value().c_str();#endif if (sztmp == "FAULT") { communicator.printData (NULL, 0, "bust asdu10,will process fault", 1); ProcessFault (szcpuno.toInt (), pDataSet); } else if (sztmp == "ALERT") { communicator.printData (NULL, 0, "bust asdu10,will process alert", 1); ProcessAlert (szcpuno.toInt (), pDataSet); } else if (sztmp == "SWITCH") { communicator.printData (NULL, 0, "bust asdu10,will process switch", 1); ProcessSwitch (szcpuno.toInt (), pDataSet); } else { cout<<*this<<"[ERROR][CNRLan103::ProcessAsdu10(CAsdu& a)]bust asdu10,unreconize section charc value="<<sztmp<<endl; } } } } else { // msg.sprintf ("can not get CPUCONFIG with addr=%s\tdevaddr=%s", // szcpuaddr.data (), szdevaddr.data ()); // communicator.printData (NULL, 0, msg.data (), 1); cout<<*this<<"[ERROR][CNRLan103::ProcessAsdu10(CAsdu& a)]can not loacte //CPUCONFIG[@index='1']"<<endl; } } else //命令数据 { ProcessGroup (a10); if (!m_CmdParam.isEmpty () || a10.m_NGD.ngd.Cont != 0) //命令还没有全部做完 { cmdit = m_CmdParam.at (0); if (a10.m_NGD.ngd.Cont == 0) { if ((*cmdit).type == 7) { ///do nothing } else if ((*cmdit).type == 10) { SendAsdu10 (); } else if ((*cmdit).type == 21) { SendAsdu21 (); } } } else //命令已经全部做完 { if (m_bNeedInit == true) { ///printf ("unexpect return in cmd,need init=true\n"); m_bNeedInit = false; m_bCmding = false; return; } int datatype=0; int size=-1; st_paramvalue* values=NULL; QString paramType; if (m_CmdInfo.m_DataType == WM_REQUESTSWITCHVALUE) //申请开关量 { paramType="SWITCH"; if (m_SwitchValue.GetSize () == 0) { ///may be needed to print some message here return; } size=m_SwitchValue.GetSize(); values =new st_paramvalue[size]; memset (values, 0x00,sizeof(st_paramvalue) * m_SwitchValue.GetSize()); for (int i = 0; i < m_SwitchValue.GetSize (); i++) { memcpy (&values[i], &m_SwitchValue[i],sizeof (st_paramvalue)); } datatype = DATA_REQUESTSWITCHVALUE; m_SwitchValue.SetSize (0); } else { if (m_GroupValue.GetSize () <= 0) { ///may be needed to print some message here return; } size=m_GroupValue.GetSize(); values =new st_paramvalue[size]; memset (values, 0x00,sizeof(st_paramvalue) * m_GroupValue.GetSize ()); for (int i = 0; i < m_GroupValue.GetSize (); i++) { memcpy (&values[i], &m_GroupValue[i],sizeof (st_paramvalue)); } m_GroupValue.SetSize (0); if (m_CmdInfo.m_DataType == WM_REQUESTPARAMVALUE) //申请定值 { datatype = DATA_REQUESTPARAMVALUE; paramType="PARAM"; } else if (m_CmdInfo.m_DataType == WM_REQUESTPVSECTOR) //申请定值区号 { datatype = DATA_REQUESTSECTOR; paramType="SECTOR"; } else if (m_CmdInfo.m_DataType == WM_REQUESTANLOGVALUE) //申请采样值 { datatype = DATA_REQUESTANLOGVALUE; paramType="ANALOG"; } else if (m_CmdInfo.m_DataType == WM_REQUESTSHUVALUE) //申请压板状态 { datatype = DATA_REQUESTSHIFTVALUE; paramType="RYABAN"; } else if (m_CmdInfo.m_DataType == WM_GENERALCOMMAND) //通用分类命令 { msg.sprintf("device %d name %s at %d\n\tWM_GENERALCOMMAND finished\n", m_DevInfo.m_MachineNo, m_DevInfo.m_MachineName, m_DevInfo.m_MachineAddr); ///communicator.printData (NULL, 0, msg.data (), 1); paramType=this->GetParamType(values[1].m_Group); datatype = DATA_GENERALCOMMAND; } } bool b = m_dp.InsertParam(this->m_hdbc, static_cast<QString>(m_CmdInfo.m_UniqueCmd), paramType, values, size*sizeof(st_paramvalue)); delete values; this->AnswerCommand(datatype,"","PARAMVALUE",(b==true)?0:-1); ///g_PublicClass.m_NodeManage.AddSendDataNode ((void *) pNode); SendMsgToMain (1, "执行成功"); m_bCmding = false; } } a.m_ASDUData.Append (a10.m_ASDUData);}/*! \fn CNRLan103::ProcessAsdu23(CAsdu& a) */void CNRLan103::ProcessAsdu23(CAsdu& a){ /// @todo implement me QString szTime; szTime.sprintf("%d",time(NULL)); g_PublicClass.m_Ini.SetKeyIntValue ("config", "RECE2TIME", time(NULL)); if (m_bWaving||collecting) { printf("collecting %d\tm_bWaving %d\tm_bCmding %d\n",collecting,m_bWaving,m_bCmding); m_bWaving=false; return; } QString msg; msg.sprintf ("CNRLan103::ProcessAsdu23(CAsdu& a)\n"); communicator.printData (NULL, 0, msg.data (), 1); CAsdu23 a23 (a); a23.ExplainAsdu(); a.m_ASDUData.Append (a23.m_ASDUData); if (m_iWaveFlag == 1 && a23.m_VSQ.byte > 0) { QString sztmp = "", szdevname = "", szcpuno = "", szkey = "", szlast = "", szcpuaddr = "", szdevaddr = ""; szdevname.sprintf ("%s", m_DevInfo.m_MachineName); szcpuaddr.sprintf ("%d", a23.m_Addr); szkey.sprintf ("CPU%d-LASTWAVETIME", a23.m_Addr); szdevaddr.sprintf ("%d", m_DevInfo.m_MachineAddr); szlast =m_szLastWaveTime; cout<<*this<<"[DEBUG][CNRLan103::ProcessAsdu23(CAsdu& a)]szlast="<<szlast.data()<<endl;#ifndef USE_LIBXML2 QDomNode noded, nodec, cnode; // noded = m_pxml->GetDomNode (QString("body"),QString("DEVCONFIG")); nodec = m_pxml->GetDomNodex (QString("body"), "CPUCONFIG", "index","1",NULL,NULL/*, "devaddr",szdevaddr*/); ///m_pxml->GetNodeAttr (nodec, "cpuno", szcpuno); szcpuno="1"; if (cnode.isNull ()) /*return; */ { //szlast = "00000000000000000"; }#else Element rootElem=m_pConfDoc->getRootElement(); XPathProcessor xprc(*m_pConfDoc); Node node=xprc.selectSingleNode(rootElem,"//CPUCONFIG[@index='1']");#endif //m_pxml->GetNodeAttr (cnode, "value", szlast); //for debug // for (int i=0;i<m_DDTable.GetSize();i++) // { // sztmp.sprintf ("%04d%02d%02d%02d%02d%05d", // m_DDTable[i].Cp56Time.Time.Years + 2000, // m_DDTable[i].Cp56Time.Time.Months, // m_DDTable[i].Cp56Time.Time.DaysOfMonth, // m_DDTable[i].Cp56Time.Time.Hours, // m_DDTable[i].Cp56Time.Time.Minutes, // m_DDTable[i].Cp56Time.Time.Milliseconds); // printf("table element\t %s\n",sztmp.data()); // } // printf("###################\n"); for (int i = 0; i < a23.m_VSQ.byte; i++) { sztmp.sprintf ("%04d%02d%02d%02d%02d%05d", a23.m_DDTables[i].Cp56Time.Time.Years + 2000, a23.m_DDTables[i].Cp56Time.Time.Months, a23.m_DDTables[i].Cp56Time.Time.DaysOfMonth, a23.m_DDTables[i].Cp56Time.Time.Hours, a23.m_DDTables[i].Cp56Time.Time.Minutes, a23.m_DDTables[i].Cp56Time.Time.Milliseconds); if ( sztmp > szlast) { msg.sprintf("--@@NRLan103 device %d named %s distrubdata@@--\n%s\n%s\n", m_DevInfo.m_MachineNo, m_DevInfo.m_MachineName, sztmp.data (), szlast.data ());#ifndef USE_LIBXML2 m_pxml->GetNodeAttr(nodec, "acc", sztmp);#else Node attrNode=xprc.selectSingleNode(node,"@acc"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::ProcessAsdu23(CAsdu& a)]can not locate //CPUCONFIG[index='1']/@attr"<<endl; return; } sztmp=attrNode.value().c_str();#endif a23.m_DDTables[i].acc = sztmp.toInt (); bool bExist=false; for(int j=0;j<m_DDTable.GetSize();j++) { if(m_DDTable[j].Cp56Time==a23.m_DDTables[i].Cp56Time) { bExist=true; break; } } if(!bExist) { sztmp.sprintf ("%04d%02d%02d%02d%02d%05d", a23.m_DDTables[i].Cp56Time.Time.Years + 2000, a23.m_DDTables[i].Cp56Time.Time.Months, a23.m_DDTables[i].Cp56Time.Time.DaysOfMonth, a23.m_DDTables[i].Cp56Time.Time.Hours, a23.m_DDTables[i].Cp56Time.Time.Minutes, a23.m_DDTables[i].Cp56Time.Time.Milliseconds); printf("append:\t%s\t%s\n",sztmp.data(),szlast.data()); m_DDTable.Add(a23.m_DDTables[i]); } communicator.printData (NULL, 0, msg.data (), 1); } } } if (!m_CmdParam.isEmpty ()) { m_CmdParam.remove (cmdit); } if (!m_CmdParam.isEmpty ()) //命令还没有全部做完 { cmdit = m_CmdParam.at (0); msg.sprintf ("--@@NRLan103 begin send 24 @@--\n"); communicator.printData (NULL, 0, msg.data (), 1); SendAsdu24 ((*cmdit).addr, (*cmdit).fun, (*cmdit).fanno, (*cmdit).too, (*cmdit).tov, (*cmdit).acc); } else { SortDDTable (); msg.sprintf ("--@@NRLan103 require distrubdata fan finish @@--\n"); communicator.printData (NULL, 0, msg.data (), 1); m_bCmding = false; }}/*! \fn CNRLan103::ProcessAsdu26(CAsdu& a) */void CNRLan103::ProcessAsdu26(CAsdu& a){ /// @todo implement me#ifdef NRLAN_DEBUG printf("entering ProcessAsdu26\n");#endif lastRecvWaveTime=time(NULL); QString msg; CAsdu26 a26 (a); a26.ExplainAsdu (); a.m_ASDUData.Append (a26.m_ASDUData); m_DistrubData.DeleteData (); m_DistrubData.m_iNOC = a26.m_NOC; m_DistrubData.m_iNOE = a26.m_NOE; m_DistrubData.m_iINT = a26.m_INT;#ifdef NR_WAVE_DEBUG cout<<"a26.m_NOC="<<a26.m_NOC<<endl; cout<<"a26.m_NOE="<<a26.m_NOE<<endl; cout<<"a26.m_INT="<<a26.m_INT<<endl;#endif memcpy (m_DistrubData.m_FaultStartTime.byte, a26.m_Cp32Time.byte,4 * sizeof (BYTE)); msg.sprintf ("--@@NRLan103 asdu26 send 24 @@--\n"); communicator.printData (NULL, 0, msg.data (), 1); SendAsdu24 (a26.m_Addr, a26.m_FUN, m_Ddt.FAN /*a26.m_FAN */ , 0x02,a26.m_TOV, 0);}/*! \fn CNRLan103::ProcessAsdu27(CAsdu& a) */void CNRLan103::ProcessAsdu27(CAsdu& a){ /// @todo implement me#ifdef NRLAN_DEBUG printf("entering ProcessAsdu27\n");#endif lastRecvWaveTime=time(NULL); QString msg; CAsdu27 a27 (a); a27.ExplainAsdu (); a.m_ASDUData.Append (a27.m_ASDUData); m_DistrubData.SaveACCInfo (a27.m_ACC, a27.m_RPV, a27.m_RSV, a27.m_RFA); msg.sprintf ("--@@NRLan103 asdu27 send 24 acc=%d@@--\n",a27.m_ACC); communicator.printData (NULL, 0, msg.data (), 1); SendAsdu24 (a27.m_Addr, a27.m_FUN, m_Ddt.FAN,0x08,a27.m_TOV, a27.m_ACC);}/*! \fn CNRLan103::ProcessAsdu28(CAsdu& a) */void CNRLan103::ProcessAsdu28(CAsdu& a){ /// @todo implement me#ifdef NRLAN_DEBUG printf("entering ProcessAsdu28\n");#endif lastRecvWaveTime=time(NULL); QString msg; CAsdu28 a28 (a); a28.ExplainAsdu (); a.m_ASDUData.Append (a28.m_ASDUData); msg.sprintf ("--@@NRLan103 asdu28 send 24 @@--\n"); ///communicator.printData (NULL, 0, msg.data (), 1); SendAsdu24(a28.m_Addr, a28.m_FUN, m_Ddt.FAN , 0x10, 0x01,0);}/*! \fn CNRLan103::ProcessAsdu29(CAsdu& a) */void CNRLan103::ProcessAsdu29(CAsdu& a){ /// @todo implement me#ifdef NRLAN_DEBUG printf("entering ProcessAsdu29\n");#endif lastRecvWaveTime=time(NULL); CAsdu29 a29 (a); a29.ExplainAsdu (); a.m_ASDUData.Append (a29.m_ASDUData); ///communicator.printData (a29.m_SwitchData.GetData (),a29.m_SwitchData.GetSize (), "ASDU29 DUMP", 0); m_DistrubData.SaveSwitchData (a29.m_SwitchData.GetData ());}/*! \fn CNRLan103::ProcessAsdu30(CAsdu& a) */void CNRLan103::ProcessAsdu30(CAsdu& a){ /// @todo implement me#ifdef NRLAN_DEBUG printf("entering ProcessAsdu30\n");#endif lastRecvWaveTime=time(NULL); CAsdu30 a30 (a); a30.ExplainAsdu (); a.m_ASDUData.Append (a30.m_ASDUData); communicator.printData (a30.m_AnalogData.GetData (),a30.m_AnalogData.GetSize (), "ASDU30 DUMP", 4); if (a30.m_AnalogData.GetSize () > 0) { m_DistrubData.SaveChannelData (a30.m_AnalogData.GetData ()); }}/*! \fn CNRLan103::ProcessAsdu31(CAsdu& a) */void CNRLan103::ProcessAsdu31(CAsdu& a){ /// @todo implement me#ifdef NRLAN_DEBUG printf("entering ProcessAsdu31\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -