Obsidean_VM/04-SIDEL/06 - E5.007363 - Modifica O.../Source/source/MSE Slope.md

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