📄 103device.cpp
字号:
a6.m_Cp56Time2a.Time.Hours = nowTime.hour(); a6.m_Cp56Time2a.Time.Minutes = nowTime.minute(); a6.m_Cp56Time2a.Time.Milliseconds = (WORD)(nowTime.second()*1000+nowTime.msec()); CByteArray sData; a6.BulidArray(sData); if (!SendNoConfirm(sData)) { (*it).SendAddress = itmpsendaddr; SendMsgToMain(-1, "申请修改时钟失败"); return false; } (*it).SendAddress = itmpsendaddr; SendMsgToMain(1, "申请修改时钟成功"); return true;}bool C103Device::RequireDistrubt(){ for (int i=0; i<m_iCpuNum; i++) { it = m_CommParam.at(i); if (!ResetCU()) { SendMsgToMain(-1, "申请扰动波形错误"); return false; } int itimes = 0; if (!SendAsdu24(0, 0x18, 0x01, 0)) { SendMsgToMain(-1, "申请扰动波形失败"); return false; } while (m_bHaveL1UserData) { if (RequestL1UserData()) { if (m_ReceData.GetSize() == 0) { if (itimes++ > 5) { SendMsgToMain(-1, "申请扰动波形失败"); return false; } } else itimes = 0; if (m_ReceData.GetSize() > 0) ProcessData(); } else FlibFCB(); } } if (m_DDTable.GetSize() > 0) { SendMsgToMain(1, "申请扰动波形成功,数据正在上送,请等待"); } else { SendMsgToMain(1, "申请扰动波形成功,但没有波形可传送"); } return true;}bool C103Device::XunJian(){ for (int i=0; i<m_iCpuNum; i++) { it = m_CommParam.at(i); if ((*it).bInit == false) { if (!ResetCU()) return false; } if (!RequestL2UserData()) { FlibFCB(); return false; } int itimes = 0; while (m_bHaveL1UserData) { if (RequestL1UserData()) { if (m_ReceData.GetSize() == 0) { if (itimes++ > 10) break; } else itimes = 0; if (m_ReceData.GetSize() > 0) ProcessData(); } else { FlibFCB(); return false; } } } if (m_DDTable.GetSize() > 0) { GetDistrubData(); } return true;}bool C103Device::GetGroupData(CAsdu10& a10, BYTE iGroup, BYTE iEntry, BYTE iKod){ int itime = 0;//添加从配置文件中读取该组的结束标志,在下面的注释处使用 if (!SendAsdu21(iGroup, iEntry, iKod)) return false; while (1) { if (m_bHaveL1UserData) { if (RequestL1UserData()) { if (m_ReceData.GetSize() > 0) { if (m_ReceData[0] == 0x0a) { itime = 0; a10.SaveAsdu(m_ReceData); if (a10.m_COT == 0x01)//南瑞RCS系列保护送故障时测距值和电流值等信息 { CFaultExplain FaultExplain; a10.ExplainAsdu(FaultExplain); m_FaultExplain.Add(FaultExplain); } else//此处不会出现修改定值等的传送原因 { a10.ExplainAsdu(); if (a10.m_NGD.ngd.Cont == 0) break;//此处应该用上面读取的结束标志来判断 } } else { ProcessData(); } } } else return false; } else { while (1) { if (!RequestL2UserData()) return false; if (m_bHaveL1UserData) break; if (itime++ > m_iFixTime) return false;//在iFixTime次都没有一级用户数据时退出 usleep(200); } } } return true;}void C103Device::ExplainGroupData(CAsdu10& a10){ printf("explain a10 group,a10 dataset count %d\n",a10.m_DataSets.count()); //if(a10.m_DataSets.count()==0)return; st_paramvalue* pEValue = new st_paramvalue[a10.m_DataSets.count()]; memset(pEValue, 0x00, sizeof(st_paramvalue)*a10.m_DataSets.count()); DataSet* pDataSet = NULL; CString sztmp = "", szcpuno = "", szgroup = "", szentry = ""; for (int i=0; i<(int)a10.m_DataSets.count(); i++) { sztmp = ""; pEValue[i].m_StationNo = g_PublicClass.m_StationNo;//需要修改 pEValue[i].m_MachineNo = m_DevInfo.m_EquipNo; pEValue[i].m_Sector = 0;//需要修改 pEValue[i].m_FunCode = a10.m_FUN; pDataSet = a10.m_DataSets.at(i); szcpuno.sprintf("%d", (*it).CpuNo); szgroup.sprintf("%d", pDataSet->gin.GROUP); szentry.sprintf("%d", pDataSet->gin.ENTRY); QDomNode node, cnode; node = m_pxml->GetDomNode("body", "pcpuno", szcpuno, "pgroup", szgroup); if (node.isNull()) continue; cnode = m_pxml->GetChildNode(node, "ELEMENT", "pentry", szentry); if (!m_pxml->GetNodeAttr(node, "group", szgroup)) continue; pEValue[i].m_Group = szgroup.toInt(); if (!m_pxml->GetNodeAttr(node, "cpuno", sztmp)) continue; pEValue[i].m_CpuNo = sztmp.toInt(); if (!m_pxml->GetNodeAttr(cnode, "entry", szentry)) continue; pEValue[i].m_Entry = szentry.toInt(); if (m_iPrimary == 1) { pEValue[i].m_ValueType = pDataSet->gdd.gdd.DataType; } else { if (m_pxml->GetNodeAttr(cnode, "type", sztmp)) continue; pEValue[i].m_ValueType = sztmp.toInt(); } pEValue[i].m_ValueLen = pDataSet->gdd.gdd.DataSize; pEValue[i].m_ValueIndex = i+1; switch (pDataSet->gdd.gdd.DataType) { case 1://OS8ASCII字符串 { memcpy(pEValue[i].m_Value, pDataSet->gid.GetData(), pDataSet->gid.GetSize()); break; } case 2://成组8位串 { CString strtmp = ""; for (int j=0; j<pDataSet->gid.GetSize(); j++) { strtmp.sprintf("%X", pDataSet->gid.GetAt(j)); sztmp += strtmp; } memcpy(pEValue[i].m_Value, sztmp.data(), sztmp.length()); break; } case 3://无符号整数 { uint itmp = 0; if (pDataSet->gid.GetSize() <= (int)sizeof(uint)) { memcpy(&itmp, pDataSet->gid.GetData(), pDataSet->gid.GetSize()); } sztmp.sprintf("%d", itmp); memcpy(pEValue[i].m_Value, sztmp.data(), sztmp.length()); break; } case 4://整数 { int itmp = 0; if (pDataSet->gid.GetSize() <= (int)sizeof(int)) { memcpy(&itmp, pDataSet->gid.GetData(), pDataSet->gid.GetSize()); } sztmp.sprintf("%d", itmp); memcpy(pEValue[i].m_Value, sztmp.data(), sztmp.length()); break; } case 7://R32.23短实数 { float ftmp = 0; if (pDataSet->gid.GetSize() <= (int)sizeof(float)) { memcpy(&ftmp, pDataSet->gid.GetData(), pDataSet->gid.GetSize()); } sztmp.sprintf("%g", ftmp); memcpy(pEValue[i].m_Value, sztmp.data(), sztmp.length()); break; } case 35://国电南自WDK上定值时的特殊类型,和94规约有一点联系 { BYTE b1 = pDataSet->gid.GetAt(1)/16; BYTE b2 = pDataSet->gid.GetAt(1)%16; BYTE b3 = pDataSet->gid.GetAt(0)/16; BYTE b4 = pDataSet->gid.GetAt(0)%16; switch (b1) { case 0: sztmp.sprintf("%d%d%d.0", b2, b3, b4); break; case 1: sztmp.sprintf("%d%d.%d", b2, b3, b4); break; case 2: sztmp.sprintf("%d.%d%d", b2, b3, b4); break; case 3: sztmp.sprintf("0.%d%d%d", b2, b3, b4); break; default: break; } memcpy(pEValue[i].m_Value, sztmp.data(), sztmp.length()); break; } case 36://国电南自WDK上定值时的特殊类型,和94规约有一点联系 { sztmp.sprintf("%02X%02X", pDataSet->gid.GetAt(1), pDataSet->gid.GetAt(0)); memcpy(pEValue[i].m_Value, sztmp.data(), sztmp.length()); break; } default: break; } } CDataNode* pNode = new CDataNode(); memcpy(&pNode->m_nodeinfo, &m_CmdInfo, sizeof(st_nodeinfo)); pNode->m_nodeinfo.mtype = m_CmdInfo.requestid; pNode->m_nodeinfo.requestid = m_CmdInfo.mtype; pNode->m_nodeinfo.m_iResult = 1; pNode->m_nodeinfo.m_SegmentPid = (long)pEValue; pNode->m_nodeinfo.m_iSize = sizeof(st_paramvalue)*a10.m_DataSets.count(); if (m_CmdInfo.m_DataType == WM_REQUESTPARAMVALUE)//申请定值 { pNode->m_nodeinfo.m_DataType = DATA_REQUESTPARAMVALUE; } else if (m_CmdInfo.m_DataType == WM_REQUESTPVSECTOR)//申请定值区号 { pNode->m_nodeinfo.m_DataType = DATA_REQUESTSECTOR; } else if (m_CmdInfo.m_DataType == WM_REQUESTANLOGVALUE)//申请采样值 { pNode->m_nodeinfo.m_DataType = DATA_REQUESTANLOGVALUE; } else if (m_CmdInfo.m_DataType == WM_REQUESTSHUVALUE)//申请压板状态 { pNode->m_nodeinfo.m_DataType = DATA_REQUESTSHIFTVALUE; } g_PublicClass.m_NodeManage.AddSendDataNode((void*)pNode);}void C103Device::SendMsgToMain(int iResult, CString szMsg /* = "" */){ CDataNode* pNode = new CDataNode(); memcpy(&pNode->m_nodeinfo, &m_CmdInfo, sizeof(st_nodeinfo)); pNode->m_nodeinfo.mtype = m_CmdInfo.requestid; pNode->m_nodeinfo.requestid = m_CmdInfo.mtype; pNode->m_nodeinfo.m_iResult = iResult; pNode->m_nodeinfo.m_DisplayFlag = 1; if (szMsg != "") { char* pMsg = new char[szMsg.length()+1]; memset(pMsg, 0x00, szMsg.length()+1); memcpy(pMsg, szMsg.data(), szMsg.length()); pNode->m_nodeinfo.m_SegmentPid = (long)pMsg; pNode->m_nodeinfo.m_iSize = szMsg.length()+1; } g_PublicClass.m_NodeManage.AddSendDataNode((void*)pNode);}bool C103Device::GetDistrubData(){ int iSize = m_DDTable.GetSize(); DistrubDataTable Ddt; int iErrors = 0; int iHaveNoData = 0; CWordArray FanArray; WORD wFan = 0; WORD wNof = 0; for (int i=0; i<iSize;) { Ddt = m_DDTable.GetAt(0); for (int j=0; j<m_iCpuNum; j++) { it = m_CommParam.at(j); if ((*it).AsduAddress == Ddt.addr) break; } ResetCU();//初始化一次,否则在召唤BP2B的波形时下一个波形上不来 if (!SendAsdu24(Ddt.FAN, 0x01, 0, 0)) return false; do { if (!RequestL1UserData()) { FlibFCB(); if (iErrors++ > 3) return false; } iErrors = 0; if (m_ReceData.GetSize() == 0) { if (iHaveNoData++ > 10) { m_DistrubData.DeleteData(); return false; } usleep(500); } else iHaveNoData = 0; if (m_ReceData.GetSize() > 0) ProcessData(); if (m_DDStatus == 1)//成功传送一个扰动数据 { m_DDStatus = 0; memcpy(m_DistrubData.m_FaultDataTime.byte, Ddt.Cp56Time.byte, 7*sizeof(BYTE)); m_DistrubData.m_szLineName = CString(m_DevInfo.m_LineName); m_DistrubData.m_iDeviceNo = m_DevInfo.m_EquipNo; m_DistrubData.m_szDeviceName = CString(m_DevInfo.m_Equipment); m_DistrubData.m_iFAN = Ddt.FAN; int imill = m_iWavType+m_DistrubData.m_FaultDataTime.Time.Milliseconds%1000; if (imill > 1000) { struct tm timestart; timestart.tm_sec = m_DistrubData.m_FaultDataTime.Time.Milliseconds/1000; timestart.tm_min = m_DistrubData.m_FaultDataTime.Time.Minutes; timestart.tm_hour = m_DistrubData.m_FaultDataTime.Time.Hours; timestart.tm_mday = m_DistrubData.m_FaultDataTime.Time.DaysOfMonth; timestart.tm_mon = m_DistrubData.m_FaultDataTime.Time.Months; timestart.tm_year = m_DistrubData.m_FaultDataTime.Time.Years+2000-1900; time_t time = mktime(×tart)+imill/1000; struct tm* ptimebegin = localtime(&time); m_DistrubData.m_FaultStartTime.Time.Years = ptimebegin->tm_year+1900-2000; m_DistrubData.m_FaultStartTime.Time.Months = ptimebegin->tm_mon; m_DistrubData.m_FaultStartTime.Time.DaysOfMonth = ptimebegin->tm_mday; m_DistrubData.m_FaultStartTime.Time.Hours = ptimebegin->tm_hour; m_DistrubData.m_FaultStartTime.Time.Minutes = ptimebegin->tm_min; m_DistrubD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -