ParamManagerScripts/backend/script_groups/TwinCat/.example/STATISTICALANALISYS.EXP

108 lines
2.2 KiB
Plaintext

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