Step 7 Nachkommastellen aus Gleitpunktzahl entfernen und in Ganzzahl umwandeln

Eleu

Level-2
Beiträge
116
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

angenommen ich bekomme von einem Fremdsystem in einen Datenbaustein eine Gleitpunktzahl übertragen
und ich muss diese in meiner Steuerung umwandeln in eine 32 Bit Ganzzahl.

Nun gibt es ja die nachfolgenden Umwandelfunktionen in AWL:

  • RND - eine Gleitpunktzahl (32 Bit) runden zur nächstliegenden Ganzzahl (32 Bit)
  • TRUNC - erzeugen einer Ganzzahl durch weglassen der Nachkommastellen
  • RND+ - erzeugen der nächsthöheren Ganzzahl aus einer Gleitpunktzahl
  • RND- - erzeugen der nächstniederen Ganzzahl aus einer Gleitpunktzahl
Ich darf aber nicht runden, oder weglassen, sondern ich muss z.B. die Gleitpunktzahl 1,564000 in eine Ganzzahl 1564 umwandeln.

Wie mache ich das?

Hat jemand eine Idee?

Gruß
Eleu
 
Naheliegend wäre ja zunächst mit 1000 zu multiplizieren und dann umzuwandeln. Aber das geht natürlich nur, wenn immer gleich viele stellen hinter dem Komma (relevant) sind. Ist dem so?
 
Geleitpunktzahlen in der S7 haben 7 relevante Ziffern, also z.B. 3 vor dem Komme 4 nach dem Komme oder 1 vor dem Komme 6 nach dem Komma usw.
Du müßtest erst einmal wissen, wiviele Stellen hinter dem Komma für euch wichtig sind, bei 3 Stellen mit 1000, bei 4 mit 10000 Mutiplizieren usw.
mehr als 7 ist Quatsch, weil der Rest in der S7-Gleitpunktzahl eh nicht enthalten ist. Nach dem Multiplizieren wandeln in DINT. Dann noch schauen, ob die größte so erzeugte Zahl in eine DINT paßt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum/wofür musst Du die Gleitpunktzahl in eine Ganzzahl (hier eigentlich "Festpunktzahl") umwandeln? Irgendwie musst Du festlegen oder mitspeichern, an welcher Stelle der Dezimalpunkt hingehört.

Harald
 
Warum/wofür musst Du die Gleitpunktzahl in eine Ganzzahl (hier eigentlich "Festpunktzahl") umwandeln? Irgendwie musst Du festlegen oder mitspeichern, an welcher Stelle der Dezimalpunkt hingehört.

Harald

Beispielsweise kommt aus dem System x die Dichte 1,456 als Gleitpunktzahl. System y baucht diese aber als DINT 1456 (Oder Long - Integer) um diese weiter zu verarbeiten. System y soll nicht verändert werden. Ist nur ein Beispiel...
 
Wenn die Nachkommastellen nicht immer gleich sind,
Könnte dir eine Skalierung weiter helfen.

System Y arbeitet zu Beispiel mit 0 - 10000 Digit
Dan auf das Bereich skalieren.

Wenn System Y nicht so arbeitet , dann irgendwie auswerten wieviel Nachkommastellen mann hat. Weis das nicht auf die Stelle, Ich musste mich selber auch schlau machen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beispielsweise kommt aus dem System x die Dichte 1,456 als Gleitpunktzahl. System y baucht diese aber als DINT 1456 (Oder Long - Integer) um diese weiter zu verarbeiten. System y soll nicht verändert werden.
Und Du sollst die Daten vor der Weitergabe passend konvertieren. Da ist dann ja sicher dokumentiert/festgelegt, wie skaliert System y seine Daten haben will. Da könntest Du eine Function (FC) programmieren, wo Du den Eingangswert und den Multiplikator (Skalierungsfaktor) übergibst. Oder falls Du in SCL programmierst, dann ist das eh' nur ein Einzeiler: System_y_iValue := REAL_TO_DINT(System_x_rValue * REAL#1000.0);

Harald
 
Wenn die Nachkommastellen nicht immer gleich sind,
Könnte dir eine Skalierung weiter helfen.

System Y arbeitet zu Beispiel mit 0 - 10000 Digit
Dan auf das Bereich skalieren.

Wenn System Y nicht so arbeitet , dann irgendwie auswerten wieviel Nachkommastellen mann hat. Weis das nicht auf die Stelle, Ich musste mich selber auch schlau machen.
An der Stelle, denke ich ist es kein Problem, weil wenn ich mit 1000 multipliziere, sind es immer 3 Stellen hinter dem Komma und der Rest wird abgeschnitten.

Angenommen ich habe einen Gewichtswert von 24, 34567kg den ich als Gleitpunktzahl erhalte. In dem Fall 2.434567e+001 und ich
multipliziere ich ihn mit tausend, wandle ihn mit RND um, erhalte ich als Ganzzahl 24346
Bekomme ich einen Gewichtswert von 1, 34567kg den ich als Gleitpunktzahl erhalte. In dem Fall 1.345670e+000 und ich
multipliziere ich ihn mit tausend, wandle ihn mit RND um, erhalte ich als Ganzzahl 1346
System y erwartet eine Ganzzahl in Long Integer (Gewichtswert in Gramm)
 
Zuletzt bearbeitet:
Zurück
Oben