FUNCTION "SCALE_SCL" : Word
TITLE = 'SCALING VALUES'
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : PN_DP
FAMILY : CONVERT
NAME : SCALE
VERSION : 1.0
[COLOR="#008000"]//Funktion wie Step7 V5.x > TI-S7 Converting Blocks > FC105 SCALE[/COLOR]
VAR_INPUT
IN : Int; [COLOR="#008000"]// input value to be scaled[/COLOR]
HI_LIM : Real; [COLOR="#008000"]// upper limit in engineering units[/COLOR]
LO_LIM : Real; [COLOR="#008000"]// lower limit in engineering units[/COLOR]
BIPOLAR : Bool; [COLOR="#008000"]// 1=bipolar; 0=unipolar[/COLOR]
END_VAR
VAR_OUTPUT
OUT : Real; [COLOR="#008000"]// result of the scale conversion[/COLOR]
END_VAR
VAR_TEMP
IN_Real : Real;
K1 : Real;
END_VAR
VAR CONSTANT
K2 : Real := +27648.0;
END_VAR
BEGIN
[COLOR="#008000"]// Die Konstanten K1 und K2 werden unterschiedlich gesetzt, je nachdem, ob der Eingabewert BIPOLAR oder UNIPOLAR ist.[/COLOR]
[COLOR="#008000"]// BIPOLAR : Es wird angenommen, daß der ganzzahlige Eingabewert zwischen -27648 und 27648 liegt, deshalb sind K1 = -27648,0 und K2 = +27648,0.[/COLOR]
[COLOR="#008000"]// UNIPOLAR: Es wird angenommen, daß der ganzzahlige Eingabewert zwischen 0 und 27648 liegt, deshalb sind K1 = 0,0 und K2 = +27648,0.[/COLOR]
IF #BIPOLAR THEN
#K1 := -27648.0;
ELSE
#K1 := 0.0;
END_IF;
[COLOR="#008000"]// Ist der ganzzahlige Eingabewert kleiner als K1, dann wird der Ausgang (OUT) an LO_LIM gebunden und ein Fehler ausgegeben.[/COLOR]
[COLOR="#008000"]// Ist der ganzzahlige Eingabewert größer als K2, dann wird der Ausgang an HI_LIM gebunden und ein Fehler ausgegeben.[/COLOR]
[COLOR="#008000"]// Der Signalzustand von ENO wird auf "0" und RET_VAL wird auf W#16#0008 gesetzt.[/COLOR]
#SCALE_SCL := 8; [COLOR="#008000"]// Return: Vorbelegung mit Fehlerstatus W#16#0008[/COLOR]
#IN_Real := INT_TO_REAL(#IN);
IF #IN_Real < #K1 THEN
#OUT := #LO_LIM;
ELSIF #IN_Real > #K2 THEN
#OUT := #HI_LIM;
ELSE
#SCALE_SCL := 0; [COLOR="#008000"]// Return: 0 für OK[/COLOR]
[COLOR="#008000"]// Die Funktion SCALE arbeitet mit der folgenden Gleichung:[/COLOR]
[COLOR="#008000"]// OUT = [ ((FLOAT(IN) - K1)/(K2-K1)) * (HI_LIM-LO_LIM) ] + LO_LIM[/COLOR]
#OUT := ( ((#IN_Real - #K1) / (#K2 - #K1)) * (#HI_LIM - #LO_LIM) ) + #LO_LIM;
END_IF;
[COLOR="#008000"]// ENO: 1 kein Fehler / 0 Fehler[/COLOR]
ENO := #SCALE_SCL = 0;
END_FUNCTION