# Zeit in Format REAL in Minuten und Stunden aufsplitten



## ThomasKl (24 August 2014)

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.


----------



## ThomasKl (24 August 2014)

Habe ich das hier in der falschen Ecke geschrieben:shock:? Sollte ich die Frage nochmal woanders stellen?


----------



## Thomas_v2.1 (24 August 2014)

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?


----------



## ThomasKl (24 August 2014)

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.




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?


----------



## hucki (24 August 2014)

Wie berechnest Du denn, dass 0,5 Stunden = 30 Minuten sind?


----------



## ThomasKl (24 August 2014)

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:


----------



## PN/DP (24 August 2014)

ThomasKl schrieb:


> 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.



ThomasKl schrieb:


> 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).

```
Stunden   := TRUNC(realwert) ;
Nachkomma := realwert - INT_TO_REAL(Stunden) ;
Minuten   := TRUNC(Nachkomma * 60.0) ;
```

Harald


----------



## ThomasKl (24 August 2014)

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?


----------



## PN/DP (24 August 2014)

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?

```
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


----------



## ThomasKl (24 August 2014)

Habe diese Version genommen:


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

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

Thomas


----------

