ParamManagerScripts/backend/script_groups/TwinCat/.example/MSE_SLOPE.EXP

62 lines
1.3 KiB
Plaintext

(* @PATH := '\/Functions_Collection' *)
(* @SYMFILEFLAGS := '0' *)
FUNCTION_BLOCK MSE_Slope
VAR_INPUT
i_Value : REAL ; (* Istant Value to compute *)
i_Num : UINT ; (* 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
(* @END_DECLARATION := '0' *)
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 + EXPT (i_Cycle * mPtr , 2) ;
mSumXY := mSumXY + (i_Cycle * mPtr * i_Value) ;
mSumX := mSumX + mPtr * i_Cycle ;
IF mPtr = i_Num THEN
mX2Sum := EXPT(mSumX, 2) ;
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
o_MSESlope := 0.0 ;
END_IF
ELSE
mPtr := 0 ;
mSumY := 0 ;
mSumX2 := 0 ;
mX2Sum := 0 ;
mSumXY := 0 ;
mSumX := 0 ;
o_MSESlope := 0.0 ;
END_IF
END_FUNCTION_BLOCK