恭喜,你发布的帖子
发布于 2021-08-10 22:02:17
2楼
模拟量数据需要一个实时连续移动的小时平均数,采用时间5S或者10S都行!!
理解: 采样数据 ,每间隔5S或10S 采集一次,采集总数据时间为1个小时
1 hour = 3600S 假设采样为10S 一次 ,采样数据总数为360 个。
然后对这个360个做平均数 计算并输出吗?
FUNCTION_BLOCK FB44
TITLE = '数据采集并计算平均值'
//
// Block Comment...
//
VERSION: '1.0'
AUTHOR: baikai
NAME: average
FAMILY: data
know_how_protect
CONST
load_cout:= 10; //本例采集10个
END_CONST
VAR_INPUT
WriteReq:BOOL; // 写请求 每10秒发一次 写入请求
New_value:INT:=0; // 需要写入的数据
END_VAR
VAR_IN_OUT
Last_WriteReq:BOOL;
END_VAR
VAR_OUTPUT
average_out:REAL; // 平均值输出
max_data:REAL; // 分拣出最大值
min_data:REAL; // 分拣出最小值
sum_data:REAL; // 总和值
END_VAR
VAR
WriteReq_P:BOOL; // 写请求上升沿
Index :INT; // 压入数据的个数记录
stop_write:BOOL; // 停止写入
store:ARRAY[1..load_cout] OF REAL; //存储数据组
num:INT;
I:INT;
END_VAR
WriteReq_P:= WriteReq AND NOT Last_WriteReq;
Last_WriteReq:= WriteReq;
IF Index >= load_cout THEN
stop_write:= true;
ELSE
stop_write:= false;
END_IF;
IF NOT stop_write THEN
IF WriteReq_P THEN
store[Index]:= New_value;
Index := Index + 1;
END_IF;
END_IF;
//以上为数据周期采集并存储。
min_data:= store[1]; ////每次运行默认第一个为最小值,开始进行比较
FOR I:= 1 TO load_cout BY 1 DO
IF store[I] <= min_data THEN min_data:= store[I]; END_IF; //求最小值
IF store[I] >= max_data THEN max_data:= store[I]; END_IF; //求最大值
IF I=1 THEN sum_data:= store[I];
ELSE
sum_data:= sum_data + store[I];
END_IF;
IF I = load_cout THEN
average_out:= sum_data / INT_TO_REAL(load_cout);
END_IF;
END_FOR;
END_FUNCTION_BLOCK
请填写推广理由:
分享
只看
楼主