环境监控系统的自动数据平滑处理-mysql触发器、任务计划的应用

betball贝博app 上位机 522 次浏览 没有评论

之前做的环境监控,由于硬件条件,有很多垃圾数据,数据画成折线图后忽大忽小,有用的趋势无法正确体现。决定用php把相距较大的数据取一下平均值进行处理,三个数据为一组。效果当然还不完美,但是凑合着还是有效果的,够用了。

首先接收来的数据所添加的数据库里面要加一个触发器,添加的同时在另外的一个表里面复制一份。

[cce]insert into smoothdata(温度) values(new.温度);[/cce]
然后php去处理smoothdata里的数据

php文件的思路就是找“尖”,然后把尖用平均值来替代。

[cce]
[cce_php]
<?php
error_reporting(E_ALL ^ E_DEPRECATED^ E_NOTICE);
include ("connect.php");

data1=0;data2=0;data3=0;num=2;
id;time1 = date("Y-m-d H:i:s",strtotime('now')-15*60);
time2 = date("Y-m-d H:i:s",strtotime('now'));i=4;//误差太大的时候一次平滑不够
while(i--){sql = "select * from smoothdata where time<'time2' and time>'time1' order by id desc";
echo sql;echo "
";
re= mysql_query(sql); while(row=@mysql_fetch_array(re)){ if(isset(data1)&&isset(data2)&&isset(data3)) { if(num==2)//确保最后一个读的是完整的“尖” {data1=row['温度'];num--; } else if(num==1) {data2=row['温度'];num--; } else if(num==0) {data3=row['温度'];num--; } else { //echo row['time'];data1 = data2;data2 = data3;data3 = row['温度']; if((data2-data1)*(data2-data3)>0)//去尖 if(abs(data1-data2)>1 and abs(data2-data3)>1) { //全部取中间平均值处理data2 = number_format((data1+data3)/2,1); id =row['Id']+1; sql ="update smoothdata set 温度='data2' where Id = 'id';"; mysql_query(sql); //echo sql; } } } } }logfile = fopen("smoothlog.txt", "a"); time = 0;txt = date("y-m-d h:i:s",time());; echo txt; fwrite(logfile, txt); fwrite(logfile, "phprun\r\n"); ?> [/cce_php] [/cce]
[cce_php]
<?php
error_reporting(E_ALL ^ E_DEPRECATED^ E_NOTICE);
include ("connect.php");

data1=0;data2=0;data3=0;num=2;
id;time1 = date("Y-m-d H:i:s",strtotime('now')-15*60);
time2 = date("Y-m-d H:i:s",strtotime('now'));i=4;//误差太大的时候一次平滑不够
while(i--){sql = "select * from smoothdata where time<'time2' and time>'time1' order by id desc";
echo sql;echo "
";
re= mysql_query(sql); while(row=@mysql_fetch_array(re)){ if(isset(data1)&&isset(data2)&&isset(data3)) { if(num==2) {data2=row['温度'];num--; } else if(num==1) {data3=row['温度'];num--; } else { //echo row['time'];data1 = data2;data2 = data3;data3 = row['温度']; if((data2-data1)*(data2-data3)>0)//去尖 if(abs(data1-data2)>1 and abs(data2-data3)>1) { //全部取中间平均值处理data2 = number_format((data1+data3)/2,1); id =row['Id']+1; sql ="update smoothdata set 温度='data2' where Id = 'id';"; mysql_query(sql); //echo sql; } } } } }logfile = fopen("smoothlog.txt", "a"); time = 0;txt = date("y-m-d h:i:s",time());; echo txt; fwrite(logfile, txt); fwrite(logfile, "phprun\r\n"); ?> [/cce_php]

执行效果:

然后就是要让这个文件自动去执行。写一个bat文件,里面把日志也要记好。

[cce]
C:\\php.exe C:\datasmooth.php
@echo off
set "year=%date:~0,4%"
set "month=%date:~5,2%"
set "day=%date:~8,2%"
set "hour_ten=%time:~0,1%"
set "hour_one=%time:~1,1%"
set "minute=%time:~3,2%"
set "second=%time:~6,2%"

if "%hour_ten%" == " " (
    echo %year%-%month%-%day% %hour_one%:%minute%:%second%>> smoothlog.txt
) else (
    echo %year%-%month%-%day% %hour_ten%%hour_one%:%minute%:%second%>> smoothlog.txt
)

exit
[/cce]

然后在任务计划里面添加任务,需要注意的一点是,添加操作的时候,写了程序的位置以后,“起始于”也要填写,要不日志就写到system32文件夹里去了。

OK,收工

发表评论

邮箱地址不会被公开。

Go