Datumsabhängige Variable

Ratoncito

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

nach längerer Abstinenz tauche ich mal wieder hier auf. Lange habe ich überlegt, ob ich mein banales Problem überhaupt hier posten soll.

Ich brauche eine VaribleX, die immer zwischen dem 15. August und 15. März den Wert "1" hat. Und dies unabhängig vom Jahr. Im ersten Moment hört es sich einfach an, aber bei der Umsetzung bin ich immer wieder gestolpert, oder habe mal wieder so dicke Bretter vor dem Kopf, dass ich den Wald vor lauter Bäumen nicht sehe.

Zuerst war mir der Jahreswechsel unangenehm im Weg. Kann man aber umgehen, wenn man den Zeitraum vom 15. März bis 15. August auswertet. Trotzdem komm ich auf keinen grünen Zweig.

Das sollte sich doch eigentlich mit ein paar Zeilen Code erledigen lassen.

Für Eure Hilfe im Voraus vielen Dank - Wolfgang

PS
Auch wenn es schon ein wenig spät ist, ich wünsche allen ein gesundes und friedliches Neues Jahr
 
Servus,
ich würde zuerst mal die Systemzeit auslesen. Dadurch erhältst du ja die Werte für Tag, Monat, Uhrzeit etc.
Anschließend kannst du dir einen Vergleich zusammenstellen.
Wenn die der (Tag >= 15. UND der Monat >= August) ODER (Tag <= 15. UND der Monat <= März) ist wird die Variable 1.
Ich hoffe das ist verständlich was ich meine :D




Update: Ah mein Fehler. Hab überlesen das du es für eine Wago Steuerung benötigst..
Da kann ich dir leider nur bedingt weiterhelfen
 

Anhänge

  • 1674132707712.png
    1674132707712.png
    131 KB · Aufrufe: 26
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ... ich würde einfach das Date aus der Systemzeit auslesen.
Nun schauen ob Date_akt größer ist als der 15. August desselben Jahres ODER Date_akt kleiner ist als der 15. März desselben Jahres.
Oder ...
Du schaust ob Date_akt zwischen den beiden genannten Datumswerten liegt und wenn es so ist dann gibt es als Rückgabewert eben kein TRUE ...
 
Hallo Wolfgang,
wie schon von den anderen beiden Nutzern genannt kann folgendes mit der WagoAppTime verwendet werden:
VAR
x: BOOL;
typlocaltime: WagoAppTime.WagoTypes.typWagoTimeComponents;
END_VAR

typlocaltime:=WagoAppTime.FuGetLocalTimeComponents();
IF (typlocaltime.uiDay>=15 AND typlocaltime.uiMonth>=8) OR (typlocaltime.uiDay<=15 AND typlocaltime.uiMonth<=3) THEN
x:=TRUE;
ELSE
x:=FALSE;
END_IF
 
Hallo Wolfgang,
rein zufällig hatte ich diese Woche eine ähnlich Anforderung.
Der Siemens Baustein "LGF_TimerSwitch" ist. Damit sollte es gehen. im Mode 4 (Jährliche Zeitschaltuhr.)
Wenn du den Baustein nicht findest, dann findest du ihn bei Siemens. Dort gibt es eine LGF Bibliothek.

Gruß André
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ... ich würde einfach das Date aus der Systemzeit auslesen.
Nun schauen ob Date_akt größer ist als der 15. August desselben Jahres ODER Date_akt kleiner ist als der 15. März desselben Jahres.
Oder ...
Du schaust ob Date_akt zwischen den beiden genannten Datumswerten liegt und wenn es so ist dann gibt es als Rückgabewert eben kein TRUE ...
Hallo Ralf,
mit "desselben Jahres" in Deiner 1. Variante bin ich einverstanden. In Deiner 2. Variante fehlt mir die Prüfung, ob mit einem Datum desselben Jahres verglichen wird.

Der TE schreibt zwar ...
... Und dies unabhängig vom Jahr. ...
Aber genau das macht die ganze Sache ja sehr abhängig von der JahresZahl, zumal einerseits die JahresZahl in den zu vergleichenden Werten steckt und andererseits in einem SchaltJahr die beiden "Datümer" 'Jahr-03-15' und 'Jahr-08-15', mit denen verglichen wird, 1 Tag später im Jahr liegen.
Inwiefern der Vergleich mit demselben Jahr für die Anwendung des TE ansonsten aber überhaupt relevant ist ... who knows. ;)

