Zeit in Format REAL in Minuten und Stunden aufsplitten

ThomasKl

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich programmiere mit CoDeSys Vers. 2.3 und würde gerne eine Zeit, die momentan im Format REAL vorhanden ist, so aufsplitten, dass ich Minuten und Stunden anzeigen kann. Ich denke mal, dass ich da irgendwie ins Format BYTE umwandeln muss? Und das, wenn möglich, mit FUP.

Ich hoffe, mir kann jemand helfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, aber es fehlen ein paar Informationen.
Was gibt deine Real-Zahl an: Eine Dauer in Tagen, Stunden, Minuten, Sekunden, Millisekunden?

Das Prinzip wie man so eine Zahl zerlegt ist erstmal unabhängig von der Programmierung.

Wie würdest du es denn im Kopf oder schriftlich rechnen, wenn dir jemand eine Zeitdauer von 2,5 Stunden sagt, und du das in Stunden und Minuten zerlegen willst?
 
Erst mal vielen Dank für die Antwort!

Der REAL-Wert kommt aus dem WAGO-Baustein FbBetrDauer. Er gibt auch Tag (dw), Stunde(b) und Minute(b) aus.

CoDeSys - PumpenBetriebszeitPause.jpg

Ich habe aber mit den REAL-Werten gerechnet um die Differenz zu ermitteln und möchte nun die Diferenz als Stunden und Minuten anzeigen.

Die Nachkommastellen (Mantisse) sind für die Minuten zuständig. Vor dem Komma sind die Stunden. Weiter komme ich mit meiner Logik grade leider nicht. Die real Zeit besteht aus 32 Bit. Bit 0 bis 23 sind die Minuten, 24 bis 31 die Stunden und 32 das Vorzeichen?

Ach so, 2,5 Stunden sind 2 Stunden und 30 Minuten. Aber wie splitte ich das?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Indem ich mit 60 multipliziere. Dadurch käme ich aber bei 2,5 auf 150 Minuten. Was ja richtig ist, mir aber nicht weiter hilft. Ich hätte gern so eine Aufteilung wie es der Baustein oben macht. Hab grad wohl irgendwie ein Brett vor dem Kopf:roll:
 
Die Nachkommastellen (Mantisse) sind für die Minuten zuständig. [...]
Die real Zeit besteht aus 32 Bit. Bit 0 bis 23 sind die Minuten, 24 bis 31 die Stunden und 32 das Vorzeichen?
Vergiss das, Mantisse ist nicht das selbe wie Nachkommastellen.
REAL-Zahl nach IEEE 754: Bit 0..22 ist Mantisse, Bit 23..30 ist Exponent mit Bias, Bit 31 ist das Vorzeichen.

2,5 Stunden sind 2 Stunden und 30 Minuten. Aber wie splitte ich das?
TRUNC ist Dein Freund.

Zerlege den REAL-Wert in den Ganzzahl-Anteil vor dem Dezimalkomma (das sind die Stunden) und den gebrochenen Teil nach dem Komma.
Multipliziere den Nachkommateil mit 60.0 und nimm von dem Ergebnis wieder nur den Ganzzahl-Anteil (das sind die Minuten).
Code:
Stunden   := TRUNC(realwert) ;
Nachkomma := realwert - INT_TO_REAL(Stunden) ;
Minuten   := TRUNC(Nachkomma * 60.0) ;

Harald
 
Hammer!! :grin: Danke an Euch!

PN/DP: Wenn ich das so mache wie Du sagst, wird, sobald ich bei den Stunden etwas dazu tue, in der Differenz eine Minute zu wenig angezeigt. Was nicht wirklich tragisch ist! Aber kann ich das auch noch irgendwie weg bekommen?

Auch wenn ich etwas berechnen lasse: 6 Minuten minus 4 ergibt dann 1. Es ist aber immer nur diese 1 Minute. Ist das irgendwo ein Rundungsfehler, weil ich die beiden Real-Werte subtrahiere?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Rundungsfehler kann möglich sein, das müßte man mal ausprobieren.
Vielleicht hilft es, wenn Du bei der Ganzzahl-Wandlung der Minuten statt TRUNC besser REAL_TO_INT nimmst? Oder nach der Multiplikation noch 0.5 addierst?
Code:
Minuten   := REAL_TO_INT(Nachkomma * 60.0) ;

oder

Minuten   := TRUNC(Nachkomma * 60.0 + 0.5) ;

oder

Minuten   := REAL_TO_INT(Nachkomma * 60.0 + 0.5) ;

Harald
 
Habe diese Version genommen:

Code:
[COLOR=#333333]Minuten   := TRUNC(Nachkomma * 60.0 + 0.5) ;[/COLOR]

Und klappt! :grin: Keine Rundungsfehler mehr! Und nochmals Danke!!!

Thomas
 
Zurück
Oben