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

📄 103device.cpp

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