自己写的流量波动检测函数 --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
自己写的流量波动检测函数 --37开发相关推荐
- php 检测编码函数,自己写了一个php检测文件编码的函数
关于文件编码的检测,百度一下一大把都是,但是确实没有能用的. 很多人建议 mb_detect_encoding 检测,可是不知为何我这不成功,什么都没输出. 看到有人写了个增强版,用 BOM 判断的, ...
- 【网络流量识别】【聚类】【二】FCM和GMM—使用聚类技术和性能比较进行网络流量异常检测
本文介绍采用高斯混合模型(GMM)和模糊C均值聚类(FCM)来进行网络流量异常检测的方法. 原文来自IEEE,发表日期2013年. 原文链接:使用聚类技术和性能比较进行网络流量异常检测|IEEE 会议 ...
- 【网络流量识别】【深度学习】【三】CNN和LSTM—基于信息获取和深度学习的网络流量异常检测
本文是北京大学陆祥林等人,2019年四月发表于ICISDM的一篇文章,收录于ACM网站. 文章题目:基于信息获取和深度学习的网络流量异常检测 原文网址:基于信息获取和深度学习的网络流量异常检测|201 ...
- 我们不一样!告诉你百度是如何做智能流量异常检测的
作者简介 牧之 百度云高级研发工程师 负责百度云Noah智能异常检测算法相关工作,在自动异常检测.智能故障诊断等方向有广泛的实践经验. 干货概览 流量,是系统的黄金指标之一,它直观反映系统的运行 ...
- 智能运维 | 我们不一样!告诉你百度云如何做智能流量异常检测
流量,是系统的黄金指标之一,它直观反映系统的运行状态.健康的系统流量通常平稳波动变化,当流量突然上涨或者下降时可能预示系统中存在故障.例如系统的外部网络链路出现故障时,外部用户的访问流量无法到达我们的 ...
- 【网络流量入侵检测数据集】CIC-IDS-2017数据集预处理
网络流量入侵检测数据集CIC-IDS-2017数据预处理 CIC-IDS-2017 数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs). 它的数据采集截至2017年7月7日(星期五)下午5 ...
- 利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解
为了更好地看懂本文,大家可以先看下我写的另一篇博文,链接如下: https://blog.csdn.net/wenhao_ir/article/details/51774444 OpenCV的霍夫变换 ...
- cvHoughLines2霍夫直线检测函数详解及源码解析
转载请注明出处. 文章链接:https://blog.csdn.net/duiwangxiaomi/article/details/126406184 博文目录 一. 前言 二. cvHoughLin ...
- ACMNO.23 C语言-素数判定 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime
题目描述 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息. 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime 样例输入 97 样例输出 prime 来源/ ...
最新文章
- CKEditor+CKFinder配置学习
- 阴差阳错2019-12-13
- 创建型模式——原型模式
- php划分年龄段,儿童时期是怎样划分年龄阶段的
- 羊车门问题python程序_用Python实现羊车门问题
- 字符编码方式及大端小端
- Java程序员从笨鸟到菜鸟之(四十八)细谈struts2(十)ognl概念和原理详解
- python开发环境anaconda3_使用Anaconda3配置多版本Python虚拟开发环境
- Eclipse-project 重命名问题(如何彻底修改Eclipse工程名),4种解法
- linux 下查看硬件信息
- 洪恩在线c语言测试,洪恩软件之编程之道C/C++程序设计入门视频教程
- xcode 找不到头文件
- 软件工程 选课系统的uml类图_软件工程课程设计-基于UML的学生选课系统的软件工程课程设计 精品推荐...
- php 高斯分布,多元高斯分布完全解析
- 阿里巴巴产品经理面试主观题
- max计算机什么函数,计算机max函数使用方法
- 瞬时视场、识别距离、mrtd
- 火狐老是跳出提示“Firefox正在安装组件,以便播放此页面上......”
- NETDMIS5.0位置度评价案例1
- 养生年龄的早龄化一一朱乐睿教授
热门文章
- ElasticSearch数据分片-数据路由
- 【Microsoft】Project Oxford
- Kotlin学习——简单运用协程网络下载图片并更新到UI
- 软件测试全网最全复习总结-别杠,杠就是你对
- 433~458(flex+携程网移动端首页)
- gis差值分析_arcgis中七种插值方法的对比分析
- 遥感影像常用合成波段
- l开头的英文车标是什么车_l开头的车标一串英文(车标里面带个大写L,看外观是辆跑车,是什么牌子啊,不是雷克萨斯?)...
- AtCoder Beginner Contest 174 E.Logs
- Java中级面试题及答案解析(4)