以前做过练习,在unity中计算分钟均值和小时均值,做成自定义功能块。今天在家打算按照同样的思路,试着做一下日均值。
第一次打算建立一个三维数组PV_DAY[0..23,0..59,0..59],每秒存放一个数据,编译的时候提示数组太大。
第二次尝试建立24个数组,每个数组存放一个小时内3600个检测值,最终编译的时候提示PLC保存数据内存满,我的这个练习还没有做其他的检测控制功能,说明这样的频率存放数据,计算均值能把CPU弄死机。
最终转变思路,不要1秒采集一个数据,把数据存储频率弄低一点,经过多次尝试,6秒采集一次比较合适。
新建一个导出的功能块类型PV_AVG_DAY,配置内部变量和程序段如下:
AVG_DAY程序段ST编程方式,脚本如下:
Minute1:=BCD_TO_INT(%SW51);
HOUR:=DIV(Minute1,100);
Minute:=mod_int(Minute1,100);
Second1:=BCD_TO_INT(%SW50);
Second:=div(second1,100);
Cur_Minute:=Minute;
Cur_Second:=Second;
SUM:=0.0;
i:=mod(second,6);
if i=0 then
PV_HOUR[HOUR,Minute,Second]:=PV;
end_if;
for i:=0 to 59 do
for j:=1 to 30 do
sum:=sum+PV_HOUR[hour,I,J];
END_FOR;
END_FOR;
AVG_DAY:=SUM/14400.0;
Alarm为FBD编程方式
这样就完成了日均值计算的自定义功能块,6秒左右采集一次数据。