FUNCTION "FC105" : Word { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT IN : Int; // input value to be scaled HI_LIM : Real; // upper limit in engineering units LO_LIM : Real; // lower limit in engineering units BIPOLAR : Bool; // 1=bipolar; 0=unipolar END_VAR VAR_OUTPUT OUT : Real; // result of the scale conversion END_VAR VAR_TEMP IN_REAL : Real; // input value as a REAL number K1 : Real; // low limit for input value K2 : Real; // high limit for input value SPAN : Real; // HI_LIM - LO_LIM TEMP1 : Real; // temporary result END_VAR BEGIN // 临时变量和输出变量清零 #K1:=0; #FC105 := 0; #IN_REAL := DINT_TO_REAL(0); #K1 := DINT_TO_REAL(0); #K2:= DINT_TO_REAL(0); #SPAN:= DINT_TO_REAL(0); #TEMP1:= DINT_TO_REAL(0); //set #K1 and #K2 constants based upon #BIPOLAR IF #BIPOLAR = 0 THEN // If the input value is outside the K1 and K2 range, // the output #K1 := 0.0; // is clamped to the nearer of either the LO_LIM or the // HI_LIM #K2 := 27648.0; // and an error is logged. If the input value is exactly at a // limit the ELSE // output will be set to the computed limit with no //error returned. #K1 := -27648.0 ; // changed 2014.10.28 by SLY_在合肥读书 #K2 := 27648.0; END_IF; #IN_REAL := DINT_TO_REAL(#IN); #SPAN := #HI_LIM - #LO_LIM; IF #IN_REAL < #K1 THEN #FC105 := 8; #OUT := #LO_LIM; ELSIF #IN_REAL > #K2 THEN #FC105 := 8; #OUT := #HI_LIM; ELSE #TEMP1 := #K2 - #K1; #OUT := (((#IN_REAL - #K1) / #TEMP1) * #SPAN) + #LO_LIM; #FC105 := 0; END_IF; END_FUNCTION