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

📄 nrlan103.cpp

📁 电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  {    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 + -