TIA Uhrzeit vergleichen mit "DTL ist größer / kleiner als..." Schicht-Auswertung per Zeit

ChristianVogel

Level-2
Beiträge
401
Reaktionspunkte
53
Zuviel Werbung?
-> Hier kostenlos registrieren
Uhrzeit vergleichen mit "DTL ist größer / kleiner als..." Schicht-Auswertung per Zeit

Hallo zusammen,

bräuchte mal einen Tipp: Die Auswertung einer "Schicht 1/2/3" oder "Schicht A/B/C" habe ich schon öfters gemacht, das ist bei vollen Stunden von 06:00-14:00 / 14:00-22:00 und 22:00-06:00 Uhr eigentlich auch nicht wirklich ein Problem. Ein Kunde möchte nun diese Eingaben flexibel haben, weil ggf. saisonbedingt oder auftragsabhängig die Arbeitszeit angepasst wird, oder ggf. die Nachtschicht ausfällt und dafür an Früh-/Spätschicht eine Stunde drangehängt wird...

Kann ich denn eine Uhrzeit, die als "DTL-Format" oder "Time_Of_Day" vorliegt irgendwie auf "kleiner als / früher als" oder "größer als / Später als" vergleichen und damit auswerten??? Denn wenn ich die reinen "USINT"-Bestandteile von DTL auswerte, bringt mir ein "größer als"-Vergleich ja nichts, wenn ich zum Beispiel eine Zeit auswerte von 07:30, weil ja die nächste Stunde mit einem "kleineren Minutenwert" beginnen wird... Wenn ich also die Stunden und Minuten zusammen mit "größer als" bekomme ich ja kein Ergebnis, solange die Minuten der beginnenden Stunde kleiner als 30 sind...

ich hoffe ich habe das nicht allzu kompliziert beschrieben, wo mein Problem liegt, ich möchte permanent ein Bit gesetzt bekommen, wenn die Uhrzeit zwischen
06:00:00 bis 13:59:59 (Frühschicht)
14:00:00 bis 21:59:59 (Spätschicht)
22:00:00 bis 05:59:59 (Nachtschicht)
liegt... Die Startzeit möchte ich jeweils eingeben, die Endzeit ergibt sich ja automatisch aus der Startzeit der Vorschicht minus einer Sekunde, das kann ich ja automatisch berechnen lassen...

Wichtig wäre mir nur, dass die verwendeten Bausteine auch auf der 1200er laufen. Aktuell habe ich eine 1500er-CPU, den Baustein möchte ich aber auch anderweitig verwenden...

Jemand einen Tipp für mich?

Gruß Christian

2019-05-13 (1).jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Grundsätzlich kannst du sowohl die normalen Vergleichsoperatoren (CMP >= bzw. CMP <=) oder die Anweiseung T_COMP zum Vergleichen von TOD bzw. DTL verwenden.

Zu deiner Anwendung gibt es dann noch folgendes zu sagen.

Ich würde TOD nehmen.
Grundsätzlich zuerst eine Fallunterscheidung (Tagesübergang) machen und dann wie folgt vergleichen
  • Wenn Startzeit <= Endzeit dann Vergleich: Jetzt >= Startzeit UND Jetzt <= Endzeit
  • Wenn Startzeit > Endzeit (Tagesübergang) dann Vergleich: Jetzt >= Startzeit ODER Jetzt <= Endzeit

DTL bringt hier keinen Vorteil. Wenn man die Datumswerte der beiden DTLs gleich lässt (nicht anfasst, eingibt) muss man die selbe Fallunterscheidung wie oben machen, ansonsten muss man die Datumswerte entsprechend so setzen dass bei Tagesübergang der DTL mit der Endzeit das höhere Datum hat...

Mit den reinen USINT-Anteilen der DTL könnte man sonst auch so vergleichen: Stunde * 100 + Minuten
Dann bekommt man für 17:30 z.B. den Wert 1730. Das kann man dann ebenfalls nach der selben Vorgehenweise wie oben (inkl. Fallunterscheidung) vergleichen.

