2.6 KiB
2.6 KiB
FUNCTION_BLOCK "Statistical_Analisys"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : 'Author'
FAMILY : 'Function'
NAME : 'Name'
VERSION : 1.0
VAR_INPUT
i_Value : Real;
i_Cols : Int;
i_Rows : Int;
END_VAR
VAR_OUTPUT
MeanValue : Real;
Variance : Real;
Std_Deviation : Real;
END_VAR
VAR
mData : Array[1..4, 1..40] of Real;
mMeanValue : Array[1..40] of Real;
mVariance : Array[1..40] of Real;
mDimArray : Int := 40;
mDataX : Int := 1;
mDataY : Int := 1;
mCycle : Int;
i : Int;
mTemp : Real;
mTemp1 : Real;
mTemp2 : Real;
mCalcMean : Bool;
mHold : Bool;
mHold3 : Bool;
mHold7 : Bool;
END_VAR
BEGIN
IF #i_Cols>#mDimArray THEN
#i_Cols := #mDimArray ;
END_IF;
IF #i_Rows > 4 THEN
#i_Rows := 4 ;
ELSIF #i_Rows <1 THEN
#i_Rows := 1 ;
END_IF;
IF #mDataX <= #i_Rows AND #mDataY <= #i_Cols THEN
#mData[#mDataX, #mDataY] := #i_Value ;
#mDataX := #mDataX + 1 ;
END_IF;
IF #mDataX > #i_Rows THEN
#mDataX := 1 ;
#mHold := TRUE ;
#mCalcMean := TRUE ;
END_IF;
IF #mDataY > #i_Cols THEN
#mDataY := 1 ;
#mHold := TRUE ;
END_IF;
IF #mCalcMean THEN
#mCalcMean := FALSE ;
#mMeanValue[#mDataY] := 0 ;
FOR #i:=1 TO #i_Rows DO
#mMeanValue[#mDataY] := #mMeanValue[#mDataY] + #mData[#i, #mDataY] ;
END_FOR;
#mMeanValue[#mDataY] := #mMeanValue[#mDataY] / #i_Rows ;
#MeanValue := 0 ;
FOR #i:=1 TO #i_Cols DO
#MeanValue := #MeanValue + #mMeanValue[#i] ;
END_FOR;
#MeanValue := #MeanValue / #i_Cols ;
#mVariance[#mDataY] := 0 ;
FOR #i:=1 TO #i_Rows DO
#mTemp := #mData[#i, #mDataY] - #MeanValue ;
#mTemp1 :=(#mTemp * #mTemp) ;
#mVariance[#mDataY] := #mVariance[#mDataY] + (#mTemp * #mTemp) ;
END_FOR;
#mVariance[#mDataY] := #mVariance[#mDataY] / #i_Rows ;
#Variance := 0 ;
FOR #i:=1 TO #i_Cols DO
#Variance := #Variance + #mVariance[#i] ;
END_FOR;
#Variance := #Variance / #i_Cols ;
IF #Variance > 0 THEN
#Std_Deviation := SQRT(#Variance) ;
END_IF;
#mDataY := #mDataY + 1 ;
END_IF;
IF #mHold THEN
#mCycle := #mCycle + 1 ;
ELSE
#mCycle := 0 ;
END_IF;
IF #mHold AND NOT #mHold3 AND #mCycle >= 2 THEN
#mHold3 := TRUE ;
#mHold := FALSE ;
END_IF;
IF #mHold AND #mHold3 AND #mCycle >= 6 THEN
#mHold7 := TRUE ;
#mHold := FALSE ;
END_IF;
IF #mHold3 AND #mHold7 THEN
#mHold3 := FALSE ;
#mHold7 := FALSE ;
END_IF;
END_FUNCTION_BLOCK