FUNCTION "SKAL" : Void
TITLE = 'scaling Peripherical Input words'
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : VoR
FAMILY : Peripher
NAME : W_skal_R
VERSION : 1.6
// Input will be converted directly from PEW to AUSG_REAL and AUSG_INT
// the Linearity is calculatet from UGR_IN to UGR_Out and OGR_IN to OGR_OUT
VAR_INPUT
EING : Variant; // Input. IF Word then PEW scal unipolar
OGR_IN : Real; // Upper limit input in format REAL
UGR_IN : Real; // Lower limit input in format REAL
UGR_OUT : Real; // Lower Output = Lower Input
OGR_OUT : Real; // Upper Output = Upper Input
INT_FACTOR : Real; // Faktor for the Integer Input (Normaly 10.0) means 13.7 REAL out is 137 for INT
OBJ_AH : Bool; // Manualoverride aktiv inaktiv
END_VAR
VAR_OUTPUT
FE : Bool; // Fehler bei PEW Wandlung
END_VAR
VAR_IN_OUT
AUSG : Variant; // Output scaled (Format REAL)
END_VAR
VAR_TEMP
OGR_IN_MAX : Bool; // Input >= Upper limit input
UGR_IN_MAX : Bool; // Input <= Upper limit input
EING_REAL : Real; // Input im format REAL
EING_WORD : Word;
EING_INT : Int;
LIMIT_R : Real; // limited input (for calculation)
LIM_X_UG : Real; // temporary VAR for limiter
LIM_X_OG : Real; // Dito
Status : Word;
Ausg_REAL : Real;
EING_REAL_PEW : Real;
END_VAR
BEGIN
CASE TypeOf(#EING) OF
Word: // Wenn Wort, dann behandeln wie einen Analogeingang
VariantGet(SRC := #EING,
DST => #EING_WORD);
#Status := SCALE(IN := WORD_TO_INT(#EING_WORD), HI_LIM := #OGR_OUT, LO_LIM := #UGR_OUT, BIPOLAR := 0, OUT => #EING_REAL_PEW);
#FE := #Status <> 0;
Int: // Wenn Int dann in REAL wandeln
VariantGet(SRC := #EING,
DST => #EING_INT);
#EING_REAL := INT_TO_REAL(#EING_INT);
#FE := 0;
Real: // Wenn Real dann So übernehmen
VariantGet(SRC := #EING,
DST => #EING_REAL);
#FE := 0;
ELSE
#FE := 1;
#Status := 12; // Nicht unterstütztes Format
END_CASE;
(*sorting limits for calculation*)
IF #UGR_IN < #OGR_IN THEN
#LIM_X_UG := #UGR_IN;
#LIM_X_OG := #OGR_IN;
ELSIF #OGR_IN <= #UGR_IN THEN
#LIM_X_UG := #OGR_IN;
#LIM_X_OG := #UGR_IN;
END_IF;
(*input should be limited*)
#LIMIT_R := LIMIT(MN := #LIM_X_UG, IN := #EING_REAL, MX := #LIM_X_OG);
(*calculating limited data*)
IF NOT #OBJ_AH THEN
IF NOT (TypeOf(#EING) = Word) THEN
#Ausg_REAL := ((#OGR_OUT - #UGR_OUT) / (#OGR_IN - #UGR_IN)
* #LIMIT_R
+ (#OGR_OUT - (#OGR_OUT - #UGR_OUT)
/ (#OGR_IN - #UGR_IN) * #OGR_IN));
ELSE
#Ausg_REAL := #EING_REAL_PEW;
END_IF;
CASE TypeOf(#AUSG) OF
Real:
VariantPut(SRC := #Ausg_REAL,
DST := #AUSG);
Int:
VariantPut(SRC := REAL_TO_INT(#INT_FACTOR * #Ausg_REAL),
DST := #AUSG);
END_CASE;
END_IF;
END_FUNCTION