TIA S7: SCL: TIME_TO_TOD() funktioniert nicht?

Automatinator

Level-1
Beiträge
115
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Habe folgendes Programm (zyklisch):

tNow : Time
todENG_Time_1 : Time_Of_Day

Code:
#tNow := TIME_TCK();

#todENG_Time_1 := TIME_TO_TOD(#tNow);

Wobei die Rückgabe von TIME_TCK() ein "Time" Datentyp ist.

Und wenn ich die Beobachte dann ist:
tNow => 1D_2H_3M_4S_005MS

jedoch

todENG_Time_1 => 16#38E3_8E3A (oder TOD#00:00:00.001)

1) Wieso Zeigt er mir nicht 02:03:04.005 an?
2) Wieso steht da in der Beobachtungstabelle der Wert manchmal in Hex?

Komischerweise funktioniert es wenn tNow klein ist, aber ein Überlauf sollte es ja nicht geben... Das müsste doch abgefangen werden im TIME_TO_TOD() ...

Mach ich da was Falsch?

Danke schon im Vorraus!

Gruss
 
Zuletzt bearbeitet:
Da scheint es schon mal Problemen gegeben zu haben http://www.sps-forum.de/simatic/656-systemzeit-lesen-mit-der-sfc-64-time_tck.html

Ein Kollege wollte auch mal das Format Date and Time anzeigen was nicht geklappt hat, und hat dann festgestellt das wenn er direkt hinter der variabele vom Typ date and time noch eine vom gleichen typ anlegt die anzeige richtig war. Sprich ein Dummy Date and time hinter dran machen.

Am Code sehe ich nichts falsches.

Bram
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Antwort liegt so nah:
TIA-Hilfe > Index > TIME_TO_
Explizite Konvertierung von TIME
TIME_TO_TOD
Das Bitmuster des Quellwerts wird ohne Änderung rechtsbündig in den Zieldatentyp übertragen. Wenn der Quellwert außerhalb des Wertebereichs von TOD liegt, dann wird der Zieldatentyp nicht verändert.
TOD (TIME_OF_DAY)
Wertebereich
TOD#00:00:00.000 bis TOD#23:59:59.999

Harald
 
Ja Bravo Siemens... wieso machen die Überhaupt ein Datenkonverter den man nicht brauchen kann? -.-

Was heisst hier nicht brauchen kann? Der macht genau das wofür er gebraucht ist. Er macht aus einem Time Format ein TOD Format. Wenn man ihm die richtigen Daten liefert. Ansonsten lässt er die Sache in Ruhe. Schlimmer wäre es doch wenn er einen ungültigen Eingangswert anfängt zu interpretieren (0 Rausschreibt z.b.).

mfG René
 
Was heisst hier nicht brauchen kann? Der macht genau das wofür er gebraucht ist. Er macht aus einem Time Format ein TOD Format. Wenn man ihm die richtigen Daten liefert. Ansonsten lässt er die Sache in Ruhe. Schlimmer wäre es doch wenn er einen ungültigen Eingangswert anfängt zu interpretieren (0 Rausschreibt z.b.).

Naja ich mein ja nur, bei allen anderen Datentypkonvertierern (die ich kenne) wird rechtsbündig übertragen und links geschnitten. Genau das würde doch auch Sinn beim TIME_TO_TOD() ergeben... TOD heisst ja auch, das Datum egal, Uhrzeit relevant...

und vollmi was heisst hier richtige Daten? bei 0d_18h_23m_45s_965ms funktionierts und bei 1d_18h_23m_45s_965ms nicht mehr... wenn ich einen gültigen TIME wert gebe, soll er mir auch den korrekt gewandelten (unveränderten) Wert liefern und nicht den alten Wert...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich brauch ne ms genaue Zeitdifferenz... TIME_TCK() ist TIME und T_DIFF() braucht TOD...
Warum so einen Aufwand, wenn ein ganz simples "-" auch reicht?
Einzige Problematik du müsstest noch den Überlauf abfangen, hab ich persönlich dadurch gelöst das eine Differenz GT 150ms ignoriert wird.

Mfg
Manuel
 
