Step 7 Time -> DINT

Gexle

Well-known member
Beiträge
151
Punkte Reaktionen
2
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo

Muss euch mal was fragen...

Ich habe hier eine AWL programmierung..

dort ist als Time die DInt Zahl 7200000ms hinterlegt wenn ich diese durch 3600000ms dann ergibt das 2h
Meine Frage kann ich müsste die Zahl also 7200000ms -> 2h auf 3h erhöhen...

Das wären dann 10800000ms -> 3h

Kann ich das machen?
 
Zuletzt bearbeitet:

Heinileini

Well-known member
Beiträge
5.676
Punkte Reaktionen
1.290
Zuviel Werbung?
->Hier kostenlos registrieren
Ja.
Wenn es darum geht, x h + n h auszurechnen, wobei n die Anzahl der zu addierenden Stunden ist, dann
Zeitx := Zeitx + n * 3600000 ;
ggfs
Zeitx := (Zeitx + n * 3600000) MOD 84600000 ;
wenn es darum geht, wieder eine Zahl ohne Überlauf im Bereich 0 .. 84599999 (also 00:00:00,000 .. 23:59:59,999) zu erhalten.
 

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
10.408
Punkte Reaktionen
3.054
Ja.
Wenn es darum geht, x h + n h auszurechnen, wobei n die Anzahl der zu addierenden Stunden ist, dann
Zeitx := Zeitx + n * 3600000 ;
ggfs
Zeitx := (Zeitx + n * 3600000) MOD 84600000 ;
wenn es darum geht, wieder eine Zahl ohne Überlauf im Bereich 0 .. 84599999 (also 00:00:00,000 .. 23:59:59,999) zu erhalten.
Heinrich was treibst du da?
Das Zahlenformat TIME hat erstmal gar nix mit Uhrzeit zu tun.
TIME ist nichts anderes als ein DINT auf Basis von Millisekunden.
 

Heinileini

Well-known member
Beiträge
5.676
Punkte Reaktionen
1.290
Heinrich was treibst du da?
Das Zahlenformat TIME hat erstmal gar nix mit Uhrzeit zu tun.
TIME ist nichts anderes als ein DINT auf Basis von Millisekunden.
Moin Dieter,
Deinen Einwand verstehe ich nicht so ganz. "Hat erstmal nix mit Uhrzeit zu tun": stimmt!!!
Würdest Du das ZahlenFormat TIME denn ignorieren bzw. in den Hintergrund schieben, wenn man es ausnahmsweise doch mal für das Rechnen mit Uhrzeiten oder das Vergleichen von Uhrzeiten benutzen möchte?
Für das Rechnen mit Zeiten ist das DINT-Format doch optimal qualifiziert, sodass ich es mit aller Gewalt in den Vordergrund ziehen würde, selbst, wenn dadurch zusätzliche Konvertierungen aus anderen Formaten und in andere Formate erforderlich werden.
 
Zuletzt bearbeitet:

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
10.408
Punkte Reaktionen
3.054
Zuviel Werbung?
->Hier kostenlos registrieren
Würdest Du das ZahlenFormat TIME denn ignorieren bzw. in den Hintetgrund schieben, wenn man es ausnahmsweise doch mal für das Rechnen mit Uhrzeiten oder das Vergleichen von Uhrzeiten benutzen möchte?
Für das Rechnen mit Zeiten ist das DINT-Format doch optimal qualifiziert, sodass ich es mit aller Gewalt in den Vordergrund ziehen würde, selbst, wenn dadurch zusätzliche Konvertierungen aus anderen Formaten und in andere Formate erforderlich werden.

TIME ist einfach eine Zeitdauer und keine Uhrzeit.
Für Uhrzeiten ist der Datentyp Time_of_Day deutlich besser geeignet.
Bei der 1200 und 1500 Steuerung gibt es mittlerweile auch einige Funktionen für Datum und Uhrzeit.
Die meisten davon kommen mit mehreren Datentypen zurecht.
Das Wandeln um Rechnen mit Millisekunden ist da nicht mehr notwendig.

