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

📄 device.cpp

📁 电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下
💻 CPP
字号:
//device.cpp#include "Device.h"#include <pthread.h>#include "baseclass/publicclass.h"extern CPublicClass g_PublicClass;CDevice::CDevice(){}CDevice::~CDevice(){}bool CDevice::InitDevices(void* ppNode,long threadid,void* pCom){    CDeviceNode* pDevNode=(CDeviceNode*)ppNode;    Communicate* pmyComm=(Communicate*)pCom;    if(!pDevNode)    {        printf("ppnode=NULL\n");        return false;    }    DeviceInfoListType::iterator it;    CDataProcess dp;    for (int i=0; i<(int)pDevNode->m_ChildDevList.count(); i++)    {        it = pDevNode->m_ChildDevList.at(i);        if((*it).m_Wild>0)	//再次初始化时,必须删除原来的类指针        {            delete (CNRLan103*)((*it).m_Wild);            (*pDevNode->m_ChildDevList.at(i)).m_Wild=0;        }        CNRLan103* pcom103dev = new CNRLan103(*pDevNode->m_ChildDevList.at(i));        pcom103dev->m_pxml = g_PublicClass.FindXmlFile(pcom103dev->m_szConFile);        if (pcom103dev->m_pxml == NULL)        {			printf("[来自NRLAN103]%d设备的XML文件%s未找到......\n", (*it).m_MachineNo,pcom103dev->m_szConFile.data());            delete pcom103dev;            return false;        }        if (pcom103dev->InitClass())        {            pcom103dev->m_iThreadId = threadid;            pcom103dev->m_pComm = pmyComm;            pcom103dev->communicator.pComm(pmyComm);            (*pDevNode->m_ChildDevList.at(i)).m_Wild=(long)pcom103dev;            (*pDevNode->m_ChildDevList.at(i)).m_ThreadId = threadid;            //注册设备                long hdbc=-1;                dp.InsertToDeviceInfo(hdbc,g_PublicClass.m_ModuleName,g_PublicClass.m_StationNo,(*it).m_MachineNo,                                      threadid,1,QString("00"),QString((*it).m_RecordIndex),QString((*it).m_ParentIndex));        }        else        {            printf("[来自NRLAN103]初始化 %d 出错......\n", (*it).m_MachineNo);            delete pcom103dev;            return false;        }    }    return true;}//启动顶级设备,包括点对点设备,总线,管理机等void* DeviceCommunicateMainThread(void* lp){    long threadid = (long)pthread_self();    CDeviceNode* pDevNode = (CDeviceNode*)lp;			//接收设备接点    pDevNode->ResetXunJianFlag();				//置巡检标志为0    CNRLan103* pDev = NULL;    while (pDevNode->m_ModuleState != 1)        usleep(100*1000);	//初始化完成后才可以开始下面的线程    Communicate myComm;    CDataNode* pDataNode = NULL;    int iDevIndex = -1;    QDateTime currtime;    bool bstop = false;    CDevice cd;    bool bInitOk=false;    //连接数据库    long hdbc=-1;    CDataProcess dp;    //dp.ConnectDatabase(hdbc);    bool resetCU = false ;    while (!g_PublicClass.m_Stop && !bstop)    {        //打开通讯端口        if(!myComm.IsConnected())        {            //读写加锁,不允许读或写端口            printf("open comm port\n");//             myComm.m_ReadLocker.lock();//             myComm.m_WriteLocker.lock();						myComm.beginComm(Communicate::CLIENT,														 pDevNode->m_deviceinfo.m_IPAddress,														 pDevNode->m_deviceinfo.m_SocketPort);            //如果打开失败//             myComm.m_ReadLocker.unlock();//             myComm.m_WriteLocker.unlock();	//打开成功后,解锁允许读,写            printf("open success\n");            resetCU = true ;        }				if(!myComm.IsConnected())        {            sleep(1);            continue;        }        //初始化设备        if(!bInitOk)        {            bInitOk=cd.InitDevices((void*)pDevNode,threadid,&myComm);            if(!bInitOk)            {                pthread_yield();                continue;            }        }        //处理命令        currtime = QDateTime::currentDateTime();        pDataNode = g_PublicClass.m_NodeManage.FindCmdFromRDN(threadid);//查找一个属于本线程的命令        if (pDataNode != NULL                && !pDev->m_bCmding                && !pDev->m_bWaving)        {            pDev = (CNRLan103*)pDevNode->FindDeviceWildByEquipNo(pDataNode->m_nodeinfo.m_MachineNo);            if (pDev)            {                memcpy(&pDev->m_CmdInfo, &pDataNode->m_nodeinfo, sizeof(st_nodeinfo));                if (pDataNode->m_nodeinfo.m_SegmentPid > 0)                {                    BYTE* pbuff = new BYTE[pDataNode->m_nodeinfo.m_iSize];                    memcpy(pbuff, (BYTE*)pDataNode->m_nodeinfo.m_SegmentPid, pDataNode->m_nodeinfo.m_iSize);                    pDev->m_CmdInfo.m_SegmentPid = (long)pbuff;                }                pDev->SetHdbc(hdbc);            }            else            {/*                if (pDataNode->m_nodeinfo.m_DataType == WM_CHANGECOMMPARAM)                {                    long hdbctmp = -1;                    // 					dp.GetDevCommFromMachineNo(hdbctmp, pDataNode->m_nodeinfo.m_MachineNo, pDev->m_DevInfo);                    myComm.m_ForceReOpen = true;                }*/                g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点                pthread_yield();                continue;            }            g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点            switch (pDev->m_CmdInfo.m_DataType)            {            case WM_REQUESTPARAMVALUE://申请定值                {                    printf("--@@Com103 申请定值 @@--\n");                    pDev->GetDingZhi();                    hdbc=pDev->GetHdbc();	 //重新取得数据库句柄                    break;                }            case WM_REQUESTPVSECTOR://申请定值区号                {                    printf("--@@Com103 申请定值区号 @@--\n");                    pDev->GetSector();                    hdbc=pDev->GetHdbc();                    break;                }            case WM_MODIFYTIME://申请修改时钟                {                    printf("--@@Com103 申请修改时钟 @@--\n");                    pDev->AdjustClock();                    break;                }            case WM_REQUESTANLOGVALUE://申请采样值                {                    printf("--@@Com103 申请采样值 @@--\n");                    pDev->GetAnalog();                    break;                }            case WM_REQUESTSWITCHVALUE://申请开关量                {                    printf("--@@Com103 申请开关量 @@--\n");                    pDev->GetSwitch();                    break;                }            case WM_REQUESTSHUVALUE://申请压板状态                {                    printf("--@@Com103 申请压板状态 @@--\n");                    pDev->GetYaBan();                    break;                }            case WM_REQUESTDISTURBDATA://申请扰动数据                {                    printf("--@@Com103 申请扰动数据 @@--\n");                    ///pDev->RequireDistrubt();                    break;                }            case WM_MODIFYPARAMVALUE://申请修改定值                {                    break;                }            case WM_REQUESTCHGPVSECTOR://申请切换定值区号                {                    break;                }            case WM_SERIESANLOGBEGIN://开始连续采样                {                    break;                }            case WM_SERIESANLOGEND://停止连续采样                break;            case WM_MODIFYSWITCHVALUE://申请修改开关量                break;            case WM_SHUTTERSTATEON://申请投压板                break;            case WM_SHUTTERSTATEOFF://申请退压板                break;            case WM_ACTIONSIGNALRESET://动作信号复归                break;            case WM_REQUESTHFEXCHG://申请高频交换                break;            case WM_REQUESTCOMMSTATE://申请通信状态                break;            case WM_REQUESTCOMMRESET://申请通信复位                break;            case WM_REQUESTHFRESET://申请高频复归                break;                //             case WM_STOP_A_DEVICE://设备停止                //                 {                //                     g_PublicClass.m_Stop=true;                //                     bstop=true;                //                     break;                //                 }            default :                break;            }            pthread_yield();            continue;        }        pDev = (CNRLan103*)pDevNode->FindDeviceWildByFlag(0,iDevIndex);        if (pDev)        {            pDev->SetHdbc(hdbc);						if(myComm.IsConnected())            {                pDev->m_bCommError=false;/*                                                				if (resetCU)                                                				{                                                					pDev->InitDevice() ;                                                					resetCU = false ;                                                				}*/            }            //int isecs = pDev->m_GITime.secsTo(currtime);            //if (isecs > 15*60)//大于15分钟后进行总召唤            //{            //pDev->m_GITime = QDateTime::currentDateTime();            //}    	#ifdef NRLAN_DEBUG    	printf("entering mainloop.pDev\t%p\n",pDev);    	#endif            if (pDev->XunJian())            {/*                                                    				if (pDev->m_bSendState1 == true)                                                    				{                                                    					pDev->m_bSendState1 = false;                                                    					pDev->m_bSendState0 = true;                                                    					pDev->SendCommStateToMain(1);                                                    				}*/            }            else            {/*                                                    				if (pDev->m_bSendState0 == true)                                                    				{                                                    					pDev->m_bSendState0 = false;                                                    					pDev->m_bSendState1 = true;                                                    					pDev->SendCommStateToMain(0);                                                    				}*/            }            if (pDev->m_bCommError)//通信口错误,重新打开            {                printf("commerror=true\n");                pDevNode->ResetXunJianFlag();//                 myComm.m_ForceReOpen=true;            }            else            {                DeviceInfoListType::iterator it = pDevNode->m_ChildDevList.at(iDevIndex);                (*it).m_PlFlag = 1;//置巡检标志为1            }            pthread_yield();    	    #ifdef NRLAN_DEBUG    	    printf("main loop will continue\n");    	    #endif            continue;        }        else        {            //重新置巡检标志为0            pDevNode->ResetXunJianFlag();            pthread_yield();        }        pthread_yield();    }    pDevNode->m_deviceinfo.m_ThreadId=0;    myComm.Close();    return NULL;}int FindSpeed(int ispeed){    int itmp = 0;    switch (ispeed)    {    case 9600:        itmp = 13;        break;    case 4800:        itmp = 12;        break;    case 2400:        itmp = 11;        break;    default :        break;    }    return itmp;}int InstallMenu(QString szfilename){    QString xmlfile = "";    xmlfile.sprintf("%s", szfilename.data());    if (xmlfile == "" || xmlfile.isEmpty())        return 0;    xmlfile = g_PublicClass.GetWorkPath()+"/devconfig/"+xmlfile+".xml";    CXMLReader xml(xmlfile);    xml.OpenDomXMLFile();    QDomNode node, cnode;    node = xml.GetDomNode(QString("body"), QString("CONFIG"));    cnode = xml.GetChildNode(node, "MENU", NULL, NULL);    QString sztmp = "";    xml.GetNodeAttr(cnode, "value", sztmp);    printf("menu %s\n",sztmp.data());    return sztmp.toInt();}

⌨️ 快捷键说明

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