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

📄 103function.cpp

📁 电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    {        memcpy(&pData[i*nLen], &index, 4);//采样点序号        for (j=0; j<m_iNOC; j++)//处理所有通道的第i个采样点        {            if (j < (int)m_ChannelData.count())            {                pcData = m_ChannelData.at(j);                if (i < pcData->m_SDV.GetSize())                {                    tmp = pcData->m_SDV[i];                    memcpy(&pData[i*nLen+4+j], &tmp, 2);                }                else                {		    printf("i >= pcData->m_SDV.GetSize()\n");                    delete [] pData;                    fFile.close();                    return FALSE;                }            }            else            {		printf("j >= (int)m_ChannelData.count()\n");                delete [] pData;                fFile.close();                return FALSE;            }        }        index++;    }    pcData = m_ChannelData.at(0);    j = 0;    index = 0;    int* iTimeArray = new int[m_iNOE];	memset(iTimeArray, 0xFFFFFFFF, m_iNOE);//comtrade标准:逸失的采样点的时间戳为0XFFFFFFFF    for (i=0; i<m_iNOE; i++)    {        iInt = index*m_iINT;#ifdef NR_WAVE_DEBUG		cout<<"index="<<index<<"\tm_iINT="<<m_iINT;		cout<<"\tiInt="<<iInt<<endl;#endif        memcpy(&iTimeArray[i], &iInt, 4);//采样点的相对时间		if ((pcData->m_NDV[j]+k) < i+1)//采样点逸失处理        {#ifdef NR_WAVE_DEBUG			cout<<"pcData->m_NDV[j]+k) < i+1"<<endl;			cout<<"pcData->m_NDV[j]="<<pcData->m_NDV[j];			cout<<"\tk="<<k<<"\ti+1="<<i+1<<endl;#endif			if (j < pcData->m_NDV.GetSize())            {                k += pcData->m_NDV[j];                j++;                index = pcData->m_NFE[j]+1;            }            continue;        }        index++;    }/*    pcData = m_ChannelData.at(0);    j = 0;    index = 0;    k = 0;    for (i=0; i<m_iNOE; i++)    {        iInt = index;        memcpy(&pData[i*nLen+2], &iInt, 4);//采样点的相对时间        if ((pcData->m_NDV[j]+k) < i+1)        {            if (j < pcData->m_NDV.GetSize())            {                k += pcData->m_NDV[j];                j++;                index = pcData->m_NFE[j]+1;            }            continue;        }        index++;    }*/    WORD *wSwitchPoint = new WORD[iSwitchPoint*m_iNOE];    memset(wSwitchPoint, 0x00, (2*iSwitchPoint*m_iNOE));    WORD wtmp = 0;    index = 0;    for(j=0; j<m_SwitchDataNOT.GetAt(0); j++,index++)//给开关量赋初始状态值    {        if (index <= m_SwitchData.GetSize())        {            sData = m_SwitchData.GetAt(index);            wtmp = sData.data.DPI-1;        }        wtmp = wtmp << (j%16);        wSwitchPoint[j/16] = wSwitchPoint[j/16]|wtmp;    }    for (i=0; i<m_iNOE; i++)//把所有采样点的开关的值赋为初始值    {        memcpy(&wSwitchPoint[i*iSwitchPoint], &wSwitchPoint[0], 2*iSwitchPoint);    }    WORD wtmp1 = 0;    int inf = 0;    for (i=1; i<m_SwitchDataNOT.GetSize(); i++)//把所有的开关变位赋值    {        for (j=0; j<m_SwitchDataNOT.GetAt(i); j++)        {            sData = m_SwitchData.GetAt(index++);            wtmp = sData.data.TAP;            for (k=0; k<m_iNOE; k++)            {                memcpy(&wtmp1, &pData[k*nLen+2], 2);                if (wtmp1 == wtmp)                    break;            }            inf = FindSwitch(sData);            if (inf != 0)            {                memcpy(&wtmp, &wSwitchPoint[k*iSwitchPoint+(inf-1)/16], 2);                wtmp = ChangeSwitch(wtmp, (inf-1)%16, sData.data.DPI);                for (int a=k; a<m_iNOE; a++)                {                    memcpy(&wSwitchPoint[a*iSwitchPoint+(inf-1)/16], &wtmp, 2);                }            }        }    }    for (i=0; i<m_iNOE; i++)    {        memcpy(&pData[i*nLen+4+m_iNOC], &wSwitchPoint[i*iSwitchPoint], 2*iSwitchPoint);    }    for (i=0; i<m_iNOE; i++)    {        memcpy(&pData[i*nLen+2], &iTimeArray[i], 4);//重新置采样时间,采样点的相对时间    }    if (!fFile.open(IO_WriteOnly))    {        delete [] iTimeArray;        delete [] wSwitchPoint;        delete [] pData;	printf("canot Ceate empty dat file\n");        return FALSE;    }    fFile.writeBlock((unsigned char*)pData, m_iNOE*nLen*sizeof(WORD));    fFile.close();    delete [] iTimeArray;    delete [] wSwitchPoint;    delete [] pData;    return TRUE;}void CDistrubData::CreateHDRFile(CString szFileName){    CString strtmp = "", sztmp = "";    QFile fFile(szFileName+".hdr");    if (!fFile.open(IO_WriteOnly))        return;    QTextStream ts(&fFile);    strtmp = _T("南京银山网络:故障信息系统分析报告\r\n");    ts<<strtmp;    strtmp = _T("接入线路名称:"+m_szLineName+"\r\n");    ts<<strtmp;    strtmp = _T("接入设备名称:"+m_szDeviceName+"\r\n");    ts<<strtmp;    strtmp = _T("接入设备型号:"+m_szMachineType+"\r\n");    ts<<strtmp;    strtmp = szFileName.right(szFileName.length()-szFileName.findRev('/')-1);    strtmp = strtmp.left(strtmp.find('-'));    sztmp = _T("故障发生时间:"+strtmp+"\r\n");    ts<<sztmp;    strtmp = "\r\n";    ts<<strtmp;    strtmp = _T("录波分析结束!\r\n");    ts<<strtmp;    strtmp = _T("南京银山电子有限公司!\r\n");    ts<<strtmp;    fFile.close();}void CDistrubData::DeleteData(){    int iSize = m_ChannelData.count();    CChannelData *pcData;    for (int i=0; i<iSize; i++)    {        pcData = m_ChannelData.at(i);        if (pcData)        {            if (pcData->m_NDV.GetSize() > 0)                pcData->m_NDV.RemoveAll();            if (pcData->m_NFE.GetSize() > 0)                pcData->m_NFE.RemoveAll();            if (pcData->m_SDV.GetSize() > 0)                pcData->m_SDV.RemoveAll();            delete pcData;        }    }    m_ACCInfo.RemoveAll();    m_ChannelData.clear();    m_SwitchDataNOT.RemoveAll();    m_SwitchData.RemoveAll();}WORD CDistrubData::ChangeSwitch(WORD oldData, int no, int value){    WORD wtmp = 0;    WORD newData = 0;    for (int i=0; i<16; i++)    {        if (i != no)            wtmp = (oldData >> i) & 0x0001;        else            wtmp = value-1;        wtmp = wtmp << i;        newData = newData | wtmp;    }    return newData;}int CDistrubData::FindSwitch(SwitchData sData){    SwitchData tData;    int iSize = m_SwitchDataSort.GetSize();    for (int i=0; i<iSize; i++)    {        tData = m_SwitchDataSort.GetAt(i);        if ((sData.data.FUN == tData.data.FUN) && (sData.data.INF == tData.data.INF))            return tData.data.TAP;    }    return 0;}BOOL CDistrubData::SortData(){    CChannelData *pcData;    ACCInfo AccInfo;    int iSize = m_ChannelData.count();    if (iSize == 0)        return FALSE;    int *pAcc = new int[iSize];    memset(pAcc, 0x00, iSize*sizeof(int));    int iTemp = 0, j = 0, k = 0, i = 0;    for (i=0; i<iSize; i++)    {        pcData = m_ChannelData.at(i);        pAcc[i] = pcData->m_ACC;    }    for (i=0; i<iSize; i++)    {        iTemp = pAcc[i];        k = i;        for (j=i; j<iSize; j++)        {            if (iTemp > pAcc[j])            {                iTemp = pAcc[j];                k = j;            }        }        pAcc[k] = pAcc[i];        pAcc[i] = iTemp;        pcData = m_ChannelData.at(k);        AccInfo = m_ACCInfo.GetAt(k);        m_ChannelData.replace(k, m_ChannelData.at(i));        m_ChannelData.replace(i, pcData);        m_ACCInfo.SetAt(k, m_ACCInfo.GetAt(i));        m_ACCInfo.SetAt(i, AccInfo);    }    delete [] pAcc;    if (m_SwitchDataNOT.GetSize() == 0)        return FALSE;    iSize = m_SwitchDataNOT.GetAt(0);    if (iSize > m_SwitchData.GetSize())        return FALSE;//如果开关变位的个数少于初始的状态变位的个数,则数据有问题    SwitchData sData1, sData2;    k = 0;    int itime = 0;    for (i=0; i<iSize; i++)    {        itime = 0;        sData1 = m_SwitchData.GetAt(i);        iTemp = sData1.data.FUN*255+sData1.data.INF;        for (j=i; j<iSize; j++)        {            sData2 = m_SwitchData.GetAt(j);            if (iTemp > sData2.data.FUN*255+sData2.data.INF)            {                iTemp = sData2.data.FUN*255+sData2.data.INF;                k = j;                itime++;            }        }        if (itime > 0)        {            sData2 = m_SwitchData.GetAt(k);            m_SwitchData.SetAt(i, sData2);            m_SwitchData.SetAt(k, sData1);        }    }    for (i=0; i<iSize; i++)    {        sData1 = m_SwitchData.GetAt(i);        sData1.data.TAP = i+1;        m_SwitchDataSort.Add(sData1);    }    return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -