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

📄 103device.cpp~

📁 电力系统Linux设备通讯程序 主要是为了各大电网通讯数据代码
💻 CPP~
📖 第 1 页 / 共 5 页
字号:
	{		Data.SetSize(0);		if (ReceData(Data))		{			if ((*it).DCD.DevToCtrl.FunCode == 11)			{				(*it).bLinkStatus = true;			}			else (*it).bLinkStatus = false;		}		else return false;	}	else return false;	return true;}bool C103Device::ResetFCB(){	CByteArray Data;	(*it).CCD.byte = 0x47;		Data.SetSize(0);	if (SendData(Data))	{		Data.SetSize(0);		if (ReceData(Data))		{			if (!m_bHaveL1UserData)			{				if (!RequestL2UserData()) return false;			}			int itimes = 0;			while (m_bHaveL1UserData) 			{				if (!RequestL1UserData()) return false;//之后一直是一级用户数据				if (m_ReceData.GetSize() == 0)				{					if (itimes++ > 5) break;				}				else 				{					itimes = 0;					ProcessData();				}			}		}		else return false;	}	else return false;	return true;}bool C103Device::ResetCU(){	(*it).bInit = false;//设初始化状态为否	CByteArray Data;	(*it).CCD.byte = 0x40;		Data.SetSize(0);	if (SendData(Data))	{		Data.SetSize(0);		if (ReceData(Data))		{			if (!m_bHaveL1UserData)//此处应该是有一级用户数据,没有只在请求一次,也可认为完成.			{				if (!RequestL2UserData()) return false;			}			int itimes = 0;			while (m_bHaveL1UserData) 			{				if (!RequestL1UserData()) return false;				if (m_ReceData.GetSize() == 0)				{					if (itimes++ > 10) break;				}				else itimes = 0;				if (m_ReceData.GetSize() > 0) ProcessData();			}		}		else return false;	}	else return false;	(*it).bInit = true;	return true;}bool C103Device::RequestL1UserData(){	CByteArray Data;	(*it).CCD.CtrlToDev.FCV = 1;		(*it).CCD.CtrlToDev.PRM = 1;	FlibFCB();	(*it).CCD.CtrlToDev.FunCode = 10;		m_ReceData.SetSize(0);	Data.SetSize(0);	if (SendData(Data))	{		Data.SetSize(0);		if (ReceData(Data))		{			if (Data.GetSize() > 0)			{				m_ReceData.Copy(Data);				m_ReceData.FreeExtra();				Data.SetSize(0);			}		}		else return false;	}	else return false;	return true;}bool C103Device::RequestL2UserData(){	CByteArray Data;	(*it).CCD.CtrlToDev.FCV = 1;		(*it).CCD.CtrlToDev.PRM = 1;	FlibFCB();	(*it).CCD.CtrlToDev.FunCode = 11;		Data.SetSize(0);	if (SendData(Data))	{		Data.SetSize(0);		if (ReceData(Data))		{			if (Data.GetSize() > 0)//此处可加上对循环上送的报文的处理			{			}			Data.SetSize(0);		}		else return false;	}	else return false;	return true;}bool C103Device::SendAsdu21(BYTE iGroup, BYTE iEntry, BYTE iKod){	CAsdu21 a21;	a21.m_Addr = (*it).AsduAddress;	a21.m_INF = 0xf1;//241	a21.m_NOG = 1;	DataSet* pDataSet = new DataSet;	pDataSet->gin.GROUP = iGroup;	pDataSet->gin.ENTRY = iEntry;	pDataSet->kod = iKod;	a21.m_DataSets.append(pDataSet);		CByteArray sData;	a21.BulidArray(sData);	if (!SendConfirm(sData)) return false;	return true;}bool C103Device::SendAsdu24(WORD iFAN, BYTE iTOO, BYTE iTOV, BYTE iACC){	CAsdu24 a24;	a24.m_Addr = (*it).AsduAddress;	a24.m_FUN = (*it).FunCode;	a24.m_FAN = iFAN;	a24.m_TOO = iTOO;	a24.m_TOV = iTOV;	a24.m_ACC = iACC;		CByteArray sData;	a24.BulidArray(sData);	if (!SendConfirm(sData)) return false;	return true;}bool C103Device::SendAsdu25(WORD iFAN, BYTE iTOO, BYTE iTOV, BYTE iACC){	CAsdu25 a25;	a25.m_Addr = (*it).AsduAddress;	a25.m_FUN = (*it).FunCode;	a25.m_FAN = iFAN;	a25.m_TOO = iTOO;	a25.m_TOV = iTOV;	a25.m_ACC = iACC;		CByteArray sData;	a25.BulidArray(sData);	if (!SendConfirm(sData)) return false;	return true;}bool C103Device::SendConfirm(CByteArray& sData){	(*it).CCD.CtrlToDev.FCV = 1;	(*it).CCD.CtrlToDev.PRM = 1;	FlibFCB();	(*it).CCD.CtrlToDev.FunCode = 3;		CByteArray rData;	int itimes = 3;	if (sData.GetSize() > 0)	{		while (itimes > 0)		{			if (!SendData(sData))			{				sData.SetSize(0);				return false;			}			if (ReceData(rData))			{				if (rData.GetSize() > 0)//防止在回复命令时带有一级用户数据				{					m_ReceData.SetSize(0);					m_ReceData.Copy(rData);					m_ReceData.FreeExtra();					ProcessData();					rData.SetSize(0);				}					if ((*it).DCD.DevToCtrl.FunCode == 0) break;				else if ((*it).DCD.DevToCtrl.FunCode == 1)				{					(*it).bLinkBusy = true;					return false;				}				else return false;			}			else if (m_bCommError == true) return false;			itimes--;		}		if (itimes == 0) return false;	}		return true;}bool C103Device::SendNoConfirm(CByteArray& sData){//FCB位不用变位	(*it).CCD.CtrlToDev.FCV = 0;	(*it).CCD.CtrlToDev.PRM = 1;	(*it).CCD.CtrlToDev.FunCode = 4;		if (sData.GetSize() > 0)	{		if (!SendData(sData))		{			sData.SetSize(0);			return false;		}	}	sData.SetSize(0);	return true;}bool C103Device::GI(){	CAsdu07 a7;	a7.m_Addr = (*it).AsduAddress;	a7.m_SCN = 0x00;		m_bGIFinished = false;		CByteArray sData;	a7.BulidArray(sData);	if (!SendConfirm(sData))	{		FlibFCB();		return false;	}		return true;}void C103Device::ProcessData(){	if (m_ReceData.GetSize() == 0) return;	switch (m_ReceData[0])	{		case 0x01://asdu01		ProcessAsdu1();		break;		case 0x02://asdu02		ProcessAsdu2();		break;		case 0x03://asdu03		ProcessAsdu3();		break;		case 0x04://asdu04		ProcessAsdu4();		break;		case 0x06://asdu06		ProcessAsdu6();		break;		case 0x08://asdu08		ProcessAsdu8();		break;		case 0x09://asdu09		ProcessAsdu9();		break;		case 0x0a://asdu10		ProcessAsdu10();		break;		case 0x17://asdu23		ProcessAsdu23();		break;		case 0x1A://asdu26		ProcessAsdu26();		break;		case 0x1B://asdu27		ProcessAsdu27();		break;		case 0x1C://asdu28		ProcessAsdu28();		break;		case 0x1D://asdu29		ProcessAsdu29();		break;		case 0x1E://asdu30		ProcessAsdu30();		break;		case 0x1F://asdu31		ProcessAsdu31();		break;	default : 		m_ReceData.SetSize(0);	break;}}void C103Device::ProcessAsdu1(){	CAsdu01 a1;	a1.SaveAsdu(m_ReceData);	a1.ExplainAsdu();	if (a1.m_COT == 9)//申请开关量的数据	{		CString sztmp = "", szfun = "", szinf = "";		sztmp.sprintf("%d", (*it).CpuNo);		szfun.sprintf("%d", a1.m_FUN);		szinf.sprintf("%d", a1.m_INF);		QDomNode node, cnode;		node = m_pxml->GetDomNode("body", "SWITCH", "pcpuno", sztmp);		if (node.isNull()) return;		if (!m_pxml->GetNodeAttr(node, "group", sztmp)) return;		int igroup = sztmp.toInt();		if (!m_pxml->GetNodeAttr(node, "cpuno", sztmp)) return;		int icpuno = sztmp.toInt();				cnode = m_pxml->GetChildNode(node, "ELEMENT", "pfun", szfun, "pinf", szinf);		if (cnode.isNull()) return;		if (!m_pxml->GetNodeAttr(cnode, "pfun", szfun)) return;		int ifun = szfun.toInt();		if (!m_pxml->GetNodeAttr(cnode, "pinf", szinf)) return;		int iinf = szinf.toInt();		if (!m_pxml->GetNodeAttr(cnode, "entry", sztmp)) return;		int ientry = sztmp.toInt();		if (!m_pxml->GetNodeAttr(cnode, "desc", sztmp)) return;				st_switchvalue SwitchValue;		memset(&SwitchValue, 0x00, sizeof(st_switchvalue));		SwitchValue.m_StationNo = g_PublicClass.m_StationNo;		SwitchValue.m_MachineNo = m_DevInfo.m_EquipNo;		SwitchValue.m_CpuNo = icpuno;		SwitchValue.m_FunCode = ifun;		SwitchValue.m_EventCode = iinf;		SwitchValue.m_GroupNo = igroup;		SwitchValue.m_Entry = ientry;				SwitchValue.m_State = a1.m_Dpi.dpi.dpi;		if (SwitchValue.m_State == 1) strcpy(SwitchValue.m_Value, m_szSDpi1);		else strcpy(SwitchValue.m_Value, m_szSDpi2);		m_SwitchValue.Add(SwitchValue);	}	else if (a1.m_COT == 1)	{		CString sztmp = "", szfun = "", szinf = "", szDate = "";		sztmp.sprintf("%d", (*it).CpuNo);		szfun.sprintf("%d", a1.m_FUN);		szinf.sprintf("%d", a1.m_INF);		QDomNode node, cnode;		int ifun = 0, iinf = 0, ientry = 0, igroup = 0, icpuno = 0;		CDataNode* pNode = NULL;		QDate date = QDate::currentDate();		st_event* pRpt_Event = NULL;		st_eventact* pEventAct = NULL;				node = m_pxml->GetDomNode("body", "ALERT", "pcpuno", sztmp);		if (node.isNull()) goto fault;		if (!m_pxml->GetNodeAttr(node, "group", sztmp)) return;		igroup = sztmp.toInt();		if (!m_pxml->GetNodeAttr(node, "cpuno", sztmp)) return;		icpuno = sztmp.toInt();				cnode = m_pxml->GetChildNode(node, "ELEMENT", "pfun", szfun, "pinf", szinf);		if (cnode.isNull()) return;		if (!m_pxml->GetNodeAttr(cnode, "pfun", szfun)) return;		ifun = szfun.toInt();		if (!m_pxml->GetNodeAttr(cnode, "pinf", szinf)) return;		iinf = szinf.toInt();		if (!m_pxml->GetNodeAttr(cnode, "entry", sztmp)) return;		ientry = sztmp.toInt();		if (!m_pxml->GetNodeAttr(cnode, "desc", sztmp)) return;				pRpt_Event = new st_event;		memset(pRpt_Event, 0x00, sizeof(st_event));		pEventAct = new st_eventact;		memset(pEventAct, 0x00, sizeof(st_eventact));				pRpt_Event->m_StationNo = g_PublicClass.m_StationNo;		pRpt_Event->m_MachineNo = m_DevInfo.m_EquipNo;		pRpt_Event->m_CpuNo = icpuno;		pRpt_Event->m_Entry = 0;		pRpt_Event->m_FaultNum = ++m_iFaultNo;		strcpy(pRpt_Event->m_MachineName, m_DevInfo.m_Equipment);				szDate.sprintf("%04d%02d%02d%02d%02d%02d%03d", date.year(), date.month(), date.day(), 					   a1.m_Cp32Time.Time.Hours, a1.m_Cp32Time.Time.Minutes, 					   a1.m_Cp32Time.Time.Milliseconds/1000, 					   a1.m_Cp32Time.Time.Milliseconds%1000);		memcpy(pRpt_Event->m_ActionTime, szDate.data(), szDate.length());		pEventAct->m_MachineNo = m_DevInfo.m_EquipNo;		pEventAct->m_CpuNo = icpuno;		pEventAct->m_FaultNum = m_iFaultNo;		pEventAct->m_ActNo = 0;		pEventAct->m_ActTime = 0;		pEventAct->m_Dpi = a1.m_Dpi.dpi.dpi;		if (a1.m_Dpi.dpi.dpi == 1) sztmp += m_szDpi1;		else sztmp += m_szDpi2;		memcpy(pEventAct->m_ActElement, sztmp.data(), sztmp.length());		pEventAct->m_FunCode = ifun;		pEventAct->m_EventCode = iinf;		pEventAct->m_GroupNo = igroup;		pEventAct->m_Entry = ientry;				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)pRpt_Event;		pNode->m_nodeinfo.m_iSize = sizeof(st_event);		pNode->m_nodeinfo.m_DataType = DATA_EVENT;		g_PublicClass.m_NodeManage.AddSendDataNode((void*)pNode);				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)pEventAct;		pNode->m_nodeinfo.m_iSize = sizeof(st_eventact);		pNode->m_nodeinfo.m_DataType = DATA_EVENTACT;		g_PublicClass.m_NodeManage.AddSendDataNode((void*)pNode);				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 = m_iFaultNo;		pNode->m_nodeinfo.m_SegmentPid = (long)0;		pNode->m_nodeinfo.m_iSize = 0;		pNode->m_nodeinfo.m_DataType = DATA_EVENTOVER;		g_PublicClass.m_NodeManage.AddSendDataNode((void*)pNode);				node = m_pxml->GetDomNode("body", "DEVCONFIG");		sztmp.sprintf("%s", m_DevInfo.m_Equipment);		cnode = m_pxml->GetChildNode(node, "FAULTNO", "devname", sztmp);		sztmp.sprintf("%d", m_iFaultNo);		m_pxml->InsertNodeAttr(cnode, "value", sztmp);		m_pxml->SaveXmlFile();		return;				fault://某些103保护也用ASDU1送故障信息,如国电南自PSL系列串口通信保护		node = m_pxml->GetDomNode("body", "FAULT", "pcpuno", sztmp);		if (node.isNull()) goto fault;		if (!m_pxml->GetNodeAttr(node, "group", sztmp)) return;		igroup = sztmp.toInt();		if (!m_pxml->GetNodeAttr(node, "cpuno", sztmp)) return;

⌨️ 快捷键说明

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