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

自己写的流量波动检测函数 --37开发相关推荐

  1. php 检测编码函数,自己写了一个php检测文件编码的函数

    关于文件编码的检测,百度一下一大把都是,但是确实没有能用的. 很多人建议 mb_detect_encoding 检测,可是不知为何我这不成功,什么都没输出. 看到有人写了个增强版,用 BOM 判断的, ...

  2. 【网络流量识别】【聚类】【二】FCM和GMM—使用聚类技术和性能比较进行网络流量异常检测

    本文介绍采用高斯混合模型(GMM)和模糊C均值聚类(FCM)来进行网络流量异常检测的方法. 原文来自IEEE,发表日期2013年. 原文链接:使用聚类技术和性能比较进行网络流量异常检测|IEEE 会议 ...

  3. 【网络流量识别】【深度学习】【三】CNN和LSTM—基于信息获取和深度学习的网络流量异常检测

    本文是北京大学陆祥林等人,2019年四月发表于ICISDM的一篇文章,收录于ACM网站. 文章题目:基于信息获取和深度学习的网络流量异常检测 原文网址:基于信息获取和深度学习的网络流量异常检测|201 ...

  4. 我们不一样!告诉你百度是如何做智能流量异常检测的

    作者简介 牧之    百度云高级研发工程师 负责百度云Noah智能异常检测算法相关工作,在自动异常检测.智能故障诊断等方向有广泛的实践经验. 干货概览 流量,是系统的黄金指标之一,它直观反映系统的运行 ...

  5. 智能运维 | 我们不一样!告诉你百度云如何做智能流量异常检测

    流量,是系统的黄金指标之一,它直观反映系统的运行状态.健康的系统流量通常平稳波动变化,当流量突然上涨或者下降时可能预示系统中存在故障.例如系统的外部网络链路出现故障时,外部用户的访问流量无法到达我们的 ...

  6. 【网络流量入侵检测数据集】CIC-IDS-2017数据集预处理

    网络流量入侵检测数据集CIC-IDS-2017数据预处理 CIC-IDS-2017 数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs). 它的数据采集截至2017年7月7日(星期五)下午5 ...

  7. 利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解

    为了更好地看懂本文,大家可以先看下我写的另一篇博文,链接如下: https://blog.csdn.net/wenhao_ir/article/details/51774444 OpenCV的霍夫变换 ...

  8. cvHoughLines2霍夫直线检测函数详解及源码解析

    转载请注明出处. 文章链接:https://blog.csdn.net/duiwangxiaomi/article/details/126406184 博文目录 一. 前言 二. cvHoughLin ...

  9. ACMNO.23 C语言-素数判定 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime

    题目描述 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息. 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime 样例输入 97 样例输出 prime 来源/ ...

最新文章

  1. CKEditor+CKFinder配置学习
  2. 阴差阳错2019-12-13
  3. 创建型模式——原型模式
  4. php划分年龄段,儿童时期是怎样划分年龄阶段的
  5. 羊车门问题python程序_用Python实现羊车门问题
  6. 字符编码方式及大端小端
  7. Java程序员从笨鸟到菜鸟之(四十八)细谈struts2(十)ognl概念和原理详解
  8. python开发环境anaconda3_使用Anaconda3配置多版本Python虚拟开发环境
  9. Eclipse-project 重命名问题(如何彻底修改Eclipse工程名),4种解法
  10. linux 下查看硬件信息
  11. 洪恩在线c语言测试,洪恩软件之编程之道C/C++程序设计入门视频教程
  12. xcode 找不到头文件
  13. 软件工程 选课系统的uml类图_软件工程课程设计-基于UML的学生选课系统的软件工程课程设计 精品推荐...
  14. php 高斯分布,多元高斯分布完全解析
  15. 阿里巴巴产品经理面试主观题
  16. max计算机什么函数,计算机max函数使用方法
  17. 瞬时视场、识别距离、mrtd
  18. 火狐老是跳出提示“Firefox正在安装组件,以便播放此页面上......”
  19. NETDMIS5.0位置度评价案例1
  20. 养生年龄的早龄化一一朱乐睿教授

热门文章

  1. ElasticSearch数据分片-数据路由
  2. 【Microsoft】Project Oxford
  3. Kotlin学习——简单运用协程网络下载图片并更新到UI
  4. 软件测试全网最全复习总结-别杠,杠就是你对
  5. 433~458(flex+携程网移动端首页)
  6. gis差值分析_arcgis中七种插值方法的对比分析
  7. 遥感影像常用合成波段
  8. l开头的英文车标是什么车_l开头的车标一串英文(车标里面带个大写L,看外观是辆跑车,是什么牌子啊,不是雷克萨斯?)...
  9. AtCoder Beginner Contest 174 E.Logs
  10. Java中级面试题及答案解析(4)