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

📄 nrlan103.cpp

📁 电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//// C++ Implementation: nrlan103//// Description:////// Author: root <root@localhost.localdomain>, (C) 2006//// Copyright: See COPYING file that comes with this distribution////#include "nrlan103.h"#include "smart_ptr.hpp"#include "xmlwrapper.hpp"extern CPublicClass g_PublicClass;CNRLan103::CNRLan103(st_deviceinfo DevInfo)    : CBaseDevice(DevInfo){  m_bCmding=false;  m_bWaving=false;  m_iWavingTimes=0;  m_Sector=0;  collecting=false;  this->m_pComm=NULL;  this->m_iThreadId=0;  this->m_CmdInfo.m_MachineNo=this->m_DevInfo.m_MachineNo;  this->m_szConFile=g_PublicClass.GetWorkPath()+static_cast<QString>("/devconfig/")+QString(m_DevInfo.m_MachineType)+static_cast<QString>(".xml");  g_PublicClass.m_MonitorData.m_MachineNo[0]=m_DevInfo.m_MachineNo;  g_PublicClass.m_MonitorData.m_SendFlag=1;  g_PublicClass.m_MonitorData.m_RecvFlag=1;  g_PublicClass.m_MonitorData.m_OutFile=1;  g_PublicClass.m_MonitorData.m_OutCon=1;  g_PublicClass.m_MonitorData.m_SendOper=0;  g_PublicClass.m_MonitorData.m_Sums=1000;  this->m_iFaultNo=-1;  m_iLPort = m_DevInfo.m_SocketPort;  this->m_iUPort=6060;}CNRLan103::~CNRLan103(){}/*!    \fn CNRLan103::InitClass() */bool CNRLan103::InitClass(){  /// @todo implement me  m_szSysPath =g_PublicClass.GetWorkPath () + "/data/" + m_DevInfo.m_MachineName + "/";  mkdir (m_szSysPath, 0666);  QString sztmp = "", szaaa = "";#ifndef USE_LIBXML2  //BEGIN  QDomNode node, cnode;  node = m_pxml->GetDomNode (QString("body"),QString("DEVCONFIG"));  if (node.isNull ())  {    printf("CNRLan103::InitClass()\n\tcan not locate <DEVCONFIG/> in xml tree,return false;\n");    return false;  }  cnode = m_pxml->GetChildNode (node, "CPUNUM", NULL, NULL);  if (!m_pxml->GetNodeAttr (cnode, "value", sztmp))  {    printf("CNRLan103::InitClass()\n\t can not locate <DEVCONFIG/CPUNUM> in xml tree,return false\n");    return false;  }  m_iCpuNum = sztmp.toInt ();  cnode = m_pxml->GetChildNode (node, "NEEDDISTRUBT", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", sztmp);    m_iWaveFlag = sztmp.toInt ();  }  else    m_iWaveFlag = 0;  cnode = m_pxml->GetChildNode (node, "NEEDINIT", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", sztmp);    m_bNeedInit = (sztmp.toInt () == 1);    //for debug;    if (m_bNeedInit)    {      printf("will collect info\n");      CollectGroupInfo ();      m_bNeedInit = false;    }  }  else  {    m_bNeedInit = false;  }  cnode = m_pxml->GetChildNode (node, "NEEDSAVEDATA", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", sztmp);    m_bSaveData = (sztmp.toInt () == 1);  }  else  {    m_bSaveData = false;  }  if (m_bSaveData == true)  {    QString szfilename = m_szSysPath + m_DevInfo.m_MachineName + ".txt";    m_File.setName (szfilename);    if (!m_File.open (IO_WriteOnly))    {      printf ("--@@NRLan103 create save file error! @@--\n");      return false;    }  }  cnode = m_pxml->GetChildNode (node, "DEBUGLEVEL", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", sztmp);    communicator.debugLevel = sztmp.toInt ();  }  else    communicator.debugLevel = 0;  cnode = m_pxml->GetChildNode (node, "PRIMARY", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", sztmp);    m_iPrimary = sztmp.toInt ();  }  else  {    m_iPrimary = 0;  }  cnode = m_pxml->GetChildNode (node, "DPI1", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", m_szDpi1);  }  else  {    m_szDpi1 = "复归";  }  cnode = m_pxml->GetChildNode (node, "DPI2", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", m_szDpi2);  }  else  {    m_szDpi2 = "动作";  }  cnode = m_pxml->GetChildNode (node, "SDPI1", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", m_szSDpi1);  }  else  {    m_szSDpi1 = "合";  }  cnode = m_pxml->GetChildNode (node, "SDPI2", NULL, NULL);  if (!cnode.isNull ())  {    m_pxml->GetNodeAttr (cnode, "value", m_szSDpi2);  }  else  {    m_szSDpi2 = "开";  }  cnode = m_pxml->GetChildNode (node, "STATIONADDR", NULL, NULL);  if(!cnode.isNull())  {    m_pxml->GetNodeAttr (cnode, "value", sztmp);    m_StaAddr=atoi(sztmp.data());  }  else  {    m_StaAddr=100;  }  //END#else  m_pConfDoc=this->getDocument(m_szConFile.data());  XMLWrapper::XPathProcessor xprc(*m_pConfDoc);  XMLWrapper::Element rootElem=m_pConfDoc->getRootElement();  XMLWrapper::Node devcNode=xprc.selectSingleNode(rootElem,"/schema/body/DEVCONFIG");#ifdef NR_LIBXML2_DEBUG  // 	cout<<*this<<"[DEBUG]document root element name="<<rootElem.name()<<endl;  // 	cout<<*this<<"[DEBUG]document encoding="<<doc.encoding()<<endl;  // 	cout<<*this<<"[DEBUG]devcNode value="<<devcNode.value()<<endl;#endif  if(devcNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG"<<endl;    return false;  }  XMLWrapper::Node attrNode=xprc.selectSingleNode(devcNode,"CPUNUM/@value");  if(attrNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/CPUNUM/@value"<<endl;    return false;  }  m_iCpuNum=atoi(attrNode.value().c_str());#ifdef NR_LIBXML2_DEBUG  cout<<*this<<"[DEBUG][CNRLan103::InitClass()]load from xml file,m_iCpuNum ="<<m_iCpuNum<<endl;#endif  attrNode=xprc.selectSingleNode(devcNode,"NEEDINIT/@value");  if(attrNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/NEEDINIT/@value"<<endl;    return false;  }  m_bNeedInit=atoi(attrNode.value().c_str());  if (m_bNeedInit)  {    CollectGroupInfo ();    m_bNeedInit = false;  }  attrNode=xprc.selectSingleNode(devcNode,"DEBUGLEVEL/@value");  if(attrNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/DEBUGLEVEL/@value"<<endl;    return false;  }  communicator.debugLevel=atoi(attrNode.value().c_str());  attrNode=xprc.selectSingleNode(devcNode,"PRIMARY/@value");  if(attrNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/PRIMARY/@value"<<endl;    return false;  }  this->m_iPrimary=atoi(attrNode.value().c_str());  attrNode=xprc.selectSingleNode(devcNode,"DPI1/@value");  if(attrNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/DPI1/@value"<<endl;    return false;  }  this->m_szDpi1=attrNode.value().c_str();  attrNode=xprc.selectSingleNode(devcNode,"DPI2/@value");  if(attrNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/DPI2/@value"<<endl;    return false;  }  this->m_szDpi2=attrNode.value().c_str();  attrNode=xprc.selectSingleNode(devcNode,"SDPI1/@value");  if(attrNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/SDPI1/@value"<<endl;    return false;  }  this->m_szSDpi1=attrNode.value().c_str();  attrNode=xprc.selectSingleNode(devcNode,"SDPI2/@value");  if(attrNode.isNull())  {    cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/SDPI2/@value"<<endl;    return false;  }  this->m_szSDpi2=attrNode.value().c_str();#endif  sztmp.sprintf ("%s", m_DevInfo.m_MachineName);  m_iFaultNo = g_PublicClass.m_Ini.GetKeyIntValue (sztmp, "FAULTNO", 0);  m_LastFan= g_PublicClass.m_Ini.GetKeyIntValue (sztmp, "LASTFAN", 0);  QString szkey;  szkey.sprintf ("CPU%d-LASTWAVETIME", m_DevInfo.m_MachineAddr);  m_szLastWaveTime=g_PublicClass.m_Ini.GetKeyStringValue (sztmp, szkey,"00000000000000000");  assert(m_pxml!=NULL);  m_DistrubData.m_pXml = m_pxml;  communicator.CommStart(m_DevInfo.m_IPAddress,m_DevInfo.m_SocketPort,m_DevInfo.m_MachineAddr,m_StaAddr);  return true;}/*!    \fn CNRLan103::ReceData(CByteArray& rData) */bool CNRLan103::ReceData(CByteArray& rData){  /// @todo implement me  NRLAN103::ASDUbuff asdu;  if (!communicator.CommRecv (asdu))    return false;  rData.SetSize (asdu.size);  memcpy (rData.GetData (), asdu.buff, asdu.size);  //for debug  communicator.printData(rData.GetData(),asdu.size,"CNRLan103::Recive Asdu",2);  if (rData.GetSize () > 0)  {    //char buff[100];    //bzero (buff, 100);    //sprintf (buff, "NRLan103 device %d receive", m_DevInfo.m_MachineNo);    //communicator.printData (rData.GetData (), rData.GetSize (), buff, 2);    ///@todo print debug info,datagram info here    return true;  }  return false;}/*!    \fn CNRLan103::SendAsdu10() */bool CNRLan103::SendAsdu10(){  /// @todo implement me  CAsdu10 a10;  a10.m_Addr = (*cmdit).addr;  a10.m_INF = (*cmdit).inf;  a10.m_NGD.byte = (*cmdit).num;  a10.m_iNum = (*cmdit).num;  a10.m_bSuccess = true;  if (a10.m_NGD.byte > 0)  {    DataSet *pDataSet = m_CmdDataSets.at (0);    a10.m_DataSets.append (pDataSet);    m_CmdDataSets.remove(0);  }  m_CmdParam.remove (cmdit);  CByteArray sData;  a10.BulidArray (sData);  if (!SendData (sData))    return false;  return true;}/*!    \fn CNRLan103::SendData(const CByteArray& sData) */bool CNRLan103::SendData(CByteArray& sData){  /// @todo implement me  char buff[100];  bzero (buff, 100);  sprintf (buff, "NRLan103 device %d send", m_DevInfo.m_MachineNo);  communicator.printData (sData.GetData (), sData.GetSize (), buff, 2);  if (m_bSaveData == true)  {    QString szdata = "", sztmp = "";    szdata.sprintf ("Send %d\n", sData.GetSize ());    for (int i = 0; i < sData.GetSize (); i++)    {      sztmp.sprintf ("%02x ", sData.GetAt (i));      szdata += sztmp;    }    szdata += "\n\n";    m_File.writeBlock ((unsigned char *) szdata.data (), szdata.length ());  }  NRLAN103::ASDUbuff asdu;  asdu.size = sData.GetSize ();  memcpy (asdu.buff, sData.GetData (), asdu.size);  if (!communicator.CommSend (asdu))  {    ///printf ("--@@NRLan103 send failed @@--\n");    return false;  }  ///@todo print datagram here  sData.SetSize (0);  return true;}/*!    \fn CNRLan103::ExplainAsdu(CByteArray& Data) */void CNRLan103::ExplainAsdu(CByteArray& Data){  /// @todo implement me  CAsdu a;  a.m_ASDUData.SetSize (0);  a.SaveAsdu (Data);  if (a.m_iResult == 0)    return;  switch (a.m_TYP)  {    case 0x0a:      ProcessAsdu10 (a);      break;    case 0x0b:      ProcessAsdu11 (a);      break;    case 0x17:      ProcessAsdu23 (a);      break;    case 0x1a:      ProcessAsdu26 (a);      break;    case 0x1b:      ProcessAsdu27 (a);      break;    case 0x1c:      ProcessAsdu28 (a);      break;    case 0x1d:      ProcessAsdu29 (a);      break;    case 0x1e:      ProcessAsdu30 (a);      break;    case 0x1f:      ProcessAsdu31 (a);      break;    default:      break;  }#ifdef NRLAN_DEBUG  printf("ProcessAsdu end\n");#endif}/*!    \fn CNRLan103::ProcessAsdu10(CAsdu& a) */void CNRLan103::ProcessAsdu10(CAsdu& a){  /// @todo implement me  if (a.m_COT == 0x01)  {/*                                                              QString msg;                                                              msg.sprintf ("bust ASDU10 DUMP");                                                              communicator.printData (a.m_ASDUData.GetData (),                                                                                      a.m_ASDUData.GetSize (),                                                                                      msg.data (), 1);*/  }  CAsdu10 a10 (a);  a10.ExplainAsdu();  QString msg;  if (collecting)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -