76 lines
1.9 KiB
Markdown
76 lines
1.9 KiB
Markdown
```pascal
|
|
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
|
|
|
|
|
|
```
|