IF (typlocaltime.uiDay>=15 AND typlocaltime.uiMonth>=8) OR (typlocaltime.uiDay<=15 AND typlocaltime.uiMonth<=3) THEN
x:=TRUE;
ELSE
x:=FALSE;
END_IF
:unsure:
>>>===>
Code:
x := typlocaltime.uiMonth>8 OR typlocaltime.uiMonth=8 AND typlocaltime.uiDay>=15
  OR typlocaltime.uiMonth<3 OR typlocaltime.uiMonth=3 AND typlocaltime.uiDay<=15 ;
 
Hallo,

erst einmal vielen Dank für Eure Bemühungen.
ich wäre schon an der erstren Zeile gescheitert...

Dazu habe ich allerdings eine Frage:
IF (typlocaltime.uiDay>=15 AND typlocaltime.uiMonth>=8) OR (typlocaltime.uiDay<=15 AND typlocaltime.uiMonth<=3) THEN

Ich befürchte, dass auch in den Monaten >8 die Tage <15 nicht berücksichtigt werden. Oder liege ich da falsch?
Ist es tatsächlich so, dass der erste Teil ab dem 15.8. TRUE ist?

Ich werde es in den nächsten Tagen mal probieren.

@Andre1977
Für ein paar Zeilen Code extra einen Baustein verwenden erscheint mir ein wenig aufwändig. Trotzdem vielen Dank.

Zum selben Jahr:
Mir geht es darum, eine Variable von einem Datum bis zum nächsten Datum auf TRUE zu setzen, und das alle Jahre wieder.
Wie genannt zum Beispiel vom 15.August bis zum 15. März. Dabei viel mir auf, dass es eventuell mit dem Jahreswechsel Probleme geben könnte. Daher alternativ den Zeitraum vom 15.März bis zum 15August. Oder "Zwischen" Datum1 und Datum2.

Liebe Grüße - Wolfgang
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Wolfgang,
was das Beispiel von Wago angeht hast du recht - das war "etwas" zu "Quick-and-Dirty" ...
Ich hatte mit meinem Vorschlag allerdings tatsächlich auch mehr an die Siemens-Welt gedacht (das mit Wago hatte ich gar nicht realisiert).
Ich weiß nun nicht ob Wago den Datentyp Date kennt - das wäre im Hintergrund eine Ganzzahl und hier wäre vom Wert her der 01.09.xx größer als der 15.08.xx
Auf der anderen Seite kannst du dir in Anlehnung an das Wago-Beispiel genau diesen Hilfswert ja generieren.
Hier mal mein Quick-and-Dirty-Vorschlag dazu :
typlocaltime:=WagoAppTime.FuGetLocalTimeComponents();
myDate = (typlocaltime.uiDay * 100) + typlocaltime.uiMonth ;
IF (myDate >= 1508) OR myDate<=1503) then ...
 
Hallo,

@Larry Laffer
das beruhigt mich, daran bin ich sofort bei den ersten Gedanken für eine Lösung verzweifelt. Und mit dem Rest zum Zeitformat wäre ich auch gescheitert.

Deinen Code werde ich probieren, melde mich dann mit dem Ergebnis.

Vielen Dank - Wolfgang
 
Hallo,

erst einmal vielen Dank für Eure Bemühungen.
ich wäre schon an der erstren Zeile gescheitert...

Dazu habe ich allerdings eine Frage:


Ich befürchte, dass auch in den Monaten >8 die Tage <15 nicht berücksichtigt werden. Oder liege ich da falsch?
Ist es tatsächlich so, dass der erste Teil ab dem 15.8. TRUE ist?
Ja, das ist richtig, aber #6 zeigt aber schon den richtigen Code ganz unten.
Die Monate dazwischen einfach pauschal freigeben. Du musst nur im August und März auf die Tage schauen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich befürchte, dass auch in den Monaten >8 die Tage <15 nicht berücksichtigt werden.
Das sehe ich genauso wie Du.
Zusätzlich und analog dazu befürchte ich, dass in den Monaten <3 die Tage >15 "durchflutschen".
Die Abfragen Tag < 15 bzw. Tag >15 sind nur in Monat = 3 bzw. Monat = 8 sinnvoll/zielführend.
Bei Monat < 3 und bei Monat > 8 darf kein zusätzlicher Vergleich mit Tag wirksam sein.

