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

2.6 KiB

FUNCTION_BLOCK "Statistical_Analisys"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : 'Author'
FAMILY : 'Function'
NAME : 'Name'
VERSION : 1.0
   VAR_INPUT 
      i_Value : Real;
      i_Cols : Int;
      i_Rows : Int;
   END_VAR

   VAR_OUTPUT 
      MeanValue : Real;
      Variance : Real;
      Std_Deviation : Real;
   END_VAR

   VAR 
      mData : Array[1..4, 1..40] of Real;
      mMeanValue : Array[1..40] of Real;
      mVariance : Array[1..40] of Real;
      mDimArray : Int := 40;
      mDataX : Int := 1;
      mDataY : Int := 1;
      mCycle : Int;
      i : Int;
      mTemp : Real;
      mTemp1 : Real;
      mTemp2 : Real;
      mCalcMean : Bool;
      mHold : Bool;
      mHold3 : Bool;
      mHold7 : Bool;
   END_VAR


BEGIN
	
	
	IF #i_Cols>#mDimArray THEN
	    #i_Cols := #mDimArray ;
	END_IF;
	
	IF #i_Rows > 4 THEN
	    #i_Rows := 4 ;
	ELSIF #i_Rows <1 THEN
	    #i_Rows := 1 ;
	END_IF;
	
	IF #mDataX <= #i_Rows AND #mDataY <= #i_Cols THEN
	    #mData[#mDataX, #mDataY] := #i_Value ;
	    #mDataX := #mDataX + 1 ;
	END_IF;
	
	IF #mDataX > #i_Rows THEN
	    #mDataX := 1 ;
	    #mHold := TRUE ;
	    #mCalcMean := TRUE ;
	END_IF;
	
	IF #mDataY > #i_Cols THEN
	    #mDataY := 1 ;
	    #mHold := TRUE ;
	END_IF;
	
	IF #mCalcMean THEN
	    #mCalcMean := FALSE ;
	    #mMeanValue[#mDataY] := 0 ;
	    
	    FOR #i:=1 TO #i_Rows DO
	        #mMeanValue[#mDataY] := #mMeanValue[#mDataY] + #mData[#i, #mDataY] ;
	    END_FOR;
	
	    #mMeanValue[#mDataY] := #mMeanValue[#mDataY] / #i_Rows ;
	    #MeanValue := 0 ;
	    
	    FOR #i:=1 TO #i_Cols DO
	        #MeanValue :=  #MeanValue + #mMeanValue[#i] ;
	    END_FOR;
	
	    #MeanValue := #MeanValue / #i_Cols ;
	    #mVariance[#mDataY] := 0 ;
	    
	    FOR #i:=1 TO #i_Rows DO
	        #mTemp := #mData[#i, #mDataY] - #MeanValue ;
	        #mTemp1 :=(#mTemp * #mTemp) ;
	        #mVariance[#mDataY] := #mVariance[#mDataY] + (#mTemp * #mTemp) ;
	    END_FOR;
	
	    #mVariance[#mDataY] := #mVariance[#mDataY] / #i_Rows ;
	    #Variance := 0 ;
	    
	    FOR #i:=1 TO #i_Cols DO
	        #Variance := #Variance + #mVariance[#i] ;
	    END_FOR;
	
	    #Variance := #Variance / #i_Cols ;
	    
	    IF #Variance > 0 THEN
	        #Std_Deviation := SQRT(#Variance) ;
	    END_IF;
	
	    #mDataY := #mDataY + 1 ;
	    
	END_IF;
	
	IF #mHold THEN
	    #mCycle := #mCycle + 1 ;
	ELSE
	    #mCycle := 0 ;
	END_IF;
	
	IF #mHold AND NOT #mHold3 AND #mCycle >= 2 THEN
	    #mHold3 := TRUE ;
	    #mHold := FALSE ;
	END_IF;
	
	IF #mHold AND #mHold3 AND #mCycle >= 6 THEN
	    #mHold7 := TRUE ;
	    #mHold := FALSE ;
	END_IF;
	
	IF #mHold3 AND #mHold7 THEN
	    #mHold3 := FALSE ;
	    #mHold7 := FALSE ;
	END_IF;
	
	
END_FUNCTION_BLOCK