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

📄 baseai.c

📁 电力系统中的保护装置全部代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        {48,10e6/(Sample_Point*48),48/3.1415926536},{48.5,10e6/(Sample_Point*48.5),48.5/3.1415926536},     //3
        {49,10e6/(Sample_Point*49),49/3.1415926536},{49.5,10e6/(Sample_Point*49.5),49.5/3.1415926536},     //4
        {50,10e6/(Sample_Point*50),50/3.1415926536},{50.5,10e6/(Sample_Point*50.5),50.5/3.1415926536},     //5
        {51,10e6/(Sample_Point*51),51/3.1415926536},{51.5,10e6/(Sample_Point*51.5),51.5/3.1415926536},     //6
        {52,10e6/(Sample_Point*52),52/3.1415926536},{52.5,10e6/(Sample_Point*52.5),52.5/3.1415926536},     //7
        {53,10e6/(Sample_Point*53),53/3.1415926536},{53.5,10e6/(Sample_Point*53.5),53.5/3.1415926536},     //8
        {54,10e6/(Sample_Point*54),54/3.1415926536},{54.5,10e6/(Sample_Point*54.5),54.5/3.1415926536},     //9
        {55,10e6/(Sample_Point*55),55/3.1415926536},{55.5,10e6/(Sample_Point*55.5),55.5/3.1415926536},     //10
        };

UNSIGNED        FreqIndex = 10;
UNSIGNED        SampleIntervalChangeFlag,SampleIntervalChangeClock;
UNSIGNED        SampleInterval = 8333;

/***********************************************************************************/
/*      滤波,计算频率,调整采样间隔                                                               */ 
/***********************************************************************************/
extern  float FFRENQ();
VOID    Calculate(VOID)
{
        register FREQSTRU    *p = &FreqCtrl[FreqIndex];
        register float       f1;
        
        fei_calculate();                                       //滤波
        
        Phase_V_Cal();                                         //计算线电压
                        
        if(SampleIntervalChangeFlag == 2)                      //是否正在调整采样频率
        {
                if(TMD_System_Clock - SampleIntervalChangeClock < 50) return;    //等待两个周波
                SampleIntervalChangeFlag = 0;
        }

        f1 = FFRENQ();                                         //计算频率中间间隔
        if(f1 == 0)                                            //当线电压全部为零时,f1为0
        {
                samp_f = 50.0;                                 //当线电压全部为零时,按默认频率
        }
        else
        {
                samp_f = p->frequency - p->coeff * f1;         //计算频率结果
        }
/*
        if ((samp_f >= 45) && (samp_f <= 55.5))                //如果频率不为0,执行以下程序,检查是否需要调整采样间隔
        {
                if (fabs(samp_f - p->frequency) > 0.5)
                {
                        if (samp_f > p->frequency)
                        {
                                while (FreqIndex < FreqModifyNumber - 1)
                                {
                                        p++;
                                        FreqIndex++;
                                        SampleInterval = (UNSIGNED)p->sample_interval;
                                        SampleIntervalChangeFlag = 1;
                                        if (fabs(samp_f - p->frequency) < 0.5)break;
                                }
                        }
                        else
                        {
                                while (FreqIndex)
                                {
                                        p--;
                                        FreqIndex--;
                                        SampleInterval = (UNSIGNED)p->sample_interval;
                                        SampleIntervalChangeFlag = 1;
                                        if (fabs(samp_f - p->frequency) < 0.5)break;
                                }
                        }
                }
        }*/
}

/***********************************************************************************/
/*      遥测量计算                                                                 */ 
/***********************************************************************************/        
float   fIA,fIC,fUAB,fUBC,fUCA,fP,fQ;
VOID    RemoteMeasure(VOID)
{
    static   UNSIGNED    uMEAInterval;                    //计算测量的间隔

    register UNSIGNED    iharmous,iSampleIndex;
    register float       *pf,fuabcos,fuabsin,fucbcos,fucbsin,fiacos,fiasin,ficcos,ficsin,ftmp1,ftmp2;
    register MEASTRU     *pMeasure;
    register PRO_CHANNEL *pChn;
    register OPTION      old_preempt;
    
    if (TMD_System_Clock - uMEAInterval > 2000)      //每2秒计算一次
    {
        uMEAInterval = TMD_System_Clock;         //刷新时间
        iSampleIndex = SampleIndex;              //取当前采样点位置
        
        for(iharmous = 0; iharmous < HARMOUSMAX; iharmous++) //计算各次谐波
        {
            pf = HarmousCoeff[iharmous];                     //取第iharmous次谐波的滤波系数

            pChn = &AIChn[MIa_Chn];                          //计算IA的第iharmous次谐波实,虚部
            Cal_Harmous(&SampleData[MIa_Chn].value[iSampleIndex], pf, &VIA[iharmous],
                        pChn->chl_calculate_coefficient * pChn->chl_scale,
                        cos(pChn->chl_angle_compensate * (iharmous + 1)),
                        sin(pChn->chl_angle_compensate * (iharmous + 1)));

            pChn = &AIChn[MIc_Chn];                          //计算IC的第iharmous次谐波实,虚部
            Cal_Harmous(&SampleData[MIc_Chn].value[iSampleIndex], pf, &VIC[iharmous],
                        pChn->chl_calculate_coefficient * pChn->chl_scale,
                        cos(pChn->chl_angle_compensate * (iharmous + 1)),
                        sin(pChn->chl_angle_compensate * (iharmous + 1)));

            pChn = &AIChn[Ua_Chn];                           //计算Ua的第iharmous次谐波实,虚部
            Cal_Harmous(&SampleData[Ua_Chn].value[iSampleIndex], pf, &VUa[iharmous],
                        pChn->chl_calculate_coefficient * pChn->chl_scale,
                        cos(pChn->chl_angle_compensate * (iharmous + 1)),
                        sin(pChn->chl_angle_compensate * (iharmous + 1)));

            pChn = &AIChn[Ub_Chn];                           //计算Ub的第iharmous次谐波实,虚部
            Cal_Harmous(&SampleData[Ub_Chn].value[iSampleIndex], pf, &VUb[iharmous],
                        pChn->chl_calculate_coefficient * pChn->chl_scale,
                        cos(pChn->chl_angle_compensate * (iharmous + 1)),
                        sin(pChn->chl_angle_compensate * (iharmous + 1)));

            pChn = &AIChn[Uc_Chn];                           //计算Uc的第iharmous次谐波实,虚部
            ftmp1 = pChn->chl_angle_compensate * (iharmous + 1);
            ftmp2 = cos(pChn->chl_angle_compensate * (iharmous + 1));
            Cal_Harmous(&SampleData[Uc_Chn].value[iSampleIndex], pf, &VUc[iharmous],
                        pChn->chl_calculate_coefficient * pChn->chl_scale,
                        cos(pChn->chl_angle_compensate * (iharmous + 1)),
                        sin(pChn->chl_angle_compensate * (iharmous + 1)));
            
            fuabcos = VUa[iharmous].real - VUb[iharmous].real;      //Uab实部
            fuabsin = VUa[iharmous].imag - VUb[iharmous].imag;      //Uab虚部
            fucbcos = VUc[iharmous].real - VUb[iharmous].real;      //Ucb实部
            fucbsin = VUc[iharmous].imag - VUb[iharmous].imag;      //Ucb虚部
            fiacos = VIA[iharmous].real;                            //IA实部
            fiasin = VIA[iharmous].imag;                            //IA虚部
            ficcos = VIC[iharmous].real;                            //IC实部
            ficsin = VIC[iharmous].imag;                            //IC虚部                    
            VP[iharmous] = fuabcos * fiacos + fuabsin * fiasin      //第iharmous次谐波的有功功率
                         + fucbcos * ficcos + fucbsin * ficsin;                    
            VQ[iharmous] = fuabsin * fiacos - fuabcos * fiasin      //第iharmous次谐波的无功功率
                         + fucbsin * ficcos - fucbcos * ficsin;
        }
        
        fIA = fIC = fUAB = fUBC = fUCA = fP = fQ = 0;     //电压,电流的有效值平方等于各次
                                                          //谐波有效值平方的和,功率等于各次谐波
                                                          //功率的和                
        for(iharmous = 0; iharmous < HARMOUSMAX; iharmous++)
        {
            ftmp1 = VIA[iharmous].real;
            ftmp2 = VIA[iharmous].imag;
            fIA += ftmp1 * ftmp1 + ftmp2 * ftmp2;         //累加IA各次谐波有效值的平方

            ftmp1 = VIC[iharmous].real;
            ftmp2 = VIC[iharmous].imag;
            fIC += ftmp1 * ftmp1 + ftmp2 * ftmp2;         //累加IC各次谐波有效值的平方
            
            ftmp1 = VUa[iharmous].real - VUb[iharmous].real;
            ftmp2 = VUa[iharmous].imag - VUb[iharmous].imag;
            fUAB += ftmp1 * ftmp1 + ftmp2 * ftmp2;        //累加Uab各次谐波有效值的平方
            
            ftmp1 = VUb[iharmous].real - VUc[iharmous].real;
            ftmp2 = VUb[iharmous].imag - VUc[iharmous].imag;
            fUBC += ftmp1 * ftmp1 + ftmp2 * ftmp2;        //累加Ubc各次谐波有效值的平方

            ftmp1 = VUc[iharmous].real - VUa[iharmous].real;
            ftmp2 = VUc[iharmous].imag - VUa[iharmous].imag;
            fUCA += ftmp1 * ftmp1 + ftmp2 * ftmp2;        //累加Uca各次谐波有效值的平方

            fP += VP[iharmous];                           //累加各次谐波有功功率

            fQ += VQ[iharmous];                           //累加各次谐波无功功率
        }

        fIA = sqrt(fIA);             //开方后,得到有效值
        fIC = sqrt(fIC);             //开方后,得到有效值
        fUAB = sqrt(fUAB);           //开方后,得到有效值
        fUBC = sqrt(fUBC);           //开方后,得到有效值
        fUCA = sqrt(fUCA);           //开方后,得到有效值

        pMeasure = measure;              //为测量结构体变量赋值
        pMeasure++->value = fIA;
        pMeasure++->value = fIA;
        pMeasure++->value = fIC;
        pMeasure++->value = fUAB;
        pMeasure++->value = fUBC;
        pMeasure++->value = fUCA;
        pMeasure++->value = fP;
        pMeasure++->value = fQ;
        pMeasure++->value = samp_f - 50;          //频率取偏离额定值的值
        old_preempt = NU_Change_Preemption(NU_NO_PREEMPT);    //不再切换任务,避免被其他任务打断,造成误动
        pMeasure++->value = AIChn[PI0_Chn].chla_fundamental_real;
        pMeasure++->value = AIChn[PI0_Chn].chla_fundamental_imaginary; 
        pMeasure++->value = AIChn[Ua_Chn].chla_fundamental_real + 
                            AIChn[Ub_Chn].chla_fundamental_real +
                            AIChn[Uc_Chn].chla_fundamental_real;
        pMeasure++->value = AIChn[Ua_Chn].chla_fundamental_imaginary + 
                            AIChn[Ub_Chn].chla_fundamental_imaginary +
                            AIChn[Uc_Chn].chla_fundamental_imaginary;       
        NU_Change_Preemption(old_preempt);                    //可以切换任务
        
        if (ASDU_50_FlagJK1 & _Data_Request)    //是否有103请求遥测量标志
        {
            ASDU_50_FlagJK1 &= ~_Data_Request;
  
            ASDU_50_FlagJK1 |= _Data_RDY;       //置数据准备好标志    
        }  
         if (ASDU_9_FlagJK1 & _Data_Request9)    //是否有103请求遥测量标志
        {
            ASDU_9_FlagJK1 &= ~_Data_Request9;
  
            ASDU_9_FlagJK1 |= _Data_RDY9;       //置数据准备好标志    
        }
    }  
}

/**********************************************************/
/*               public code for calculate                */  
/**********************************************************/
void Phase_V_Cal(void)                          //计算线电压
{
    register float   fa1,fa2,fb1,fb2,fc1,fc2;

    fa1 = AIChn[Ua_Chn].chla_fundamental_real;
    fa2 = AIChn[Ua_Chn].chla_fundamental_imaginary;
    fb1 = AIChn[Ub_Chn].chla_fundamental_real;
    fb2 = AIChn[Ub_Chn].chla_fundamental_imaginary;
    fc1 = AIChn[Uc_Chn].chla_fundamental_real;
    fc2 = AIChn[Uc_Chn].chla_fundamental_imaginary;
    
    Uab = (fa1 - fb1) * (fa1 - fb1) + (fa2 - fb2) * (fa2 - fb2);
    Ubc = (fb1 - fc1) * (fb1 - fc1) + (fb2 - fc2) * (fb2 - fc2);
    Uca = (fc1 - fa1) * (fc1 - fa1) + (fc2 - fa2) * (fc2 - fa2);
}
/**********************************************************/ 
/***********************************************************************************/
/*      模拟量通道结构体初始化                                                     */ 
/***********************************************************************************/
VOID CHLDEF_Initialize(VOID)
{
    register PRO_CHANNEL  *p;
/*-------------------直流5V--------------------------*/
    p = &AIChn[DC_Chn];           
    p->chl_Num                   = DC_Chn;
    p->pchl_name                 = "直流5V";
    p->pchl_value_dimension      = "V";
    p->chl_calculate_coefficient = DDD_FOURIER_VOLTAGE;
    p->chl_scale                 = 1;

⌨️ 快捷键说明

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