FUNCTION "SKAL" : Void
TITLE = 'scaling Input'
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : VoR
FAMILY : Peripher
NAME : W_skal_R
VERSION : 1.8
// Input will be converted directly from IN to OUT allowed are Word, Int, Dint, Real, Lreal
// If Input is WORD. Function implies that it is a P: analog value
// the Linearity calculate 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_LREAL : LReal;
EING_WORD : Word;
EING_INT : Int;
EING_DINT : DInt;
LIMIT_R : LReal; // limited input (for calculation)
LIM_X_UG : LReal; // temporary VAR for limiter
LIM_X_OG : LReal; // Dito
Status : Word;
Ausg_LREAL : LReal;
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 := (#EING_WORD = w#16#7FFF) OR (#EING_WORD = w#16#8000);
IF #FE THEN
#EING_REAL_PEW := 0.0;
END_IF;
Int: // Wenn Int dann in REAL wandeln
VariantGet(SRC := #EING,
DST => #EING_INT);
#EING_LREAL := INT_TO_LREAL(#EING_INT);
#FE := 0;
DInt: // Wenn DINT dann in LREAL wandeln
VariantGet(SRC := #EING,
DST => #EING_DINT);
#EING_LREAL := DINT_TO_LREAL(#EING_DINT);
#FE := 0;
Real: // Wenn Real dann So Uebernehmen
VariantGet(SRC := #EING,
DST => #EING_REAL);
#EING_LREAL := #EING_REAL;
#FE := 0;
LReal: // Wenn LReal dann So Uebernehmen
VariantGet(SRC := #EING,
DST => #EING_LREAL);
#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_LREAL, MX := #LIM_X_OG);
(*calculating limited data*)
IF NOT #OBJ_AH THEN
IF NOT (TypeOf(#EING) = Word) THEN
#Ausg_LREAL := ((#OGR_OUT - #UGR_OUT) / (#OGR_IN - #UGR_IN)
* #LIMIT_R
+ (#OGR_OUT - (#OGR_OUT - #UGR_OUT)
/ (#OGR_IN - #UGR_IN) * #OGR_IN));
ELSE
#Ausg_LREAL := #EING_REAL_PEW;
END_IF;
CASE TypeOf(#AUSG) OF
Real:
VariantPut(SRC := LREAL_TO_REAL(#Ausg_LREAL),
DST := #AUSG);
Int:
VariantPut(SRC := LREAL_TO_INT(#INT_FACTOR * #Ausg_LREAL),
DST := #AUSG);
LReal:
VariantPut(SRC := #Ausg_LREAL,
DST := #AUSG);
DInt:
VariantPut(SRC := LREAL_TO_DINT(#INT_FACTOR * #Ausg_LREAL),
DST := #AUSG);
END_CASE;
END_IF;
END_FUNCTION