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

📄 103device.cpp

📁 电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        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 + -