1.9 KiB
1.9 KiB
FUNCTION_BLOCK "MSE Slope"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : 'Author'
FAMILY : 'Function'
NAME : 'Name'
VERSION : 1.0
VAR_INPUT
i_Value : Real; // Istant Value TO compute
i_Num : Int; // Number OF sample used TO compute slope
i_Cycle : Real; // Cycle TIME
i_Enable : Bool; // Enable the block
END_VAR
VAR_OUTPUT
o_MSESlope : Real;
END_VAR
VAR
mSumX2 : Real; // Sum OF square
mX2Sum : Real; // Square OF sum
mSumX : Real;
mSumY : Real;
mSumXY : Real;
mPtr : Int;
END_VAR
BEGIN
IF #i_Enable THEN
IF #i_Num > 0 THEN
IF #i_Num > 30 THEN
#i_Num := 30 ; // LIMIT the number OF samples
END_IF;
IF #mPtr <= #i_Num THEN
#mPtr := #mPtr + 1 ;
#mSumY := #mSumY + #i_Value ;
#mSumX2 := #mSumX2 + (#i_Cycle * #mPtr)*(#i_Cycle * #mPtr);
#mSumXY := #mSumXY + (#i_Cycle * #mPtr * #i_Value) ;
#mSumX := #mSumX + #mPtr * #i_Cycle ;
IF #mPtr = #i_Num THEN
#mX2Sum := (#mSumX * #mSumX) ;
IF (#mPtr * #mSumX2 - #mX2Sum) <> 0 THEN
#o_MSESlope := (#mPtr * #mSumXY - #mSumX * #mSumY) / (#mPtr * #mSumX2 - #mX2Sum) ;
END_IF;
#mPtr := 0 ;
#mSumX2 := 0 ;
#mX2Sum := 0 ;
#mSumXY := 0 ;
#mSumX := 0 ;
#mSumY := 0 ;
END_IF;
END_IF;
ELSE
(* classic code: #o_MSESlope := 0.0 ;*)
#o_MSESlope := REAL#0.0 ;
END_IF;
ELSE
#mPtr := 0 ;
#mSumY := 0 ;
#mSumX2 := 0 ;
#mX2Sum := 0 ;
#mSumXY := 0 ;
#mSumX := 0 ;
(* classic code: #o_MSESlope := 0.0 ;*)
#o_MSESlope := REAL#0.0 ;
END_IF;
END_FUNCTION_BLOCK