自己写的流量波动检测函数 --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 }
原文地址:https://www.cnblogs.com/qdrs/p/10975907.html