• 自己写的流量波动检测函数 --37开发


      1 /*******************************************************************************
      2 * Function Name  : powerdownA_task(void)
      3 * Description    : 记录A路断电的数据
      4 * Input          : None
      5 * Output         : None
      6 * Return         : None
      7 *******************************************************************************/
      8 #include "state_task.h"
      9 #include "task_control.h"
     10 #include "24cxx.h"
     11 #include "data.h"
     12 #include "delay.h"
     13 #include "iwdg.h"
     14 
     15 //20190525
     16 #include     "GUI_task.h"
     17 
     18 OS_EVENT *mutex_eeprom;
     19 /*******************************************************************************
     20 * Function Name  : state_task
     21 * Description    : 计算流量的状态  得到流量的变化趋势
     22 * Input          : None
     23 * Output         : None
     24 * Return         : None
     25 * Author         : Aision
     26 * Attention      : 
     27 //  时间轴  T1  T2  T3
     28 *******************************************************************************/
     29 
     30 //gf_QrT[X]  x越大代表当前数据越新  数组存储的为第[X]秒的流量
     31 
     32 float gf_QrT[C_QrT]=0.0f;
     33 
     34 //求当前最新的流量和dRange-x次时间前的流量的差值  
     35 /*
     36               gf_dQrsec[0]  = gf_QrT[dRange]   -  gf_QrT[dRange-1];//6-5    第6s和第5s的流量变化
     37               gf_dQrsec[1]  = gf_QrT[dRange]   -  gf_QrT[dRange-2];//6-4    第6s和第4s的流量变化
     38               gf_dQrsec[2]  = gf_QrT[dRange]   -  gf_QrT[dRange-3];//6-3    
     39               gf_dQrsec[3]  = gf_QrT[dRange]   -  gf_QrT[dRange-4];//6-2        
     40                 gf_dQrsec[4]  = gf_QrT[dRange]   -  gf_QrT[dRange-5];//6-1        
     41 */
     42 extern pid_TypeDef pid;
     43 float gf_dQrsec[C_QrT] = 0.0f;
     44 float gf_PwmT[C_QrT]   = 0.0f;
     45 //20190601 更改低级错误 定义时  x【6】 索引最大到5
     46 float gf_DragRank[dRange+1] = 0.0f;
     47 //20190604 每秒的相对于设定流量的偏差值
     48 float gf_dQrsecErr[C_QrT] = 0.0f;
     49 
     50 
     51 
     52 //状态位:  
     53 //1:  当前流量为0  
     54 u16  gu16_FlagQrZero =0;
     55 //空载  =0: 非空载   =1:空载
     56 u8   gu8A_FlagEmptyDrag = 0;
     57 //反应系统状态的标志位  0:无波动  1:波动幅度超过上下限阈值的波动 2:只在超上限区域波动  3:只在超下限区域波动
     58 u8  gu8_StatesQrWave = 0;  
     59 
     60 
     61 
     62 u8 gu8_FlagQrWaveHigh = 0;
     63 u8 gu8_FlagQrWaveLow  = 0;
     64 //Flag index
     65 int16_t gi16_FlagQrWaveTsec = 0;
     66 
     67 u8 gu8_StatusQrLast = 0;
     68 
     69 u8 gu8_QrWavePeriod =0;
     70 
     71 u8 gu8_StatusQrWave= 0;
     72 
     73 u8 gu8_CntQrWave= 0;
     74 
     75 //20190525  timer
     76 u16  gu16_Cnt = 0;
     77 
     78 u8 gu8_FlagQrStabliz=0;
     79 void state_task(void *pdata)
     80 {
     81     
     82     u8 err;    
     83     u8 lu8_Cnt=0;
     84     u8 lu8_CntStab=0;
     85     u8 l_i=0;
     86 
     87     
     88     for(;;)
     89     {        
     90                 //流量稳定性判断AB-1
     91               //A
     92                 gf_QrT[C_QrT-1]  = Instru_Data.QT;
     93                 gf_PwmT[C_QrT-1] = pid.OutputValue;
     94                 gf_dQrsecErr[C_QrT-1] = pid.Err;    
     95 
     96                 // 第6s和第4s的 流量之差   除以  PWM  之差
     97                 if( (( (u16)gf_PwmT[C_QrT-1] - (u16)gf_PwmT[C_QrT-2] )) > 1  )
     98                 {
     99                         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] ) ;
    100                 }
    101                 else{}
    102 //                     gf_DragRank[0] = (gf_QrT[dRange] - gf_QrT[dRange-2]) / ( (u16)gf_PwmT[dRange] - (u16)gf_PwmT[dRange-2] ) ;
    103 
    104                 //C_Qrt =13
    105                 // 此处一共记录C_QrT秒的瞬时流量值 那么gf_dQrsec 最大记录C_QrT-1个数据  因为是从【0】开始的 所以角标最大到C_Qrt-2
    106                 for(l_i=0;l_i<=C_QrT-2;l_i++)    
    107                         gf_dQrsec[l_i] = gf_QrT[C_QrT-1] - gf_QrT[C_QrT-l_i-2];
    108                 
    109 //               gf_dQrsec[0]  = gf_QrT[C_QrT-1]   -  gf_QrT[C_QrT-2];//12-11  
    110 //               gf_dQrsec[1]  = gf_QrT[dRange]   -  gf_QrT[dRange-2]; //6-4
    111 //               gf_dQrsec[2]  = gf_QrT[dRange]   -  gf_QrT[dRange-3]; //6-3    
    112 //               gf_dQrsec[3]  = gf_QrT[dRange]   -  gf_QrT[dRange-4]; //6-2        
    113 //                 gf_dQrsec[4]  = gf_QrT[dRange]   -  gf_QrT[dRange-5]; //6-1        
    114              //B
    115                 for(lu8_Cnt=0;lu8_Cnt<4;lu8_Cnt++)
    116                 {
    117                     if ( (gf_dQrsec[lu8_Cnt]<0.1f)&&(gf_dQrsec[lu8_Cnt]>-0.1f) )
    118                     {
    119                             lu8_CntStab++;
    120                     }
    121                     else
    122                     {
    123                             lu8_CntStab = 0;
    124                     }
    125                     if(lu8_CntStab>3)
    126                     {
    127                             gu8_FlagQrStabliz = 1;
    128                     }
    129                     else
    130                     {
    131                             gu8_FlagQrStabliz = 0;                            
    132                     }
    133                     
    134                 }
    135 
    136                 //20190525C-1 
    137                 //流量为0判断  当前一秒的流量为0 且前一秒也为0 
    138                 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 )   )
    139                 {
    140                         gu16_FlagQrZero = 1;
    141                 }
    142                 else
    143                 {
    144                         gu16_FlagQrZero = 0;
    145                 }
    146                 //\\流量为0判断                
    147                 
    148                 for(l_i=C_QrT ;l_i>1; l_i--)    
    149                     gf_QrT[C_QrT - l_i]   =gf_QrT[C_QrT- l_i + 1];  // 0=1  -> 11=12
    150 //                     gf_QrT[C_QrT-i]   =gf_QrT[C_QrT-i+1];// 1=2
    151 //                     gf_QrT[dRange-4]  =gf_QrT[dRange-3];// 2=3    
    152 //                     gf_QrT[dRange-3]  =gf_QrT[dRange-2];// 3=4    
    153 //                     gf_QrT[dRange-2]  =gf_QrT[dRange-1];// 4=5        
    154 //                     gf_QrT[dRange-1]  =gf_QrT[dRange];  // 5=6    
    155                 
    156                 for(l_i=C_QrT ;l_i>1; l_i--)    
    157                     gf_PwmT[C_QrT-l_i]   =gf_PwmT[C_QrT-l_i+1];    // 0=1    -> 11=12
    158 //                 gf_PwmT[dRange-5]  =gf_PwmT[dRange-4];// 1=2
    159 //                 gf_PwmT[dRange-4]  =gf_PwmT[dRange-3];// 2=3    
    160 //                 gf_PwmT[dRange-3]  =gf_PwmT[dRange-2];// 3=4    
    161 //                 gf_PwmT[dRange-2]  =gf_PwmT[dRange-1];// 4=5        
    162 //                 gf_PwmT[dRange-1]  =gf_PwmT[dRange];  // 5=6    
    163                     
    164                 for(l_i=C_QrT ;l_i>1; l_i--)    
    165                     gf_dQrsecErr[C_QrT-l_i]   =gf_dQrsecErr[C_QrT-l_i+1];    // 0=1    -> 11=12                
    166                 
    167                 //流量稳定性判断AB-1 OVER            
    168                 
    169 
    170                 
    171                 //20190525B-1 
    172                 //START 滤膜阻力判断 D-START
    173                 if(gu16_Cnt == 1)
    174                 {
    175                         gu16_Cnt=0;
    176                         
    177                         if( (Instru_Data.LiuYaT>5.0f) & ( Instru_Data.PrT >-0.01f ) & (Instru_Data.QT >BIAO.SetQT)  )  //是空载
    178                         {
    179                                 gu8A_FlagEmptyDrag = 1;
    180                             
    181                         }
    182                         else
    183                         {
    184                                 gu8A_FlagEmptyDrag = 0;
    185                         }
    186                         
    187 //                         //20190601A-1 在采样中采进行如下判断 
    188 //                         if((SampleState_Data.StopPumpFlagT == 0) && (SampleState_Data.SampleContexFlagT <= 2)&& (SampleState_Data.PausePumpFlagT == 0))    
    189 //                         //20190525A-1 阀门微调
    190 //                         //设定流量 50L/MIN判断  如果阻力太小则 阀门微调标志位 gu8_FlagCtrlValve = 1 在GUI函数中运行阀门微调缩小当前通路有效面积
    191 //                             if( ( BIAO.SetQT >49.7f)& (BIAO.SetQT <70.5f)& (Instru_Data.QT>25.0f)  &(pid.OutputValue<80.0f) )
    192 //                             {
    193 //                                     gu8_FlagCtrlValve =1;
    194 //                                                         
    195 //                                     if( (Instru_Data.QT>25.0f) &(pid.OutputValue<70.0f) &(gu8_PosFlagValve_50Lmin<2) )        
    196 //                                     {
    197 //                                             gu8_CtrlValveTimer = 200;
    198 //                                             gu8_PosFlagValve_50Lmin +=20;
    199 //                                     }                                    
    200 //                             }                
    201                         
    202                 }            
    203                 //OVER 滤膜阻力判断D-OVER
    204                 
    205                 //START 当前流量是否震荡判断 E-START
    206                 
    207 
    208                         
    209                         if(gu8_StatusQrLast == 1)  //上次检测到太小了
    210                         {
    211 //                                 gu8_QrWavePeriod = gi16_FlagQrWaveTsec;
    212                                 if(pid.Err< (-BIAO.SetQT*0.02f) ) //此时流量太大
    213                                 {
    214                                         gu8_StatusQrWave = 1; //置位流量波动标志位 表示发生了波动            
    215                                         gu8_QrWavePeriod = gu8_CntQrWave;
    216                                         gu8_CntQrWave =0; //清零技术位 以备下一次计数
    217                                         gu8_StatusQrLast = 0;
    218                                         //break;
    219                                 }    
    220                                 gu8_CntQrWave++;    
    221                                 if(gu8_CntQrWave>(C_QrT-2)) //未发现有大波动 gu8_CntQrWave 最大为C_QrT-1
    222                                     gu8_CntQrWave = 0;
    223                         }    
    224                         else if(gu8_StatusQrLast == 2)
    225                         {
    226                                 if( pid.Err>(BIAO.SetQT*0.02f) ) //此时流量太小
    227                                 {
    228                                         gu8_StatusQrWave = 1;
    229                                         gu8_QrWavePeriod = gu8_CntQrWave;
    230                                         gu8_CntQrWave =0; //清零技术位 以备下一次计数                                    
    231                                       gu8_StatusQrLast = 0;
    232                                         //break;
    233                                 }
    234                                 gu8_CntQrWave++;    
    235                                 if(gu8_CntQrWave>(C_QrT-2)) //未发现有大波动 gu8_CntQrWave 最大为C_QrT-1
    236                                     gu8_CntQrWave = 0;
    237                         }
    238                         else
    239                         {
    240                                 if( pid.Err>(BIAO.SetQT*0.02f) ) //此时流量太小
    241                                 {
    242                                         gu8_StatusQrLast = 1; 
    243                                         gu8_CntQrWave++;
    244                                 }
    245                                 else if(pid.Err< (-BIAO.SetQT*0.02f) ) //此时流量太大
    246                                 {
    247                                         gu8_StatusQrLast = 2; 
    248                                         gu8_CntQrWave++;                                    
    249                                 }
    250                                 else
    251                                 {
    252                                         gu8_CntQrWave = 0;
    253                                 }
    254                         }
    255                         if(gu8_CntQrWave>(C_QrT-2)) //未发现有大波动 gu8_CntQrWave 最大为C_QrT-1
    256                             gu8_CntQrWave = 0;
    257                         
    258                 
    259                 //OVER  当前流量是否震荡判断 E-OVER
    260                 
    261                 
    262                 //START        E-START
    263 
    264                 //OVER  当前流量是否震荡判断 E-OVER                
    265                 
    266                 
    267                 //计数变量 时间片轮询
    268                 gu16_Cnt ++;
    269                 
    270             OSTimeDly(OS_TICKS_PER_SEC);     
    271     }             
    272 }
  • 相关阅读:
    splay
    开车旅行(2012day1T3)
    LCT入门
    最小瓶颈路
    poj 3041 Asteroids
    sql waitfor 延时执行
    [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝
    SQL Server中行列转换
    sql中 with rollup 、with cube、grouping 统计函数用法
    sql 分组后 组内排名
  • 原文地址:https://www.cnblogs.com/qdrs/p/10975907.html
Copyright © 2020-2023  润新知