Step 7 Unscale FC106

S7Anfänger

Level-2
Beiträge
301
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten morgen zusammen,

Ich stehe mal wieder auf dem Schlauch und habe mich total verrannt.

Ich möchte gern über den UNSCALE FC106 meinen Wert 0.0-50000.0 auf den Wert 0-500 Descalieren.

Bisher habe ich es so begriffen, das der UNSCALE als Ausgabe immer 0-27684 hat.
Meine 50000.0 ist mein arbeitswert in der SPS mit der Einheit "kg"
Unser Anzeige im Funk wird so Dargestellt das der Wert 27684 einer Anzeige von 2768,4 tonnen entspricht.
Damit meine Anzeige also stimmt, müsste ich meine 50000.0 (kg) auf 500 descalieren, damit meine Anzeige im Funk dann 50,0 (Tonnen) entspricht.

Wie stelle ich den Baustein jetzt richtig ein? Bitte auch die Erklärung dazu, damit ich es auch begreife.


Beste Grüße
Hagen
 
Naja, wenn du 50000.0 mit 100.0 teilst, dann wird dein Datenformat wohl vom Typ REAL sein, also 32 Bit. Dein AW hat aber nur 16 Bit
Du müsstest vor der Übergabe auf das AW also auf den Typ INT wandeln.
Welche Programmiersprache?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann UNSCALE auch zum Dividieren durch 100 benutzen, indem man an HI_LIM den Wert 2764800.0 (entspricht 2.7648e+006) dran schreibt (und 0.0 an LO_LIM).

Oder als Schulaufgabe formuliert: UNSCALE skaliert so, daß bei einem IN = HI_LIM --> OUT = 27648 rauskommt. Welchen Wert muß man an HI_LIM angeben, damit bei IN = 50000.0 --> OUT = 500 rauskommt?

Die Verwendung von UNSCALE für die simple Division durch 100 ist zwar nicht besonders effizient aber ziemlich gut verstehbar.

Harald
 
Man kann UNSCALE auch zum Dividieren durch 100 benutzen, indem man an HI_LIM den Wert 2764800.0 (entspricht 2.7648e+006) dran schreibt (und 0.0 an LO_LIM).

Oder als Schulaufgabe formuliert: UNSCALE skaliert so, daß bei einem IN = HI_LIM --> OUT = 27648 rauskommt. Welchen Wert muß man an HI_LIM angeben, damit bei IN = 50000.0 --> OUT = 500 rauskommt?

Die Verwendung von UNSCALE für die simple Division durch 100 ist zwar nicht besonders effizient aber ziemlich gut verstehbar.

Harald


Danke. Das wahr wohl zu einfach für mich.
 
Das wahr wohl zu einfach für mich.
Meine Programmiersprache ist FUP.
Geht noch einfacher
... in FUP:
Code:
        +---------+
        |  DIV_R  |
   ...--|EN       |              +---------+
#In_kg--|IN1   OUT|-#tmp_Real    |  TRUNC  |
 100.0--|IN2   ENO|--------------|EN    OUT|-#Out_Int
        +---------+   #tmp_Real--|IN    ENO|-
                                 +---------+
Je nachdem, wie die wegfallenden Nachkommastellen bei der Umwandlung zu INT behandelt werden sollen (einfach abschneiden oder Ausgabewert runden) kannst Du TRUNC oder ROUND (oder FLOOR) verwenden.

... und in SCL
Code:
Out_Int := REAL_TO_INT(In_kg / 100.0);        //Runden
//oder
Out_Int := DINT_TO_INT(ROUND(In_kg / 100.0);  //Runden
//oder
Out_Int := DINT_TO_INT(TRUNC(In_kg / 100.0)); //Nachkommastellen abschneiden
//oder
Out_Int := DINT_TO_INT(TRUNC(In_kg) / 100);   //Nachkommastellen abschneiden

Harald
 
Zurück
Oben