FUNCTION_BLOCK fbAnalogSample_24h
VAR_INPUT
rAnalog_value : REAL;
END_VAR
VAR
rAnalog_values_seconds : ARRAY [1..60] OF REAL;
rAnalog_values_minutes : ARRAY [1..60] OF REAL;
rAnalog_values_hours : ARRAY [1..24] OF REAL;
END_VAR
VAR_TEMP
seconds : INT;
minutes : INT;
hours : INT;
sum : REAL;
i : INT;
END_VAR
VAR_OUTPUT
rAnalog_roll_avg_24h : REAL;
END_VAR
BEGIN
//This function block needs to be called once every second preferably in a timed interrupt (for example call it in ob100 but only once per 10scans)
seconds := seconds + 1;
rAnalog_values_seconds[seconds] := rAnalog_Value;
IF seconds >= 60 THEN
seconds := 0;
minutes := minutes + 1;
sum:=0.0;
FOR i:=1 TO 60 BY 1 DO
sum:=sum + rAnalog_values_seconds[i];
END_FOR;
rAnalog_values_minutes[minutes] := sum/60.0;
IF minutes >= 60 THEN
minutes := 0;
hours := hours + 1;
sum:=0.0;
FOR i:=1 TO 60 BY 1 DO
sum:=sum + rAnalog_values_minutes[i];
END_FOR;
rAnalog_values_hours[hours] := sum/60.0;
sum:=0.0;
FOR i:=1 TO 24 BY 1 DO
sum:=sum + rAnalog_values_hours[i];
END_FOR;
rAnalog_roll_avg_24h:=sum/24.0;
IF hours >= 24 THEN
hours := 0;
END_IF;
END_IF;
END_IF;
END_FUNCTION_BLOCK