Ja Bravo Siemens... wieso machen die Überhaupt ein Datenkonverter den man nicht brauchen kann? -.-
Der Datentyp TOD = TIME_OF_DAY ist nunmal so definiert, daß er keine Werte >= 24h darstellen kann (weil es die Uhrzeit eines Tages ist und es keine Uhrzeit >= 24:00 Uhr gibt). Deshalb darf eine TOD-Variable auch keine Werte enthalten, die >= 24h wären und der Konverter TIME_TO_TOD schreibt solche unzulässigen Werte nicht in die Zielvariable.

Wenn man aus einer beliebigen TIME mit Werten bis T#24D_20H... eine TOD extrahieren will, dann kann man das explizit so tun:
Code:
#tod_Var := TIME_TO_TOD(#time_Var MOD 86400000);

//oder übersichtlich:
#tod_Var := TIME_TO_TOD(#time_Var MOD (DINT#24*60*60*1000));

//vielleicht akzeptiert das TIA-SCL es sogar schon so?:
#tod_Var := #time_Var MOD 86400000;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Datentyp TOD = TIME_OF_DAY ist nunmal so definiert, daß er keine Werte >= 24h darstellen kann (weil es die Uhrzeit eines Tages ist und es keine Uhrzeit >= 24:00 Uhr gibt). Deshalb darf eine TOD-Variable auch keine Werte enthalten, die >= 24h wären und der Konverter TIME_TO_TOD schreibt solche unzulässigen Werte nicht in die Zielvariable.

Dann bist du nachlässiger mit Siemens als ich haha. Weil ich will von einer Datum/Zeit die Tageszeit wissen TIME_TO_TOD()... macht also nicht viel Sinn was du sagst, ausser Datentypumwandlungen bei Grössenkonflikte wären nicht möglich. Aber wenn ein DINT von 0 auf 16#10001 geht, dann bleibt der INT bei einem DINT_TO_INT() ja auch net 0, sondern wird 1...
 
Dann bist du nachlässiger mit Siemens als ich haha. Weil ich will von einer Datum/Zeit die Tageszeit wissen TIME_TO_TOD()... macht also nicht viel Sinn was du sagst, ausser Datentypumwandlungen bei Grössenkonflikte wären nicht möglich. Aber wenn ein DINT von 0 auf 16#10001 geht, dann bleibt der INT bei einem DINT_TO_INT() ja auch net 0, sondern wird 1...

Ich bin mir ziemlich sicher, dass Time_To_TOD in TIA nicht als Konvertierung von Basisdatentypen deklariert ist sondern irgendeinen spezial FB oder SFB aufruft um das zu händeln. Und ganz bestimmt ist das in der Hilfe auch so beschrieben. Ansonsten bräuchte man ja überhaupt keine Time_To_TOD weils im hintergrund ja zwei 32bit Integerwerte welche Millisekunden darstellen sind.

mfG René
 
In wie fern? Hab ich was verpasst?
Es hat den Anschein dass du ein Verständnisproblem mit den verschiedenen Datentypen hast. Sieh dir doch bitte in der Onlinehilfe die Definitionen und Wertebereiche zu "TIME", "TIME OF DAY" und "DATE AND TIME" an. In den o.g. Zitaten bringst du das "DATUM" in Zusammenhang mit "TIME" und "TIME OF DAY". Beide Datentypen haben nichts mit dem "DATUM" zu tun. Beide sind lediglich 32Bit-Werte, welche eine Dezimalzahl in [ms] darstellen, wobei "TIME OF DAY" zwischen T#0MS und T#23H59M59S999MS begrenzt ist.
 
Es hat den Anschein dass du ein Verständnisproblem mit den verschiedenen Datentypen hast. Sieh dir doch bitte in der Onlinehilfe die Definitionen und Wertebereiche zu "TIME", "TIME OF DAY" und "DATE AND TIME" an. In den o.g. Zitaten bringst du das "DATUM" in Zusammenhang mit "TIME" und "TIME OF DAY". Beide Datentypen haben nichts mit dem "DATUM" zu tun. Beide sind lediglich 32Bit-Werte, welche eine Dezimalzahl in [ms] darstellen, wobei "TIME OF DAY" zwischen T#0MS und T#23H59M59S999MS begrenzt ist.

Achso ja sorry mit Datum meine Ich Tage haha, hab mich da im Wort vertan haha
 
Zurück
Oben