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

📄 103device.cpp~

📁 电力系统Linux设备通讯程序 主要是为了各大电网通讯数据代码
💻 CPP~
📖 第 1 页 / 共 5 页
字号:
#include "103Device.h"#include <qdatetime.h>#include <time.h>#include <qstringlist.h> #include <unistd.h>#include <sys/types.h>#include <qcstring.h> #include <qdir.h>extern CPublicClass g_PublicClass;C103Device::C103Device(st_deviceinfo DevInfo){ memcpy(&m_DevInfo, &DevInfo, sizeof(st_deviceinfo));  m_bCommError = false; m_bSendState3 = true; m_bSendState0 = true; m_bHaveL1UserData = false; m_bSwitch = false;  m_FrameHead = 0x00; m_FrameLength = 0x00; m_ReceAddress = 0x00; m_FrameCS = 0x00; m_FrameEnd = 0x00;  m_pComm = NULL; m_iThreadId = 0;  m_iHaveWaveFile = 0; memset(&m_CmdInfo, 0x00, sizeof(st_nodeinfo)); m_CmdInfo.m_MachineNo = m_DevInfo.m_EquipNo; 	m_szConFile = g_PublicClass.GetWorkPath()+"/devconfig/"+m_DevInfo.m_MachineType+".xml";}C103Device::~C103Device(){	m_ReceData.SetSize(0);	m_CommParam.clear();}bool C103Device::InitClass(){	m_szSysPath = g_PublicClass.GetWorkPath()+"/data/"+m_DevInfo.m_Equipment+"/";	mkdir(m_szSysPath, 0666);	m_DistrubData.m_pXml = m_pxml;	CString sztmp = "";	QDomNode node, cnode;	node = m_pxml->GetDomNode("body", "DEVCONFIG");	if (node.isNull()) return false;		cnode = m_pxml->GetChildNode(node, "NEEDDISTRUBT", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", sztmp);		m_iWaveFlag = sztmp.toInt();	}	else m_iWaveFlag = 0;		cnode = m_pxml->GetChildNode(node, "NEEDSAVEDATA", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", sztmp);		m_iSaveFlag = sztmp.toInt();	}	else m_iSaveFlag = 0;		cnode = m_pxml->GetChildNode(node, "TIMEOUT", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", sztmp);		m_iTimesOut = sztmp.toInt();	}	else m_iTimesOut = 50;		cnode = m_pxml->GetChildNode(node, "FIXTIME", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", sztmp);		m_iFixTime = sztmp.toInt();	}	else m_iFixTime = 100;	cnode = m_pxml->GetChildNode(node, "PRIMARY", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", sztmp);		m_iPrimary = sztmp.toInt();	}	else m_iPrimary = 0;	cnode = m_pxml->GetChildNode(node, "DPI1", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", m_szDpi1);	}	else m_szDpi1 = "复归";		cnode = m_pxml->GetChildNode(node, "DPI2", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", m_szDpi2);	}	else m_szDpi2 = "动作";		cnode = m_pxml->GetChildNode(node, "SDPI1", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", m_szSDpi1);	}	else m_szSDpi1 = "合";		cnode = m_pxml->GetChildNode(node, "SDPI2", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", m_szSDpi2);	}	else m_szSDpi2 = "开";		sztmp.sprintf("%s", m_DevInfo.m_Equipment);	cnode = m_pxml->GetChildNode(node, "FAULTNO", "devname", sztmp);	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", sztmp);		m_iFaultNo = sztmp.toInt();	}	else	{		m_iFaultNo = 0;		cnode = m_pxml->InsertChildNode(node, "FAULTNO");		m_pxml->InsertNodeAttr(cnode, "devname", sztmp);		m_pxml->InsertNodeAttr(cnode, "value", "0");	}		sztmp.sprintf("%s", m_DevInfo.m_Equipment);	cnode = m_pxml->GetChildNode(node, "LASTWAVETIME", "devname", sztmp);	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", m_szLastWaveTime);	}	else	{		m_szLastWaveTime = "00000000000000000";		cnode = m_pxml->InsertChildNode(node, "LASTWAVETIME");		m_pxml->InsertNodeAttr(cnode, "devname", sztmp);		m_pxml->InsertNodeAttr(cnode, "value", "00000000000000000");	}	cnode = m_pxml->GetChildNode(node, "CPUNUM", "", "");	if (!cnode.isNull())	{		m_pxml->GetNodeAttr(cnode, "value", sztmp);		m_iCpuNum = sztmp.toInt();	}	else return false;	for (int i=0; i<m_iCpuNum; i++)	{		CommParam CP;		memset(&CP, 0x00, sizeof(CommParam));		CP.SendAddress = m_DevInfo.m_EquipAddr+i;		CP.AsduAddress = m_DevInfo.m_EquipAddr+i;		CP.CpuNo = i+1;		sztmp.sprintf("CPU%dFUNCODE", i+1);		cnode = m_pxml->GetChildNode(node, sztmp, "", "");		if (!cnode.isNull())		{			m_pxml->GetNodeAttr(cnode, "value", sztmp);			CP.FunCode = sztmp.toInt();		}		else return false;		CP.bInit = false;		CP.bLinkStatus = false;		CP.bLinkBusy = true;		m_CommParam.append(CP);	}	it = m_CommParam.at(0);//为什么要赋值		node = m_pxml->GetDomNode("body", "WAVCONFIG");	if (!node.isNull())	{		cnode = m_pxml->GetChildNode(node, "TYPE", "", "");		if (!cnode.isNull())		{			m_pxml->GetNodeAttr(cnode, "value", sztmp);			m_iWavType = sztmp.toInt();		}		else m_iWavType = 0;	}	else m_iWavType = 0;		m_GITime = QDateTime::currentDateTime();	return true;}BYTE C103Device::CalCheckSum(const CByteArray& Data, bool bSend /* = false */){	int iSize = Data.GetSize();	BYTE CheckSum = 0;		if (bSend)	{		CheckSum += (*it).CCD.byte;		CheckSum += (*it).SendAddress;	}	else	{		CheckSum += (*it).DCD.byte;		CheckSum += m_ReceAddress;	}	for (int i=0; i<iSize; i++)		CheckSum += Data.GetAt(i);	return CheckSum;}bool C103Device::SendData(CByteArray& sData){	int iSendSum = sData.GetSize();	CByteArray Data;	if (iSendSum > 0)	{		Data.SetSize(iSendSum+8);		Data.SetAt(0, 0x68);		Data.SetAt(1, (BYTE)iSendSum+2);		Data.SetAt(2, (BYTE)iSendSum+2);		Data.SetAt(3, 0x68);		Data.SetAt(4, (*it).CCD.byte);		Data.SetAt(5, (*it).SendAddress);		memcpy(&Data[6], sData.GetData(), iSendSum);		Data.SetAt(6+iSendSum, CalCheckSum(sData, true));		Data.SetAt(7+iSendSum, 0x16);	}	else	{		Data.SetSize(5);		Data.SetAt(0, 0x10);		Data.SetAt(1, (*it).CCD.byte);		Data.SetAt(2, (*it).SendAddress);		Data.SetAt(3, CalCheckSum(sData, true));		Data.SetAt(4, 0x16);	}	iSendSum = Data.GetSize();	if (!m_pComm->SendData(Data.GetData(), iSendSum, 10))	{		m_bCommError = true;			return false;	}	//add by HYK for debug	//printData("Send data:",Data.GetData(),Data.GetSize());	//add end	if (g_PublicClass.m_MonitorData.m_MachineNo == (int)m_DevInfo.m_EquipNo)//送给自己	{		if (g_PublicClass.m_MonitorData.m_SrcFlag == 2 || g_PublicClass.m_MonitorData.m_SrcFlag == 3)		{			CDataNode* pNode = new CDataNode();			BYTE* pData = new BYTE[Data.GetSize()];			memcpy(pData, Data.GetData(), Data.GetSize());			memcpy(&pNode->m_nodeinfo, &m_CmdInfo, sizeof(st_nodeinfo));			pNode->m_nodeinfo.mtype = g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype;			pNode->m_nodeinfo.requestid = g_PublicClass.m_SelfPid;			pNode->m_nodeinfo.m_iResult = 1;			pNode->m_nodeinfo.m_SegmentPid = (long)pData;			pNode->m_nodeinfo.m_iSize = Data.GetSize();			pNode->m_nodeinfo.m_DataType = DATA_SENDDATA;			g_PublicClass.m_NodeManage.AddDispDataNode((void*)pNode);		}	}	Data.SetSize(0);	usleep(m_iTimesOut);	return true;}bool C103Device::ReceData(CByteArray& rData){	int iReadSum = 1;	BYTE btmp = 0;	if (!m_pComm->RecvData(&btmp, iReadSum, 10))	{		m_bCommError = true;		m_bHaveL1UserData = false;		return false;	}	if (iReadSum > 0) m_FrameHead = btmp;	else	{		(*it).bInit = false;		m_bHaveL1UserData = false;		return false;	}	if (m_FrameHead == 0x68)//可变长帧	{		iReadSum = 5;		rData.SetSize(iReadSum);		if (!m_pComm->RecvData(rData.GetData(), iReadSum, 10))		{			m_bCommError = true;			m_bHaveL1UserData = false;			return false;		}		if (rData.GetAt(0) == rData.GetAt(1)) m_FrameLength = rData.GetAt(0);		else		{			m_bHaveL1UserData = false;			return false;		}		if (rData.GetAt(2) != m_FrameHead)		{			m_bHaveL1UserData = false;			return false;		}		(*it).DCD.byte = rData.GetAt(3);			m_ReceAddress = rData.GetAt(4);		if ((*it).DCD.DevToCtrl.ACD == 1) m_bHaveL1UserData = true;		else m_bHaveL1UserData = false;		if (m_ReceAddress != (*it).SendAddress)		{			m_bHaveL1UserData = false;			return false;		}		rData.SetSize(0);			rData.SetSize(m_FrameLength-2);		iReadSum = m_FrameLength-2;		if (!m_pComm->RecvData(rData.GetData(), iReadSum, 10))		{			m_bCommError = true;			m_bHaveL1UserData = false;			return false;		}		iReadSum = 1;		if (!m_pComm->RecvData(&m_FrameCS, iReadSum, 10))		{			m_bCommError = true;			m_bHaveL1UserData = false;			return false;		}		iReadSum = 1;		if (!m_pComm->RecvData(&m_FrameEnd, iReadSum, 10))		{			m_bCommError = true;			m_bHaveL1UserData = false;			return false;		}		if (m_FrameEnd != 0x16)		{			m_bHaveL1UserData = false;			return false;		}		if (m_FrameCS != CalCheckSum(rData))		{			m_bHaveL1UserData = false;			return false;		}	}	else if (m_FrameHead == 0x10)//固定长帧	{		iReadSum = 4;			rData.SetSize(iReadSum);		if (!m_pComm->RecvData(rData.GetData(), iReadSum, 10))		{			m_bCommError = true;			m_bHaveL1UserData = false;			return false;		}				(*it).DCD.byte	= rData.GetAt(0);		m_ReceAddress	= rData.GetAt(1);		m_FrameCS		= rData.GetAt(2);		m_FrameEnd		= rData.GetAt(3);				if (m_FrameEnd != 0x16)		{			m_bHaveL1UserData = false;			return false;		}		if (m_ReceAddress != (*it).SendAddress)		{			m_bHaveL1UserData = false;			return false;		}		if ((*it).DCD.DevToCtrl.ACD == 1) m_bHaveL1UserData = true;		else m_bHaveL1UserData = false;		if ((*it).DCD.DevToCtrl.FunCode == 1) (*it).bLinkBusy = true;		else (*it).bLinkBusy = false;				rData.SetSize(0);		if (m_FrameCS != CalCheckSum(rData))		{			m_bHaveL1UserData = false;			return false;		}	}	else if (m_FrameHead == 0xE5)	{		m_bHaveL1UserData = false;		return true;	}	else 	{		m_bHaveL1UserData = false;		iReadSum = 300;		CByteArray tData;		tData.SetSize(iReadSum);		tData.SetAt(0, btmp);		if (!m_pComm->RecvData(tData.GetData()+1, iReadSum, 10))		{			m_bCommError = true;			m_bHaveL1UserData = false;			return false;		}		tData.SetSize(0);		return false;	}		if (g_PublicClass.m_MonitorData.m_MachineNo == (int)m_DevInfo.m_EquipNo)//送给自己	{		if (g_PublicClass.m_MonitorData.m_SrcFlag == 1 || g_PublicClass.m_MonitorData.m_SrcFlag == 3)		{			BYTE* pData = NULL;			int iLen = 0;			if (m_FrameHead == 0x10)			{				pData = new BYTE[5];				iLen = 5;				pData[0] = m_FrameHead;				pData[1] = (*it).DCD.byte;				pData[2] = m_ReceAddress;				pData[3] = m_FrameCS;				pData[4] = m_FrameEnd;			}			else 			{				pData = new BYTE[8+rData.GetSize()];				iLen = 8+rData.GetSize();				pData[0] = m_FrameHead;				pData[1] = m_FrameLength;				pData[2] = m_FrameLength;				pData[3] = m_FrameHead;				pData[4] = (*it).DCD.byte;				pData[5] = m_ReceAddress;				memcpy(&pData[6], rData.GetData(), rData.GetSize());				pData[6+rData.GetSize()] = m_FrameCS;				pData[7+rData.GetSize()] = m_FrameEnd;			}			CDataNode* pNode = new CDataNode();			memcpy(&pNode->m_nodeinfo, &m_CmdInfo, sizeof(st_nodeinfo));			pNode->m_nodeinfo.mtype = g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype;			pNode->m_nodeinfo.requestid = g_PublicClass.m_SelfPid;			pNode->m_nodeinfo.m_iResult = 1;			pNode->m_nodeinfo.m_SegmentPid = (long)pData;			pNode->m_nodeinfo.m_iSize = iLen;			pNode->m_nodeinfo.m_DataType = DATA_RECVDATA;			g_PublicClass.m_NodeManage.AddDispDataNode((void*)pNode);						//add by HYK for debug			//printData("Send data:",pData,iLen);			//add end		}	}		return true;}bool C103Device::RequestLinkStatus(){	CByteArray Data;	(*it).CCD.byte = 0x09;		Data.SetSize(0);	if (SendData(Data))

⌨️ 快捷键说明

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