Sonst kannst du in der Forumssuche hier auch noch nach "Zeitschaltuhjr" suchen. Da gibt's noch weitere Beispiele...
 
Schon die ersten Antworten, VIELEN DANK...

Also T_COMP hatte ich gefunden, auch probiert, läuft aber leider nur auf der 1500er, bei der 1200er wird gemeckert wenn ich den Baustein einfüge, weil diese Komponente in der Bibliothek nicht für diese Steuerungsreihe der 1200er vorgesehen ist :cry: im Optimalfall würde ich gerne Abwärts zur kleinen Steuerung kompatibel bleiben...

Also die Problematik mit dem Datumsübergang von 23:59 -> 00:00 ist ein Knackpunkt den ich genauso gelöst hatte wie beschrieben mit dem "kleiner als 24:00" und "größer als 00:00" das passt soweit.

Interessant ist die Lösung mit den reinen USINT-Anteilen der DTL "Stunde * 100 + Minuten" das wäre eine normale Rechenfunktion, die die 1200er auch kann...

Nach "Zeitschaltuhr" habe ich schon gesucht, oft wird aber lediglich das "Überschreiten" einer Zeitschwelle beschrieben, wenn ich eine Maschine erst um 09:05 einschalte, die letze Schwelle aber um 09:00 war, verpasse ich ein weitertakten der Schicht, bzw. ich muss eben warten bis die nächste Schwelle kommt...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also T_COMP hatte ich gefunden, auch probiert, läuft aber leider nur auf der 1500er,....

...im Optimalfall würde ich gerne Abwärts zur kleinen Steuerung kompatibel bleiben
Wie gesagt, die ganz normalen Vergleichsoperatoren aus "Einfache Anweisungen/Vergleicher" können bei 1200 und 1500 sowohl TOD als auch DTL vergleichen.
 
ganz blöde Rückfrage:

Also mit TOD meint Ihr schon "Time_Of_Day", oder? also wenn ich die "Vergleicher" aus meinen "Einfachen Anweisungen" verwende, finde ich kein DTL als mögliche Beschaltung... Also Time_Of_Day finde ich, dann müsste ich mal probieren, die DTL was ich mir mit "RD_LOC_T" aus der Steuerung ziehe in Time_Of_Day zu konvertieren dass ich eine gleiches Format habe. Wochentage etc sind aktuell kein Thema, es geht um die reine Uhrzeit...

Eventuell werden die Schichten dann am Wochenende 4/5/6 oder Schicht D/E/F... wäre ein Interessanter Ansatz...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
alles klar, läuft... :)

ich habe die Vergleicherbausteine in einem FB verwendet, da hatte ich die Einstellung Time_of_Day NICHT als Eingangsvariabe verwenden können... Da habe ich den Vergleicher mal im OB eingefügt, habe Time_of_Day beschaltet und dann den Vergleicher mit der Zwischenablage in den FB reinkopiert, seitdem habe ich Time_of_Day als Auswahl zur Verfügung! Muss man das verstehen???
 
Also die Problematik mit dem Datumsübergang von 23:59 -> 00:00 ist ein Knackpunkt den ich genauso gelöst hatte wie beschrieben mit dem "kleiner als 24:00" und "größer als 00:00" das passt soweit.
Der DatumsÜbergang von 23:59 -> 00:00 ist eigentlich kein KnackPunkt.
Aber "gelöst . . . mit dem '< 24:00' und '> 00:00' " ist der KnackPunkt schlechthin, denn jede Uhrzeit ist < 24:00 und alle Uhrzeiten ungleich 00:00 sind > 00:00. D.h. beide Abfragen liefern ein ziemlich nichts sagendes Ergebnis!
Nein, Du musst weder die Anfangszeit noch die Endzeit weder mit 00:00 noch mit 24:00 vergleichen, sondern die Anfangszeit und die Endzeit miteinander!
Solange die Schichten kürzer als 24h sind (!), bekommst Du dann ein Ergebnis, das Dir sagt, ob Anfangszeit und Endzeit sich auf denselben Tag beziehen oder auf zwei aufeinander folgende Tage.
Ich verstehe leider nicht, worin Dein eigentliches Problem besteht.
Ist es das, . . .
Code:
bAktiv := ((MIN(dAnf, dEnd) <= dAkt) UND (dAkt < MAX(dAnf, dEnd)))=(dAnf < dEnd)
wobei
dAnf : Anfangszeit
dEnd : Endzeit
dAkt : aktuelle Zeit
bAktiv : Status "aktuelle Zeit nach Anfangszeit UND aktuelle Zeit vor Endzeit"
. . . was Du benötigst?