Aus diesem Grunde hatte ich ...
x := typlocaltime.uiMonth>8 OR typlocaltime.uiMonth=8 AND typlocaltime.uiDay>=15
OR typlocaltime.uiMonth<3 OR typlocaltime.uiMonth=3 AND typlocaltime.uiDay<=15 ;
... geschrieben.

ich versteh deinen Einwand hier leider nicht ... sorry ...
Du schaust ob Date_akt zwischen den beiden genannten Datumswerten liegt und wenn es so ist dann gibt es als Rückgabewert eben kein TRUE ...
Du meinst vermutlich, wenn die beiden genannten Datumswerte im selben Jahr liegen und Date_akt zwischen diesen beiden Werten, dann liegen alle drei Werte sowieso im selben Jahr? Da hast Du Recht, Ralf.
 
Hallo liebe Community,
ich bin da schon eine Weile raus, habe das aber schon, sowohl mit Step7 als auch CodeSys gelöst.
Macht mich gern auf Fehler aufmerksam.

Ich habe das Einschaltdatum, das Aussschaltdatum und das aktuelle Datum jeweils zerlegt in Monat und Tag als INT, dann jeweils Monat*100mit Tag Addiert. (Umwandlung mit CodeSys mittels DT_TO_DATE und FuDay bzw. FuMonth).
Fallunterscheidung:
1. Einschaltdatum kleiner Ausschaltdatum: Ein, wenn Einschaltdatum>=Aktualdatum<=Ausschaltdatum
2. Ausschaltdatum kleiner Einschaltdatum (Jahresgrenze wird überschritten: Ein, wenn ((Einschaltdatum>=Aktualdatum<=31.12.) ODER (Aktualdatum <=Ausschaltdatum)
3. Einschaltdatum=Ausschaltdatum: EIN

Für die Fallunterscheidung lässt sich z.B. in FUP eine Kaskade aus SEL-Blöcken verwenden.

Ich habe, mangels fertigem Projekt mal nur ein Muster zur Umwandlung eines Datums beigefügt.
Entsprechend würde das auch als Tagesschaltuhr mit den entsprechenden Variablen aus Stunde und Minute funktionieren.

Ich hoffe, das trägt zur Lösung bei. Bin gespannt auf weitere Vorschläge.
 

Anhänge

  • Datumsmuster.JPG
    Datumsmuster.JPG
    34,8 KB · Aufrufe: 10
Mir geht es darum, eine Variable von einem Datum bis zum nächsten Datum auf TRUE zu setzen, und das alle Jahre wieder.
Zu kompliziert oder falsch formuliert. Du meinst eigentlich: Das Ergebnis soll TRUE sein, wenn das Datum zwischen 2 Grenz-Daten liegt.

Wie genannt zum Beispiel vom 15.August bis zum 15. März. Dabei viel mir auf, dass es eventuell mit dem Jahreswechsel Probleme geben könnte. Daher alternativ den Zeitraum vom 15.März bis zum 15August. Oder "Zwischen" Datum1 und Datum2.
Mit Siemens DATE_AND_TIME läßt sich das leicht/direkt realisieren. Sinngemäß auf Wago/ST würde ich das so formulieren:
Code:
typlocaltime:=WagoAppTime.FuGetLocalTimeComponents();

CurrDate := typlocaltime.uiMonth * 100 + typlocaltime.uiDay;
VariableX := CurrDate >= 0815 OR CurrDate <= 0315;

//alternativ: VariableX := NOT(CurrDate >= 0315 AND CurrDate <= 0815);

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich weiß nun nicht ob Wago den Datentyp Date kennt - das wäre im Hintergrund eine Ganzzahl und hier wäre vom Wert her der 01.09.xx größer als der 15.08.xx
Auf der anderen Seite kannst du dir in Anlehnung an das Wago-Beispiel genau diesen Hilfswert ja generieren.
Hier mal mein Quick-and-Dirty-Vorschlag dazu :
typlocaltime:=WagoAppTime.FuGetLocalTimeComponents();
myDate = (typlocaltime.uiDay * 100) + typlocaltime.uiMonth ;
IF (myDate >= 1508) OR myDate<=1503) then ...
Auch ein Bisschen zu quick und zu dirty. Monat mal 100 statt Tag mal 100.
myDate = (typlocaltime.uiMonth * 100) + typlocaltime.uiDay ;
IF (myDate >= 0815) OR myDate<=0315) then ...
Harald war schneller.

