Wer SCALE und UNSCALE mit der selben Funktionalität wie in Step7 V5.x für TIA braucht (z.B. für S7-1200), hier 2 Bausteine in SCL:
Code:
FUNCTION "SCALE_SCL" : Word
TITLE = 'SCALING VALUES'
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : PN_DP
FAMILY : CONVERT
NAME : SCALE
VERSION : 1.0
//Funktion wie Step7 V5.x > TI-S7 Converting Blocks > FC105 SCALE
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;
K1 : Real;
END_VAR
VAR CONSTANT
K2 : Real := +27648.0;
END_VAR
BEGIN
// Die Konstanten K1 und K2 werden unterschiedlich gesetzt, je nachdem, ob der Eingabewert BIPOLAR oder UNIPOLAR ist.
// BIPOLAR : Es wird angenommen, daß der ganzzahlige Eingabewert zwischen -27648 und 27648 liegt, deshalb sind K1 = -27648,0 und K2 = +27648,0.
// UNIPOLAR: Es wird angenommen, daß der ganzzahlige Eingabewert zwischen 0 und 27648 liegt, deshalb sind K1 = 0,0 und K2 = +27648,0.
IF #BIPOLAR THEN
#K1 := -27648.0;
ELSE
#K1 := 0.0;
END_IF;
// Ist der ganzzahlige Eingabewert kleiner als K1, dann wird der Ausgang (OUT) an LO_LIM gebunden und ein Fehler ausgegeben.
// Ist der ganzzahlige Eingabewert größer als K2, dann wird der Ausgang an HI_LIM gebunden und ein Fehler ausgegeben.
// Der Signalzustand von ENO wird auf "0" und RET_VAL wird auf W#16#0008 gesetzt.
#SCALE_SCL := 8; // Return: Vorbelegung mit Fehlerstatus W#16#0008
#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; // Return: 0 für OK
// Die Funktion SCALE arbeitet mit der folgenden Gleichung:
// OUT = [ ((FLOAT(IN) - K1)/(K2-K1)) * (HI_LIM-LO_LIM) ] + LO_LIM
#OUT := ( ((#IN_Real - #K1) / (#K2 - #K1)) * (#HI_LIM - #LO_LIM) ) + #LO_LIM;
END_IF;
// ENO: 1 kein Fehler / 0 Fehler
ENO := #SCALE_SCL = 0;
END_FUNCTION
Code:
FUNCTION "UNSCALE_SCL" : Word
TITLE = 'UNSCALING VALUES'
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : PN_DP
FAMILY : CONVERT
NAME : UNSCALE
VERSION : 1.0
//Funktion wie Step7 V5.x > TI-S7 Converting Blocks > FC106 UNSCALE
VAR_INPUT
IN : Real; // input value to be unscaled
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 : Int; // result of the unscale conversion
END_VAR
VAR_TEMP
tmp_OUT : Real;
K1 : Real;
END_VAR
VAR CONSTANT
K2 : Real := +27648.0;
END_VAR
BEGIN
// Die Konstanten K1 und K2 werden unterschiedlich gesetzt, je nachdem, ob der Eingabewert BIPOLAR oder UNIPOLAR ist.
// BIPOLAR : Es wird angenommen, daß der ganzzahlige Ausgabewert zwischen -27648 und 27648 liegt, deshalb sind K1 = -27648,0 und K2 = +27648,0.
// UNIPOLAR: Es wird angenommen, daß der ganzzahlige Ausgabewert zwischen 0 und 27648 liegt, deshalb sind K1 = 0,0 und K2 = +27648,0.
IF #BIPOLAR THEN
#K1 := -27648.0;
ELSE
#K1 := 0.0;
END_IF;
// Liegt der Eingabewert nicht in dem Bereich zwischen LO_LIM und HI_LIM, dann wird der Ausgang (OUT) an den nächsten Grenzwert
// (den oberen oder den unteren) für den angegebenen Bereich des jeweiligen Typs (BIPOLAR oder UNIPOLAR) gebunden und ein Fehler ausgegeben.
// Der Signalzustand von ENO wird auf "0" und RET_VAL wird auf W#16#0008 gesetzt.
#UNSCALE_SCL := 8; // Return: Vorbelegung mit Fehlerstatus W#16#0008
IF #HI_LIM > #LO_LIM THEN // direkt proportional
IF #IN < #LO_LIM THEN
#tmp_OUT := #K1;
ELSIF #IN > #HI_LIM THEN
#tmp_OUT := #K2;
ELSE
#UNSCALE_SCL := 0; // Return: 0 für OK
END_IF;
ELSE // umgekehrt proportional
IF #IN < #HI_LIM THEN
#tmp_OUT := #K1;
ELSIF #IN > #LO_LIM THEN
#tmp_OUT := #K2;
ELSE
#UNSCALE_SCL := 0; // Return: 0 für OK
END_IF;
END_IF;
IF #UNSCALE_SCL = 0 THEN // IN ist OK
// Die Funktion UNSCALE arbeitet mit der folgenden Gleichung:
// OUT = [ ((IN-LO_LIM)/(HI_LIM-LO_LIM)) * (K2-K1) ] + K1
#tmp_OUT := ( ((#IN - #LO_LIM) / (#HI_LIM - #LO_LIM)) * (#K2 - #K1) ) + #K1; // Es muß HI_LIM <> LO_LIM sein!
END_IF;
#OUT := DINT_TO_INT(TRUNC(#tmp_OUT));
// ENO: 1 kein Fehler / 0 Fehler
ENO := #UNSCALE_SCL = 0;
END_FUNCTION
Den SCL-Quellcode verwenden:
1) die Datei SCALE_UNSCALE_TIA.scl.txt downloaden
2) die Datei umbenennen zu SCALE_UNSCALE_TIA.scl (das .txt entfernen)
3) im TIA (Test-)Projekt im Projektbaum unter der CPU > Externe Quellen > Neue externe Datei hinzufügen: die Datei SCALE_UNSCALE_TIA.scl
4) auf den nun erschienenen Eintrag Externe Quellen > SCALE_UNSCALE_TIA.scl > Rechtsmausklick > Bausteine aus Quelle generieren: das erzeugt unter "Programmbausteine" 2 FC: SCALE_SCL + UNSCALE_SCL
5) Enjoy! die Bausteine öffnen, übersetzen, verwenden, oder wieder löschen einzeln oder beide FC
6) der Eintrag SCALE_UNSCALE_TIA.scl unter "Externe Quellen" kann danach gelöscht werden
Alternativ zu 1..2 kann auch der Quelltext der einzelnen FUNCTIONs hier aus dem CODE-Block in eine Standard-Textdatei kopiert werden und unter irgendeinName.scl gespeichert werden. (z.B. mit Notepad)
Bookmarks