Gruss, Heinileini

PS:
Sorry für die "AngstKlammern" - ich finde so liest es sich besser.
 
Zuletzt bearbeitet:
Hallo Heinileini,

also den Datumsübergang von 23:59->00:00 sehe ich schon als Knackpunkt, weil der Start UND das Ende einer Schicht ja jeweils ein Kriterium sind, in welcher Schicht man sich befindet! Bei der Schicht A und B ist das SCHICHTENDE am selben Tag UND betreffend der Uhrzeit SPÄTER. Bei der Schicht C, in meinem konkreten Fall die Nachtschicht, liegt das Ende uhrzeitmäßig VOR der Uhrzeit des Starts, sozusagen Start um 22:00:00 und das Ende 05:59:59 ... Daher brauche ich da einen separate Auswertung.

Die Bilder zeigen wie ich das gemacht habe...

Schicht_A.PNGSchicht_B.PNGSchicht_C.PNG

Ich wüsste jetzt keinen Fall wo das anders sein sollte... Wenn es der Fall sein sollte, dass 3 Schichten innerhalb eines Tages abgebildet sind, beginnend mit 00:00:00 in der Schicht A, dann müsste ich das separat auswerten und die Kriterien abändern.

Diese Lösung hat mir jetzt innerhalb des FB 12 Netzwerke gespart. Hätte ich auch gleich so machen können... ;)

Soweit vielen Dank allen!

Gruß Christian
 
So wie du den Vergleich oben mit TOD#23:59:59 eingeben hast würde die Sache auch nicht ganz hinhauen.
Der TOD ist in Millisekunden. Der Eintrag müsste schon TOD#23:59:59.999 sein, sonst würde deine Schaltung kurz vor Mitternach für ca. eine Sekunde nicht hinhauen.

Grundsätzlich zuerst eine Fallunterscheidung (Tagesübergang) machen und dann wie folgt vergleichen
  • Wenn Startzeit <= Endzeit dann Vergleich: Jetzt >= Startzeit UND Jetzt < Endzeit
  • Wenn Startzeit > Endzeit (Tagesübergang) dann Vergleich: Jetzt >= Startzeit ODER Jetzt < Endzeit
Um es nochmal zu wiederholen. Wenn du weißt dass die Tagschicht immer ohne Tagesübergang und die Nachschicht immer mit Tagesübergang ist, dann kannst du dir die Fallunterscheidung sparen und direkt den entsprechenden Weg nehmen (Siehe Larrys Post).
 
Zuletzt bearbeitet:
Oder man bastelt sich eine (in Worten: 1) Funktion mit den Eingängen:
1. Aktuelle Zeit
2. Anfangszeit der Schicht
3. Endzeit der Schicht,
die ermittelt, ob die aktuelle Zeit in dem durch Anfangs- und Endzeit spezifizierten Bereich liegt (siehe #10).
Allerdings: die Endzeit muss so angegeben werden, dass sie gerade nicht mehr in dem Bereich liegt, also z.B. '06:00:00' statt '05:59:59' - dann tritt das von Ronin genannte "SekundenKleberPhänomen" nicht auf.

Anhang anzeigen Schicht.xlsx.pdf

Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
naja... also Millisekunden.... Da ich die aktuelle Schicht mit MOVE am Ausgang anstelle, bleibt diese ja erhalten ;-) In dieser Sekunde trifft eben "kein Zustand genau zu" aber bis zum Start der nächsten Schicht wird da nichts passieren.
 
Zurück
Oben