Bei Zeit-Berechnungen mit TOD-Variablen kann es vorkommen,
daß ein Ergebnis größer 24 Stunden herauskommt. Wenn ich nun
diese Variable für die STOP-Zeit benutze, schaltet TIMECHECK
den Ausgang um 00:00:00 Uhr ab, was nicht richtig ist.
Vorschlag:
IF (STOP >= HOUR_TO_TOD(24)) THEN
STOP := STOP - t#24h;
END_IF
Wenn wir das allgemeingültig machen wollen, sollte eine WHILE-
Schleife das Problem lösen:
WHILE (STOP >= HOUR_TO_TOD(24)) DO
STOP := STOP - t#24h;
END_WHILE
Nochmal ein paar Gedanken zu dem Thema:
Daß ich einer TOD-Variablen keine Zeiten größer 24h zuweisen kann,
ist klar und richtig!
todAbschaltZeit := tod#24:02:00;
erzeugt die Fehlermeldung: Fehler 3906: Testprogramm (23) Ungültige Tageszeitkonstante
Mir ging es aber um Berechnungen mit TOD-Variablen, die, im Gegensatz zu
anderen Zahlentypen (INT, WORD, etc.), offensichtlich keinen automatischen
Übertrag generieren, wenn der Wertebereich überschritten wird.
codesys ist nicht gleich codesys.
wenn du ein projekt compilierst linkt der compiler je nach zielhardware und cpu ganz unterschiedliche interne libraries. andere cpu’s brauchen eben anderen code.
deshalb wird sich dein code unter umständen auf verschiedenen cpu’s unterschiedlich verhalten.
nur weil du ein oder 2 systeme testest ist das noch keine plausible aussage.
sicherer code wird es nur dann wenn man keine derartigen experimente macht.
codesys 9.3.22 verhält sich eben ja nach zielhardware und cpu ganz anders.
mur ein beispiel selbst diue TRUNC funktion für negative zahlen liefert auf einer wago842 cpu andere ergebnisse als auf einer wago841 usw usw
wir schlagen uns bei oscat seit jahren mit diesem thema rum und haben gelernt keine solchen experimente zu machen weil das keinen sichere3n portierbaren code ergibt.
oscat benutzt derzeit gleichen code auf pcworx, twincat, codesys und eben auf unterschiedlichster hardware.
wir haben schon hundertemale feststellen müssen das code mit ein und dem selben codesys für unterschiedliche zielhardware compiliert andere ergebnisse lieferet.
Eine letzte Anmerkung von mir:
Ich akzeptiere Eure Argumentationen, sehe aber das Rechnen mit TOD-Variablen (zumindest für
Codesys und meine Ziel-Hardware) über die 24-Stunden-Marke hinaus als zulässig an!
Zitat aus der Codesys-Hilfe:
Die Datentypen TIME, TIME_OF_DAY (kurz TOD), DATE und DATE_AND_TIME (kurz DT)
werden intern wie DWORD behandelt.
Bei TIME und TOD wird die Zeit in Millisekunden angegeben, wobei bei TOD ab
00:00 Uhr gerechnet wird.
Hieraus ergibt sich für den Datentyp TOD ein interner Umfang von über 49 Tagen (in
Millisekunden), von dem ich m.E. durchaus mehrfach 24 Stunden subtrahieren kann,
solange ich mich im positiven Bereich bewege.
natürlich kannst du es auf deiner plattform so machen
die codesys-doku ist halt keine referenz für die anderen hersteller
das steht auch in der codesys doku
TIME_OF_DAY-Konstanten, zum Speichern von Uhrzeiten:
Eine TIME_OF_DAY-Deklaration beginnt mit “tod#”, “TOD#”, “TIME_OF_DAY#” oder “time_of_day#”, anschließend können Sie eine Uhrzeit angeben in der Schreibweise: Stunde:Minute:Sekunde. Sekunden können dabei als reelle Zahlen angegeben werden, es können also auch Sekundenbruchteile angegeben werden. Mögliche Werte: 00:00:00 bis 23:59:59.999.
@peewit:
Stimmt, andere Hersteller können ihre Datentypen anders definieren.
@hugo:
Ich habe TOD genommen, weil ich es mir einfach machen wollte, da die von
mir genutzten Bausteine (z.B. SUN_TIME, TIMECHECK, …) dies als Eingangs-/
Ausgangs-Typen benutzen!
In diesem Zusammenhang ist mir dann aufgefallen, daß ich beim Berechnen
der STOP-Zeit über die 24h-Marke kommen KÖNNTE! Das würde mir auch bei
Benutzen von TIME passieren, wobei ich dann für TIMECHECK wiederum
in TOD konvertieren müßte…
Dann hätte ich die gleiche Aufgabe mit einem anderen Datentypen…