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

📄 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 + -