Edit:
Dieses Format mit dem Monat mal 100 taugt zwar nicht, um mit Tagen zu rechnen, aber zum Vergleichen ist es sogar schöner als die fortlaufende Numerierung der Tage. Der SchaltTag stört nämlich gar nicht bzw. durch ihn verschieben sich die folgenden Tage nicht.
 
Zuletzt bearbeitet:
Hallo,

vielen Dank für Eure Hilfe.

Code:
  typlocaltime:=WagoAppTime.FuGetLocalTimeComponents();
 myDate:= typlocaltime.uiMonth *100 + typlocaltime.uiDay;
IF myDate <= 0315 OR myDate>=0815 THEN                                            // Winter vom 15.08. bis 15.03.
    Winter :=TRUE;
    ELSE
    Winter :=FALSE;
END_IF

Immer wieder schön zu sehen, wie einfach manches wird, wenn man ein wenig um die Ecke denkt. :)
Über den Vergleich ist das Problem elegant gelöst. Da habe ich schon eine ganze Weile darüber gegrübelt.
Und die beiden ersten Zeilen hätte ich auch nicht hinbekommen.

Nochmals vielen Dank.

Ach ja, noch eine Anmerkung. Dass ich jetzt bestimmen kann wann Winter ist, habt ihr sicherlich schon gemerkt. Es ist kälter geworden. :)

Liebe Grüße - Wolfgang
 
Zuviel Werbung?
-> Hier kostenlos registrieren
IF myDate <= 0315 OR myDate>=0815 THEN // Winter vom 15.08. bis 15.03.

Ach ja, noch eine Anmerkung. Dass ich jetzt bestimmen kann wann Winter ist, habt ihr sicherlich schon gemerkt. Es ist kälter geworden. :)
Aaach sooo, darum geht es! ;)
Deine WinterErmittlung mit 2 festen Daten gefällt mir im Prinzip besser als die im Kfz-Bereich nicht totzukriegende "O-bis-O-Regel" (Oktober bis Ostern bezüglich WinterReifen).
Den Beginn oder das Ende einer "JahresZeit" an einem recht willkürlichen variablen Datum (Ostern) festzumachen, finde ich ziemlich abenteuerlich, zumal kein ausreichend verlässlicher Zusammenhang zwischen Datum und Wetter bzw. Temperatur besteht.
Aus reiner Neugier: wofür musst Du bzw. Dein Programm wissen, ob Winter oder "UnWinter"?
 
Ach ja, noch eine Anmerkung. Dass ich jetzt bestimmen kann wann Winter ist, habt ihr sicherlich schon gemerkt. Es ist kälter geworden. :)

Nach den Abenteuern der letzten beiden Jahre mit 14-tägiger geschlossener Schneedecke im Februar gefolgt von einer Woche 20 °C im Januar würde ich doch eher eine Temperaturmessung vornehmen, wenn es um "Winter" geht. Stichwort: Außentemperaturfühler. ;)
 
Hallo,
Aus reiner Neugier: wofür musst Du bzw. Dein Programm wissen, ob Winter oder "UnWinter"?
Immer diese Neugier :)
Wie immer ganz banal, wegen meiner Göttergattin.
Bei Sonnenschein werden nach den Vorgaben der höchsten Instanz dieses Anwesens an den Fenstern, wo die Sonne hereinscheint, Rolläden geschlossen. Und dies in Abhängigkeit von unterschiedlichen Uhrzeiten und ob wir daheim sind oder nicht. Nun habe ich die Anweisung erhalten, dass die Rolläden an einigen Fenstern in den Wintermonaten nicht geschlossen werden sollen...
Nun ja, dafür brauchte ich die Variable "Winter". Man hat ja sonst nichts zu tun.

@sps_21
Es geht eher um Jahreszeit, Sonnenstand und -intensität als um reale Temperaturen.

Und die "O-bis-O-Regel" finde ich als Gedankenstütze für die Winterreifen ganz hilfreich.

Ich bedanke mich nochmal für die tatkräftige Unterstützung und wünsche allen noch einen schönen Sonntag - Wolfgang
 
Zurück
Oben