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

📄 device.cpp~

📁 电力系统Linux设备通讯程序 主要是为了各大电网通讯数据代码
💻 CPP~
字号:
#include "Device.h"#include "103Device.h"#include <pthread.h>#include "baseclass/publicclass.h"#include "devmoduledlg.h"extern CPublicClass g_PublicClass;//启动顶级设备,包括点对点设备,总线,管理机等void* DeviceCommunicateMainThread(void* lp){ long threadid = (long)pthread_self();    CDeviceNode* pDevNode = (CDeviceNode*)lp;    printf("---@@@@@is:%d\n",1223);    //置巡检标志为0 pDevNode->ResetXunJianFlag(); CCommunication myComm(COM, pDevNode->m_deviceinfo.m_Port,         FindSpeed(pDevNode->m_deviceinfo.m_Speed),         pDevNode->m_deviceinfo.m_DataBit,        pDevNode->m_deviceinfo.m_StopBit,        (paritytype_t)pDevNode->m_deviceinfo.m_Parity,        pDevNode->m_deviceinfo.m_IPAddress,        CSocket::TCP,        pDevNode->m_deviceinfo.m_IPAddress,        pDevNode->m_deviceinfo.m_Port); communication_t type = myComm.GetType(); if (type == NIL) return NULL;//通信口打开错误 QPtrList<C103Device> devlist; devlist.setAutoDelete(true); C103Device* pDev = NULL; DeviceInfoListType::iterator it; while (pDevNode->m_ModuleState != 1) usleep(100); for (int i=0; i<(int)pDevNode->m_ChildDevList.count(); i++) {  it = pDevNode->m_ChildDevList.at(i);  printf("--@@Com103 begin %d device cmd %d @@--\n", (*it).m_EquipNo, (int)(*it).m_SupportCmd);  C103Device* pcom103dev = new C103Device(*pDevNode->m_ChildDevList.at(i));  pcom103dev->m_pxml = g_PublicClass.FindXmlFile(pcom103dev->m_szConFile);  if (pcom103dev->m_pxml == NULL)  {   printf("--@@Com103 Init Error deviceno=%d @@--\n", (*it).m_EquipNo);   delete pcom103dev;   return NULL;  }  if (pcom103dev->InitClass())		{			pcom103dev->m_iThreadId = threadid;			pcom103dev->m_pComm = &myComm;			devlist.append(pcom103dev);			(*it).m_ThreadId = threadid;		}		else		{			printf("--@@Com103 init %d error @@--\n", (*it).m_EquipNo);			delete pcom103dev;			//第i个设备无法正常启动,把设备列表也删除			pDevNode->m_ChildDevList.remove(it);		}	}	CDataNode* pDataNode = NULL;	int iDevIndex = -1;	QDateTime currtime;	bool bstop = false;    while (!g_PublicClass.m_Stop && !bstop)    {		currtime = QDateTime::currentDateTime();		pDataNode = g_PublicClass.m_NodeManage.FindCmdFromRDN(threadid);		if (pDataNode != NULL)		{			iDevIndex = pDevNode->FindDeviceByEquipNo(pDataNode->m_nodeinfo.m_MachineNo);			if (iDevIndex >= 0)			{				pDev = devlist.at(iDevIndex);				memcpy(&pDev->m_CmdInfo, &pDataNode->m_nodeinfo, sizeof(st_nodeinfo));			}			else			{				if (pDataNode->m_nodeinfo.m_DataType == WM_RUN_A_DEVICE)				{					st_deviceinfo Dev;					memcpy(&Dev, (void*)pDataNode->m_nodeinfo.m_SegmentPid, pDataNode->m_nodeinfo.m_iSize);					C103Device* pcom103dev = new C103Device(Dev);					pcom103dev->m_pxml = g_PublicClass.FindXmlFile(pcom103dev->m_szConFile);					if (pcom103dev->m_pxml == NULL)					{						printf("--@@Com103 Init Error deviceno=%d @@--\n", (*it).m_EquipNo);						delete pcom103dev;						return NULL;					}					if (pcom103dev->InitClass())					{						pcom103dev->m_iThreadId = threadid;						pcom103dev->m_pComm = &myComm;						devlist.append(pcom103dev);						Dev.m_ThreadId = threadid;						Dev.m_SupportCmd = InstallMenu(QString(Dev.m_MachineType));						pDevNode->m_ChildDevList.append(Dev);												st_deviceinfo di[1+pDevNode->m_ChildDevList.count()];						memcpy(&di[0], &pDevNode->m_deviceinfo, sizeof(st_deviceinfo));						if ((int)pDevNode->m_ChildDevList.count() > 0)						{							DeviceInfoListType::iterator it;							for (int i=0; i<(int)pDevNode->m_ChildDevList.count(); i++)							{								it = pDevNode->m_ChildDevList.at(i);								memcpy(&di[1+i], &(*it), sizeof(st_deviceinfo));							}						}						g_PublicClass.m_NodeManage.AddSendDataNode(							g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype, 0, WM_SENDDEVTHREADID,							(void*)&di, (1+pDevNode->m_ChildDevList.count())*sizeof(st_deviceinfo));					}					else					{						delete pcom103dev;					}					((DevModuleDlg*)g_PublicClass.m_MainForm)->Clear();					for (int j=0; j<(int)g_PublicClass.m_NodeManage.m_DeviceNode.count(); j++)					{						CDeviceNode* pDN = g_PublicClass.m_NodeManage.m_DeviceNode.at(j);						((DevModuleDlg*)g_PublicClass.m_MainForm)->AddTopLevelDevice((void*)pDN);						((DevModuleDlg*)g_PublicClass.m_MainForm)->AddChildDevice((void*)pDN);					}				}				g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点				usleep(1);				continue;			}			g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点			switch (pDev->m_CmdInfo.m_DataType)			{			case WM_REQUESTPARAMVALUE://申请定值				printf("--@@Com103 申请定值 @@--\n");				pDev->GetDingZhi();				break;			case WM_REQUESTPVSECTOR://申请定值区号				printf("--@@Com103 申请定值区号 @@--\n");				pDev->GetSector();				break;			case WM_MODIFYTIME://申请修改时钟				printf("--@@Com103 申请修改时钟 @@--\n");				pDev->CheckTime();				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://设备停止				pDev->m_pComm = NULL;				devlist.remove(iDevIndex);				it = pDevNode->m_ChildDevList.at(iDevIndex);				printf("--@@Com103 停止%d 设备 DevIndex=%d @@--\n", (*it).m_EquipNo, iDevIndex);				g_PublicClass.m_NodeManage.AddSendDataNode(					g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype, 0, WM_STOP_A_DEVICE,					(void*)&(*it), sizeof(st_deviceinfo));					pDevNode->m_ChildDevList.remove(it);				if ((int)pDevNode->m_ChildDevList.count() == 0)				{					g_PublicClass.m_NodeManage.DeleteDeviceNode((void*)pDevNode);					if ((int)g_PublicClass.m_NodeManage.m_DeviceNode.count() == 0)					{						g_PublicClass.m_NodeManage.AddSendDataNode(							g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype, 0, WM_STOP_A_MODULE,							NULL, 0);					}					bstop = true;				}				if ((int)g_PublicClass.m_NodeManage.m_DeviceNode.count() != 0)				{					((DevModuleDlg*)g_PublicClass.m_MainForm)->Clear();					for (int j=0; j<(int)g_PublicClass.m_NodeManage.m_DeviceNode.count(); j++)					{						CDeviceNode* pDN = g_PublicClass.m_NodeManage.m_DeviceNode.at(j);						((DevModuleDlg*)g_PublicClass.m_MainForm)->AddTopLevelDevice((void*)pDN);						((DevModuleDlg*)g_PublicClass.m_MainForm)->AddChildDevice((void*)pDN);					}				}				break;			default :				break;			}			printf("--@@Com103 命令完成 @@--\n");			continue;		}		iDevIndex = pDevNode->FindDeviceByFlag(0);		if (iDevIndex >= 0)		{			pDev = devlist.at(iDevIndex);			int isecs = pDev->m_GITime.secsTo(currtime);			if (isecs > 15*60)//大于15分钟后进行总召唤			{				pDev->m_GITime = QDateTime::currentDateTime();			}			if (pDev->XunJian())			{				if (pDev->m_bSendState3 == true)				{					pDev->m_bSendState3 = false;					pDev->m_bSendState0 = true;					pDev->SendCommStateToMain(3);				}			}			else			{				if (pDev->m_bSendState0 == true)				{					pDev->m_bSendState0 = false;					pDev->m_bSendState3 = true;					pDev->SendCommStateToMain(0);				}			}			if (pDev->m_bCommError)//通信口错误,重新打开			{				myComm.Open(COM, pDevNode->m_deviceinfo.m_Port, 							  FindSpeed(pDevNode->m_deviceinfo.m_Speed), 							  pDevNode->m_deviceinfo.m_DataBit,							  pDevNode->m_deviceinfo.m_StopBit,							  (paritytype_t)pDevNode->m_deviceinfo.m_Parity,							  pDevNode->m_deviceinfo.m_IPAddress,							  CSocket::TCP,							  pDevNode->m_deviceinfo.m_IPAddress,							  pDevNode->m_deviceinfo.m_Port);				type = myComm.GetType();				if (type == NIL) return NULL;//通信口打开错误				else pDev->m_bCommError = false;			}			else			{				DeviceInfoListType::iterator it = pDevNode->m_ChildDevList.at(iDevIndex);				(*it).m_PlFlag = 1;//置巡检标志为1			}			usleep(10);			continue;		}		else		{			//重新置巡检标志为0			pDevNode->ResetXunJianFlag();			usleep(10);		}    }	    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("body", "CONFIG");	cnode = xml.GetChildNode(node, "MENU", "", "");	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 + -