(* @PATH := '\/Functions_Collection' *) (* @SYMFILEFLAGS := '0' *) FUNCTION_BLOCK StatisticalAnalisys VAR_INPUT i_Value : REAL ; i_Cols : UINT ; i_Rows : UINT ; 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 (* @END_DECLARATION := '0' *) (*IF NOT mHold AND mDataX<=4 AND mDataY<=40 THEN*) IF i_Cols>mDimArray THEN i_Cols := mDimArray ; END_IF IF i_Rows>4 THEN i_Rows := 4 ; ELSIF i_Rows<1THEN 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 := EXPT(mTemp, 2) ; mVariance[mDataY] := mVariance[mDataY] + EXPT(mTemp, 2) ; 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