TIA Schalten zwischen 2 Uhrzeiten

--alex--

Level-2
Beiträge
107
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich muss ab einer bestimmten Uhrzeit (Stunde, Minute) ein Bit setzen und ab einer 2ten Uhrzeit das Bit wieder zurücksetzen.
Dazu habe ich einfach die Stunden und Minuten der CPU mit den Sollwerten aus einem DB verglichen und das Bit gesetzt bzw. wieder rückgesetzt.
Jetzt kommen aber zusätzlich Einschaltbedingungen dazu und da stehe ich jetzt ein wenig an.
Der Vergleich (Stunden, Minuten) funktioniert jetzt so nicht mehr.
Steht die Einschaltbedingung nicht exakt zu diesem Zeitpunkt an wird das Bit auch nicht gesetzt.
Steht die Einschaltbedingung zB. 1 Minute nach der definierten Zeit an wird das Bit auch nicht mehr gesetzt.
Gibt es eine Möglichkeit zu prüfen ob die CPU Zeit zwischen zwei Zeitpunkten (Stunde, Minute) ist?
Das müsste auch funktionieren wenn die Einschaltzeit zB.: 22:45 Uhr ist und die Ausschaltzeit 04:25 Uhr am nächsten Tag ist.

Danke
Alex
 
Geht relativ einfach wenn du in Tagesminuten rechnest. Geht auch ganz gut in KOP/FUP:

Code:
akt := stunde * 60 + minute;
ein := ein_stunde * 60 + ein_minute;
aus := aus_stunde * 60 + aus_minute;

if (aus > ein) then
 sp := akt >= ein AND akt < aus;
elsif (aus < ein) then
 sp := akt >= ein OR akt < aus;
else
 sp := false;
end_if;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Geht dank DeMorgan und der "bedingten Negation" namens XOR auch als "WenigerZeiler" ohne IF:
Code:
akt := stunde * 60 + minute ;
ein := ein_stunde * 60 + ein_minute ;
aus := aus_stunde * 60 + aus_minute ;

inv := aus < ein ;
sp  := inv XOR ((inv XOR (akt >= ein)) AND (inv XOR (akt < aus))) ;
Ich weiss schon: das kann keiner lesen, geschweige denn verstehen. ;)

Für beide Varianten gilt übrigens: maximale EinschaltDauer = 23:59:00.
Wenn es aber unbedingt 23:59:59 sein müssen: die Sekunden noch mit dazu nehmen und in den ersten drei Zeilen sinngemäss
stunde * 3600 + minute * 60 + sekunde
rechnen. Achtung: INT oder UINT genügen nicht -> DINT!

Das müsste auch funktionieren wenn die Einschaltzeit zB.: 22:45 Uhr ist und die Ausschaltzeit 04:25 Uhr am nächsten Tag ist.
Grosses Lob, Alex, dass Du auch an diesen Fall gedacht hast (wird leider gerne mal vergessen)!

Ja, Thomas und ich haben auch daran gedacht:
Ist EinschaltZeit < AusschaltZeit (d.h. "ein" und "aus" erfolgen am selben Tag), dann müssen die beiden Vergleiche akt>=ein und akt<aus per UND verknüpft werden.
Ist EinschaltZeit > AusschaltZeit (d.h. "aus" erfolgt erst am nächsten Tag), dann müssen die beiden Vergleiche akt>=ein und akt<aus per ODER verknüpft werden.
Ist EinschaltZeit = AusschaltZeit, dann soll nicht eingeschaltet werden, nicht für den kleinsten Moment.
An den letzten Fall habe ich übrigens auch gedacht: ist ein=aus, dann kann akt>=ein nicht gleichzeitig mit akt<aus TRUE werden.
In Thomas' Version ist es offensichtlich, dass er diesen Fall auch berücksichtigt hat.
 
Zuletzt bearbeitet:
Wenn die Schaltpunkte auch mehr als 24h auseinander liegen können (sollen), kann man z.B. auch die zeitlichen Differenzen von Ein- und Ausschaltpunkt zum aktuellem Zeitpunkt bestimmen:

Code:
#Diff.On  := T_DIFF(IN1 := #Now, IN2 := #SP.On);
#Diff.Off := T_DIFF(IN1 := #Now, IN2 := #SP.Off);

#SP.Out := #Diff.On >= 0 AND #Diff.Off < 0;

PS:
@--alex--,
da TIA als Prefix dieses Threads gewählt wurde, gehe ich mal von einer S7-1x00 aus?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die Schaltpunkte auch mehr als 24h auseinander liegen können (sollen), kann man z.B. auch die zeitlichen Differenzen von Ein- und Ausschaltpunkt zum aktuellem Zeitpunkt bestimmen:
Gar nicht mal so unraffiniert, Mario! Aber das ist man ja von Dir gewohnnt. ;)

Aber ich füge hier mal der Vollständigkeit halber hinzu:

Wenn die Begrenzung auf "knapp" 24 h EinschaltDauer akzeptabel ist, ist das Kriterium, ob die AusschaltZeit grösser ist als die EinschaltZeit - oder nicht - sooo einfach und auch einem Bediener relativ problemlos zu vermitteln. Die eingebenen Zeiten können täglich ausgewertet werden.

Wenn die Begrenzung auf "knapp" 24 h EinschaltDauer nicht akzeptabel ist, dann muss man bei der aktuellen, der Einschalt- und der AusschaltZeit noch Aufwand investieren und das Datum hinzufügen, damit die DifferenzBildung auch so funktioniert, wie geplant.
Die Eingabe wird aufwändiger/unübersichtlicher und die eingegeben "Datümer"+UhrZeiten sind nicht für tägliches Ein- und Ausschalten zu bestimmten UhrZeiten zu gebrauchen. Es müsste noch getrickst werden und da lauern dann die nächsten Fallen. Je nach Lösungsweg z.B. beim JahresWechsel.
 
Eventuell kann auch die LGF Bibliothek verwendet werden. Dort gibt es die Funktion LGF_TimerSwitch (Zeitschaltuhr für Tag, Woche, Monat,...).
Ist natürlich ein Overhead zu den anderen Lösungen.
 
Zurück
Oben