62 lines
1.3 KiB
Plaintext
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
|