📄 103device.cpp
字号:
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)) { 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -