自己写的流量波动检测函数

/*******************************************************************************
* Function Name  : powerdownA_task(void)
* Description    : 记录A路断电的数据
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
#include "state_task.h"
#include "task_control.h"
#include "24cxx.h"
#include "data.h"
#include "delay.h"
#include "iwdg.h"

//20190525
#include     "GUI_task.h"

OS_EVENT *mutex_eeprom;
/*******************************************************************************
* Function Name  : state_task
* Description    : 计算流量的状态  得到流量的变化趋势
* Input          : None
* Output         : None
* Return         : None
* Author         : Aision
* Attention      : 
//  时间轴  T1  T2  T3
*******************************************************************************/

//gf_QrT[X]  x越大代表当前数据越新  数组存储的为第[X]秒的流量

float gf_QrT[C_QrT]=0.0f;

//求当前最新的流量和dRange-x次时间前的流量的差值  
/*
              gf_dQrsec[0]  = gf_QrT[dRange]   -  gf_QrT[dRange-1];//6-5    第6s和第5s的流量变化
              gf_dQrsec[1]  = gf_QrT[dRange]   -  gf_QrT[dRange-2];//6-4    第6s和第4s的流量变化
              gf_dQrsec[2]  = gf_QrT[dRange]   -  gf_QrT[dRange-3];//6-3    
              gf_dQrsec[3]  = gf_QrT[dRange]   -  gf_QrT[dRange-4];//6-2        
                gf_dQrsec[4]  = gf_QrT[dRange]   -  gf_QrT[dRange-5];//6-1        
*/
extern pid_TypeDef pid;
float gf_dQrsec[C_QrT] = 0.0f;
float gf_PwmT[C_QrT]   = 0.0f;
//20190601 更改低级错误 定义时  x【6】 索引最大到5
float gf_DragRank[dRange+1] = 0.0f;
//20190604 每秒的相对于设定流量的偏差值
float gf_dQrsecErr[C_QrT] = 0.0f;



//状态位:  
//1:  当前流量为0  
u16  gu16_FlagQrZero =0;
//空载  =0: 非空载   =1:空载
u8   gu8A_FlagEmptyDrag = 0;
//反应系统状态的标志位  0:无波动  1:波动幅度超过上下限阈值的波动 2:只在超上限区域波动  3:只在超下限区域波动
u8  gu8_StatesQrWave = 0;  



u8 gu8_FlagQrWaveHigh = 0;
u8 gu8_FlagQrWaveLow  = 0;
//Flag index
int16_t gi16_FlagQrWaveTsec = 0;

u8 gu8_StatusQrLast = 0;

u8 gu8_QrWavePeriod =0;

u8 gu8_StatusQrWave= 0;

u8 gu8_CntQrWave= 0;

//20190525  timer
u16  gu16_Cnt = 0;