Zeit_Datum.png
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.526
Punkte Reaktionen
5.880
Genau genommen hat der Fragesteller Gexle gar nicht geschrieben, daß es sich um den Datentyp TIME handelt und die DINT-Zahl die Anzahl Millisekunden ist. Im AWL-Code ist der DINT-Wert 7200000 natürlich ohne Einheit. Der ganze Beitrag enthält Ungenauigkeiten und Fehler und fehlende Worte.
Ich habe dem aber entnommen, daß der Wert 7200000 = 2 Stunden entsprechen soll, und er fragt, wie groß der Wert für 3 Stunden sein müsste. Das ist einfach zu berechnen: 7200000 / 2 * 3 = 10800000
Trotzdem nochmal nachgerechnet komme ich darauf daß 2 Stunden (T#2H = 7200000 ms) durch 7200000 = 1ms (T#1MS) ergibt. Also wird es doch am Ende irgendwie um den Datentyp TIME gehen.

Ein TIME#-Wert kann/darf bis T#24D_20H_31M_23S_647MS groß werden, der Wert muß also nicht auf 24 Stunden begrenzt werden.

Harald
 

Heinileini

Well-known member
Beiträge
5.676
Punkte Reaktionen
1.290
TIME ist einfach eine Zeitdauer und keine Uhrzeit.
Aber Uhrzeit ist auch nur eine ZeitDauer, nämlich seit MitterNacht.
Für Uhrzeiten ist der Datentyp Time_of_Day deutlich besser geeignet.
Geschmackssache.
Bei der 1200 und 1500 Steuerung gibt es mittlerweile auch einige Funktionen für Datum und Uhrzeit.
Die meisten davon kommen mit mehreren Datentypen zurecht.
Und ich soll mir merken, welche Funktion mit welchen DatenTypen zurechtkommt? In diesem Leben nicht mehr, Dieter! :ROFLMAO:
Muss ich mir gar nicht merken, weil ich beim Editieren die entsprechende Info erhalte bzw. nur auswählen muss bzw. schnell finden kann?
Wenn ich ein Programm nur lesen bzw. nur kontrollieren will, wird das schon schwieriger, denke ich mal.
Das Lesen von Programmen ist mir schon immer schwerer gefallen, als das Schreiben von Programmen.
Das Wandeln um Rechnen mit Millisekunden ist da nicht mehr notwendig.
Nicht mehr nötig, aber weiterhin möglich.

Wenn man Programme "leicht portierbar" halten möchte, finde ich es nicht verkehrt, sich auf einfache und praktisch auf allen Systemen verfügbare "GrundFunktionen" zu beschränken.

Von mir aus darf gerne jeder die verfügbaren "SpezialFunktionen" nutzen, wie und so oft er möchte.
In diesem Forum erlebe ich aber immer wieder, wie verzweifelt nach vorgefertigten Lösungen gesucht wird ... selbst für die einfachsten Aufgaben/Funktionen.
Das erinnert mich immer wieder an den Spruch eines entnervten Kollegen aus S5-Zeiten:
"Für alles Mögliche gibt es Befehle. Nur die Befehle, die gerade brauche, die gibt es immer nicht."

Ob ein ZeitWert nun als Anzahl Sekunden oder MilliSekunden oder ZehnfacheVonNanoSekunden codiert ist, ist doch vom Prinzip her egal und es sollte kein unüberwindbares Hindernis sein, diese ineinander umzurechnen und die jeweiligen Obergrenzen zu kennen oder berechnen zu können.

T_ADD, T_SUB und T_DIFF? Um eine Differenz zu bilden, muss ich subtrahieren. Um zu subtrahieren muss ich wissen, dass die Addition einer negativen Zahl eine Subtraktion darstellt. Die Vielfalt in allen Ehren, aber muss ich das alles haben, wenn ich nicht grundsätzliche, aber grundlose Vorbehalte gegen negative Zeiten pflege?
 

Heinileini

Well-known member
Beiträge
5.676
Punkte Reaktionen
1.290
Ein TIME#-Wert kann/darf bis T#24D_20H_31M_23S_647MS groß werden,
Edit:
Mit meiner "OchsenKarrenMethode" mit ZahlenDreher komme ich auf maximal T#25D_9H_1M_23S_647MS.
Mit meiner "OchsenKarrenMethode" ohne ZahlenDreher komme ich auf maximal T#24D_20H_31M_23S_647MS.
ZahlenDreher: 84600000 statt 86400000 eingetippt. Sorry vielstmals!
Achtung! In Beitrag #3 hatte ich auch schon 84600000 anstelle von 86400000 geschrieben, ferner 84599999 statt 86399999 , kann es dort aber leider nicht mehr korrigieren!
der Wert muß also nicht auf 24 Stunden begrenzt werden.
Wo, Harald, siehst Du den Zusammenhang zwischen der maximalen Grösse und dem "Müssen" einer Begrenzung auf 24h?
Wäre die maximale Grösse kleiner als 24h, wäre eine Begrenzung auf 24h natürlich sinnfrei.
Sie ist aber grösser als 24h und deshalb möglich und - je nach Aufgabenstellung - sinnvoll oder auch nicht.
 
Zuletzt bearbeitet:

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
10.408
Punkte Reaktionen
3.054
Die Begrenzung auf 24h ist nur dann sinnvoll wenn ich TIME oder DINT als Uhrzeit betrachte. Bei Schaltuhren oder ähnlichem Aufgaben. Schadet nicht, wenn man es weiß wie es geht.
 
OP
G

Gexle

Well-known member
Beiträge
151
Punkte Reaktionen
2
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo

Danke euch für die Erklärungen...

@PN/DP
Ich habe dem aber entnommen, daß der Wert 7200000 = 2 Stunden entsprechen soll, und er fragt, wie groß der Wert für 3 Stunden sein müsste. Das ist einfach zu berechnen: 7200000 / 2 * 3 = 10800000
Trotzdem nochmal nachgerechnet komme ich darauf daß 2 Stunden (T#2H = 7200000 ms) durch 7200000 = 1ms (T#1MS) ergibt. Also wird es doch am Ende irgendwie um den Datentyp TIME gehen.
Das habe ich oben doch geschrieben??
Hätte vielleicht dazu schreiben sollen Time = Zeitdauer
 

DeltaMikeAir

User des Jahres 2018
Beiträge
14.581
Punkte Reaktionen
4.046
Darf ich fragen wie du auf den Wert kommst -> rechen Weg
Ich denke mal, Heinrich hat sich etwas verrechnet (oder ich verstehe nicht genau was er meint).

Code:
2.160.000.000 ms = 25 Tage
   32.400.000 ms = 9 Stunden
       60.000 ms = 1 Minute
       23.000 ms = 23 Sekunden
          647 ms = 647ms
====================
  Summe = 2.192.483.647
MaxDINT = 2.147.483.647

Hier gibt es noch ein FAQ von Siemens, da ist allerdings ein Fehler drin ( Maximal- und Minimalwert von Time sind jeweils negativ angegeben ):
Wie kann eine Variable vom S7-Datentyp IEC-Zeit (TIME) in WinCC angezeigt werden?
 
Zuletzt bearbeitet:

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
10.408
Punkte Reaktionen
3.054
Zuviel Werbung?
->Hier kostenlos registrieren
So jetzt wurde wunderschön gerechnet, aber leider steckt der Ochsenkarren jetzt im Dreck. :ROFLMAO:
Siemens hat - wie @PN/DP in #7 schon geschrieben hat - für den Datentyp Time einen max. Wert von T#24D_20H_31M_23S_647MS festgelegt.

Time.png
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.526
Punkte Reaktionen
5.880
So jetzt wurde wunderschön gerechnet, aber leider steckt der Ochsenkarren jetzt im Dreck. :ROFLMAO:
Siemens hat - wie @PN/DP in #7 schon geschrieben hat - für den Datentyp Time einen max. Wert von T#24D_20H_31M_23S_647MS festgelegt.
Siemens hat den Wert nicht "festgelegt", sondern der größtmögliche positive 32-Bit Wert ist 16#7FFF_FFFF = L#2147483647 ms = T#24d20h31m23s647ms
Heinrich hat sich einfach verrechnet.

Harald
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.526
Punkte Reaktionen
5.880
Zuviel Werbung?
->Hier kostenlos registrieren
Das habe ich oben doch geschrieben??
Hätte vielleicht dazu schreiben sollen Time = Zeitdauer
OK, ich zeige Dir was in Deinem Beitrag falsch ist:

Ich habe hier eine AWL programmierung..

dort ist als Time die DInt Zahl 7200000ms hinterlegt
In dem AWL-Code steht ziemlich sicher nicht T#7200000ms sondern L#7200000. Daß das Millisekunden sind, hast Du irgendwo anders hergeholt. Wir wissen nicht, wie in dem Code die Zeitmessung realisiert wird, und welchen Zeitwert L#7200000 darstellt. Die Zeitmessung könnte auch durch Zählen von OB30-Aufrufen realisiert sein, dann ist der Zeitwert L#7200000 * Aufrufintervall des OB30.

dort ist als Time die DInt Zahl 7200000ms hinterlegt wenn ich diese durch 3600000ms dann ergibt das 2h
Meinst Du "teile" ("dividiere")?
7200000ms / 3600000ms ergibt NICHT 2h (2 Stunden) sondern 2

Harald
 
OP
G

Gexle

Well-known member
Beiträge
151
Punkte Reaktionen
2
Hallo

In dem AWL-Code steht ziemlich sicher nicht T#7200000ms sondern L#7200000
Ja ich bin davon ausgegangen das das ms sind bzw. steht L#720000 natürlich....

Das das mit Time (Zeitdauer) zutun hat war mir klar...und nicht mit Uhrzeit oder sonstigen.

Meinst Du "teile" ("dividiere")?
7200000ms / 3600000ms ergibt NICHT 2h (2 Stunden) sondern 2
Ja sind natürlich 2 aber was sollen es sonst sein als Stunden...
Ja dividieren...


Danke Harald das du mir das so genau erklärt hast besten Dank habe wieder einiges dazu gelernt das man sowas nicht gleich wie soll ich sagen auf eine Zeitdauer beschränken kann bzw. muss..

Kann auch einfach ein hochzählen von zahlen sein sag ich mal...

Danke euch
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.526
Punkte Reaktionen
5.880
der Wert muß also nicht auf 24 Stunden begrenzt werden.
Wo, Harald, siehst Du den Zusammenhang zwischen der maximalen Grösse und dem "Müssen" einer Begrenzung auf 24h?
Meine Aussage bezog sich auf Deine Addition von zwei Zeiten in Beitrag #2 ("Wenn es darum geht, x h + n h auszurechnen"), wo Du den 24-Stunden-Übertrag mit MOD eliminierst. Das braucht man aber nur, wenn man eine Uhrzeit + Zeitdauer addiert und wieder eine Uhrzeit herauskommt.
TIME# (T#) ist aber keine Uhrzeit sondern eine Zeitdauer, da darf durchaus bei der Addition von zwei TIME#-Werten mehr als 24 Stunden rauskommen, z.B. 20 Stunden + 10 Stunden = 30 Stunden

Harald
 
Oben