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 }