u8 gu8_FlagQrStabliz=0;
void state_task(void *pdata)
{
    
    u8 err;    
    u8 lu8_Cnt=0;
    u8 lu8_CntStab=0;
    u8 l_i=0;

    
    for(;;)
    {        
                //流量稳定性判断AB-1
              //A
                gf_QrT[C_QrT-1]  = Instru_Data.QT;
                gf_PwmT[C_QrT-1] = pid.OutputValue;
                gf_dQrsecErr[C_QrT-1] = pid.Err;    

                // 第6s和第4s的 流量之差   除以  PWM  之差
                if( (( (u16)gf_PwmT[C_QrT-1] - (u16)gf_PwmT[C_QrT-2] )) > 1  )
                {
                        gf_DragRank[0] = (gf_QrT[C_QrT-1] - gf_QrT[C_QrT-2]) / ( (u16)gf_PwmT[C_QrT-1] - (u16)gf_PwmT[C_QrT-2] ) ;
                }
                else{}
//                     gf_DragRank[0] = (gf_QrT[dRange] - gf_QrT[dRange-2]) / ( (u16)gf_PwmT[dRange] - (u16)gf_PwmT[dRange-2] ) ;

                //C_Qrt =13
                // 此处一共记录C_QrT秒的瞬时流量值 那么gf_dQrsec 最大记录C_QrT-1个数据  因为是从【0】开始的 所以角标最大到C_Qrt-2
                for(l_i=0;l_i<=C_QrT-2;l_i++)    
                        gf_dQrsec[l_i] = gf_QrT[C_QrT-1] - gf_QrT[C_QrT-l_i-2];
                
//               gf_dQrsec[0]  = gf_QrT[C_QrT-1]   -  gf_QrT[C_QrT-2];//12-11  
//               gf_dQrsec[1]  = gf_QrT[dRange]   -  gf_QrT[dRange-2]; //6-4
//               gf_dQrsec[2]  = gf_QrT[dRange]   -  gf_QrT[dRange-3]; //6-3    
//               gf_dQrsec[3]  = gf_QrT[dRange]   -  gf_QrT[dRange-4]; //6-2        
//                 gf_dQrsec[4]  = gf_QrT[dRange]   -  gf_QrT[dRange-5]; //6-1        
             //B
                for(lu8_Cnt=0;lu8_Cnt<4;lu8_Cnt++)
                {
                    if ( (gf_dQrsec[lu8_Cnt]<0.1f)&&(gf_dQrsec[lu8_Cnt]>-0.1f) )
                    {
                            lu8_CntStab++;
                    }
                    else
                    {
                            lu8_CntStab = 0;
                    }
                    if(lu8_CntStab>3)
                    {
                            gu8_FlagQrStabliz = 1;
                    }
                    else
                    {
                            gu8_FlagQrStabliz = 0;                            
                    }
                    
                }

                //20190525C-1 
                //流量为0判断  当前一秒的流量为0 且前一秒也为0 
                if( (gf_QrT[C_QrT-1]>-0.01f) && (gf_QrT[C_QrT-1]<0.01f) && (gf_QrT[C_QrT-2]>-0.01f ) &&( gf_QrT[C_QrT-2]<0.01f )   )
                {
                        gu16_FlagQrZero = 1;
                }
                else
                {
                        gu16_FlagQrZero = 0;
                }
                //\\\\流量为0判断                
                
                for(l_i=C_QrT ;l_i>1; l_i--)    
                    gf_QrT[C_QrT - l_i]   =gf_QrT[C_QrT- l_i + 1];  // 0=1  -> 11=12
//                     gf_QrT[C_QrT-i]   =gf_QrT[C_QrT-i+1];// 1=2
//                     gf_QrT[dRange-4]  =gf_QrT[dRange-3];// 2=3    
//                     gf_QrT[dRange-3]  =gf_QrT[dRange-2];// 3=4    
//                     gf_QrT[dRange-2]  =gf_QrT[dRange-1];// 4=5        
//                     gf_QrT[dRange-1]  =gf_QrT[dRange];  // 5=6    
                
                for(l_i=C_QrT ;l_i>1; l_i--)    
                    gf_PwmT[C_QrT-l_i]   =gf_PwmT[C_QrT-l_i+1];    // 0=1    -> 11=12
//                 gf_PwmT[dRange-5]  =gf_PwmT[dRange-4];// 1=2
//                 gf_PwmT[dRange-4]  =gf_PwmT[dRange-3];// 2=3    
//                 gf_PwmT[dRange-3]  =gf_PwmT[dRange-2];// 3=4    
//                 gf_PwmT[dRange-2]  =gf_PwmT[dRange-1];// 4=5        
//                 gf_PwmT[dRange-1]  =gf_PwmT[dRange];  // 5=6    
                    
                for(l_i=C_QrT ;l_i>1; l_i--)    
                    gf_dQrsecErr[C_QrT-l_i]   =gf_dQrsecErr[C_QrT-l_i+1];    // 0=1    -> 11=12                
                
                //流量稳定性判断AB-1 OVER            
                

                
                //20190525B-1 
                //START 滤膜阻力判断 D-START
                if(gu16_Cnt == 1)
                {
                        gu16_Cnt=0;
                        
                        if( (Instru_Data.LiuYaT>5.0f) & ( Instru_Data.PrT >-0.01f ) & (Instru_Data.QT >BIAO.SetQT)  )  //是空载
                        {
                                gu8A_FlagEmptyDrag = 1;
                            
                        }
                        else
                        {
                                gu8A_FlagEmptyDrag = 0;
                        }
                        


                        
                        if(gu8_StatusQrLast == 1)  //上次检测到太小了
                        {
//                                 gu8_QrWavePeriod = gi16_FlagQrWaveTsec;
                                if(pid.Err< (-BIAO.SetQT*0.02f) ) //此时流量太大
                                {
                                        gu8_StatusQrWave = 1; //置位流量波动标志位 表示发生了波动            
                                        gu8_QrWavePeriod = gu8_CntQrWave;
                                        gu8_CntQrWave =0; //清零技术位 以备下一次计数
                                        gu8_StatusQrLast = 0;
                                        //break;
                                }    
                                gu8_CntQrWave++;    
                                if(gu8_CntQrWave>(C_QrT-2)) //未发现有大波动 gu8_CntQrWave 最大为C_QrT-1
                                    gu8_CntQrWave = 0;
                        }    
                        else if(gu8_StatusQrLast == 2)
                        {
                                if( pid.Err>(BIAO.SetQT*0.02f) ) //此时流量太小
                                {
                                        gu8_StatusQrWave = 1;
                                        gu8_QrWavePeriod = gu8_CntQrWave;
                                        gu8_CntQrWave =0; //清零技术位 以备下一次计数                                    
                                      gu8_StatusQrLast = 0;
                                        //break;
                                }
                                gu8_CntQrWave++;    
                                if(gu8_CntQrWave>(C_QrT-2)) //未发现有大波动 gu8_CntQrWave 最大为C_QrT-1
                                    gu8_CntQrWave = 0;
                        }
                        else
                        {
                                if( pid.Err>(BIAO.SetQT*0.02f) ) //此时流量太小
                                {
                                        gu8_StatusQrLast = 1; 
                                        gu8_CntQrWave++;
                                }
                                else if(pid.Err< (-BIAO.SetQT*0.02f) ) //此时流量太大
                                {
                                        gu8_StatusQrLast = 2; 
                                        gu8_CntQrWave++;                                    
                                }
                                else
                                {
                                        gu8_CntQrWave = 0;
                                }
                        }
                        if(gu8_CntQrWave>(C_QrT-2)) //未发现有大波动 gu8_CntQrWave 最大为C_QrT-1
                            gu8_CntQrWave = 0;
                        
                
                //OVER  当前流量是否震荡判断 E-OVER
                
                
                //START        E-START

                //OVER  当前流量是否震荡判断 E-OVER                
                
                
                //计数变量 时间片轮询
                gu16_Cnt ++;
                
            OSTimeDly(OS_TICKS_PER_SEC);     
    }             
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z文的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值