FUNCTION ANA_E_EINL_SKAL : VOID
TITLE = 'scaling Peripherical Input words'
// 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
AUTHOR : VoR
FAMILY : Peripher
NAME : Obj_scal
VERSION : '1.6'
VAR_INPUT
EING : WORD ; // Input (format word) direkt PEW
UGR_IN : INT ; // Lower Limit Input
OGR_IN : INT ; // Upper Limit Input
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_RoI : BOOL ; // Manualoverride for Int (FALSE) or Real (TRUE) Output?
OBJ_AH : BOOL ; // Manualoverride aktiv inaktiv
END_VAR
VAR_OUTPUT
FEH : BOOL ; // Codefailure
BU : BOOL ; // Limit excceeded
END_VAR
VAR_IN_OUT
AUSG_REAL : REAL ; // Output scaled (Format REAL)
AUSG_INT : INT ; // Output scaled (Format INT)
END_VAR
VAR_TEMP
OGR_IN_MAX : BOOL ; // Input >= Upper limit input
UGR_IN_MAX : BOOL ; // Input <= Upper limit input
OGR_IN_REAL : REAL ; // Upper limit input in format REAL
UGR_IN_REAL : REAL ; // Lower limit input in format REAL
EING_REAL : REAL ; // Input im format REAL
LIMIT_R : REAL ; // limited input (for calculation)
LIM_X_UG : REAL; // temporary VAR for limiter
LIM_X_OG : REAL; // Dito
END_VAR
BEGIN
EING_REAL:=INT_TO_REAL(WORD_TO_INT(EING)); // peripheral input from WORD in REAL
OGR_IN_REAL:=INT_TO_REAL(OGR_IN);
UGR_IN_REAL:=INT_TO_REAL(UGR_IN);
IF (UGR_IN_REAL >= OGR_IN_REAL) THEN
FEH := TRUE;
ELSE
FEH := FALSE;
END_IF;
// proof if limit exceeded
IF EING_REAL >= (OGR_IN_REAL + 10.0) THEN
OGR_IN_MAX := TRUE;
ELSE
OGR_IN_MAX := FALSE;
END_IF;
IF EING_REAL < (UGR_IN_REAL - 10.0) THEN
UGR_IN_MAX := TRUE;
ELSE
UGR_IN_MAX := FALSE;
END_IF;
IF UGR_IN_MAX OR OGR_IN_MAX THEN
BU := TRUE; // limit exceeded input
ELSE
BU := FALSE;
END_IF;
(*sorting limits for calculation*)
IF UGR_IN_REAL < OGR_IN_REAL THEN
LIM_X_UG:= UGR_IN_REAL;
LIM_X_OG:= OGR_IN_REAL;
ELSIF OGR_IN_REAL <= UGR_IN_REAL THEN
LIM_X_UG:= OGR_IN_REAL;
LIM_X_OG:= UGR_IN_REAL;
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_RoI AND NOT OBJ_AH THEN
AUSG_REAL := ((OGR_OUT-UGR_OUT) / (OGR_IN_REAL - UGR_IN_REAL)
* LIMIT_R
+ (OGR_OUT - (OGR_OUT - UGR_OUT)
/ (OGR_IN_REAL -UGR_IN_REAL) * OGR_IN_REAL));
AUSG_INT := REAL_TO_INT(INT_FACTOR * AUSG_REAL);
ELSIF NOT OBJ_RoI AND OBJ_AH THEN
AUSG_REAL := (INT_TO_REAL(AUSG_INT) / INT_FACTOR);
ELSE
AUSG_INT := REAL_TO_INT(INT_FACTOR * AUSG_REAL);
END_IF;
END_FUNCTION