(* @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