Umwandeln von TIME nach UDINT und danach in REAL

JüKo

Level-2
Beiträge
108
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an Alle,

ich möchte einen Prozentwert (KletterdauerProzent) aus zwei Variablen (Kletterdauer und Kletterdauergesamt) errechnen.
Hierzu will ich zwei Timevariablen in UDINT umwandeln.
Klappt soweit auch, ich erhalte die Zeit als UDINT-Wert der Millisekunden aus den Zeitwerten.
Danach möchte ich die beiden UDINT miteinander teilen und eine Realzahl erhalten.
Das klappt leider nicht, die Realzahl wird nach dem Kommal einfach abgeschnitten.
Wie bekomme ich die Nachkommastellen der Realzahl auf eine Nachkommastelle?

Hier der Code dazu

KletterdauerProzent := UDINT_TO_REAL ((TIME_TO_UDINT ((Kletterdauer) * 100)) / (TIME_TO_UDINT (KletterdauerGesamt)));

Bsp:
 
Du musst die UDINTs bereits in den Klammern in REAL wandeln, damit aus der Division Nachkommastellen mit rauskommen. Das Ergebnis sollte dann auch REAL sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Überleg mal was du machst:
Du teilst hier zuerst 2 UDINT. Da gibt es keine Nachkommastellen.
Das Ergebnis der Division wandelst du nach Real. Da gibt es dann auch keine Nachkommastellen.
Also musst du deine Typwandlungen etwas ändern :-)
 
Okay, hab ich gemacht. Trotzdem ist da noch der Wurm drin.

ich hab jetzt mal einen Versuch gestartet.

temp1 : REAL;
Kletterdauer: TIME;

temp1 := TIME_TO_REAL (( Kletterdauer) / 29);

Das Ergebnis ist:
94 := TIME_TO_REAL (( T#2s747ms) / 29);

94 sollte aber 94,7 sein!?
 
Deine Division selbst ist immer noch eine Time_Variable geteilt durch einen Integer. Vermutlich erzeugt der Compiler daraus erstmal wieder einen Time Variable, den du dann mit "Time_To_Real" ohne Nachkommastellen in ein Real verwandelst.
Versuch mal, statt 29 eine 29,0 zu nehmen oder Kletterdauer vor der Division in ein Real zu wandeln.
 
Das ist hier im Grunde nichts anderes wie die obligatorische Skalierung von RTD-Analogeingängen zur Temperaturmessung: Zuerst den Analogeingangswert (oder hier im Thema den TIME) von Ganzzahl zu REAL wandeln und danach durch 100.0 oder 10.0 dividieren. Wenn man es ganz richtig macht, dann geht das mit "Impliziter Konvertierung" - da muss man aber die Divisor-Konstante eindeutig als REAL-Konstante schreiben (100.0), und nicht nur schreibfaul 100 , damit der Compiler sieht dass das eine REAL-Division sein soll:
Code:
Real_MeineTemperatur := Int_Analogwert / 100.0; // die REAL-Konstante 100.0 bringt den Compiler auf den richtigen impliziten Weg
Vorsichtshalber und für mehr Übersichtlichkeit sollte man es aber explizit formulieren:
Code:
Real_MeineTemperatur := INT_TO_REAL(Int_Analogwert) / 100.0; // explizite Typwandlung vor der REAL-Division
Mit der expliziten Formulierung geht dann auch die schreibfaule 100, weil wegen der expliziten Konvertierung des Dividend zu REAL der Compiler auch die 100 implizit in REAL#100.0 konvertiert vor der REAL-Division:
Code:
Real_MeineTemperatur := INT_TO_REAL(Int_Analogwert) / 100; // nicht schön, geht aber wegen der expliziten Typwandlung vor der Division

siehe auch mal hier
 
Super!!! Läuft!
Danke euch für die qualifizierten Kommentare. Hab eine Weile gebraucht zum Probieren, aber bis jetzt sieht es gut aus.

Ich verneige mich vor Euch,
Jürgen
 
Zurück
Oben