TIA SCl Baustein

Siegfried

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, könnt ihr mir helfen -
ich suche einen Baustein ,der mir aus dem Datum die Anzahl der Tage des Monats signalisiert INT.

Z.B. 2022-01-05 31Tage
2022-06-25 30 Tage


Danke im voraus für die Unterstützung

mfG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schonmal die Frage vorweg: Müssen Schaltjahre berücksichtigt werden? Ansonsten ließe sich das ja relativ einfach statisch mit einem Switch Case lösen

Was für eine Steuerung hast du denn?

EDIT: zu spät
 
Differenz bilden:
Fragliches Jahr, fraglicher Monat + 1, Tag1
abzüglich
Fraglichem Jahr, fraglichem Monat, Tag 1

In VBA wird der Überlauf des Jahres bei fraglichem Monat = Dezember richtig und ohne FehlerMeldung berücksichtigt.
Ob dies auch in SCL so ist, weiss ich leider nicht.
 
Differenz bilden:
Fragliches Jahr, fraglicher Monat + 1, Tag1
abzüglich
Fraglichem Jahr, fraglichem Monat, Tag 1

In VBA wird der Überlauf des Jahres bei fraglichem Monat = Dezember richtig und ohne FehlerMeldung berücksichtigt.
Ob dies auch in SCL so ist, weiss ich leider nicht.
Die S7-1200 korrigiert es bei DTL_TO_DATE anscheinend nicht:
1642784528673.png


Dein Vorschlag sieht dann als Code in etwa so aus:
Code:
#Date.YEAR  := #year;
#Date.MONTH := #month;
#Date.DAY   := 1;
#Start      := DTL_TO_DATE(#Date);

#Date.MONTH := #Date.MONTH + 1;
IF #Date.MONTH > 12 THEN
    #Date.MONTH := #Date.MONTH - 12;
    #Date.YEAR  := #Date.YEAR + 1;
END_IF;
#End        := DTL_TO_DATE(#Date);

#days       := T_DIFF_INT(IN1 := #End, IN2 := #Start);

1642782501916.png

1642783966890.png

PS:
Plausibilitätsabfrage für Monat/Jahr hab' ich vorerst rausgelassen.
Da gibt's ja meist unterschiedliche Vorstellungen, über das Vorgehen im Fehlerfall.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, Mario!
Das sieht sehr vielversprechend aus. Irgendwie umständlich zwar, aber aufgrund des Ansatzes, nicht durch Deine Umsetzung.

Bei dem angegebenen WerteBereich von
D#1990-01-01 bis D#2168-12-31
(das sind laut Excel 65379 Tage) habe ich noch die kleine Hoffnung, dass SCL bei dem MiniÜberlauf von nur 1 Tag in das Jahr 2169 grosszügig noch mitspielt und nicht ausflippt.

Falls SCL nicht so gnädig ist, könnte man auch leicht "around" den MiniÜberlauf "worken", ohne die Komplexität zu erhöhen:
Code:
...
IF #Date.MONTH = 12 THEN
    #Days := 31 ;
ELSE
    #Date.MONTH := #Date.MONTH + 1 ;   
    #End  := DTL_TO_DATE(#Date);
    #Days := T_DIFF_INT(IN1 := #End, In2 := #Start);
END_IF ;
 
Zuletzt bearbeitet:
Also die Berechnung eines Schaltjahres zu Fuß dürfte vermutlich nur ein hundertstel des Rechenaufwands von obigem Code darstellen (zumindest was da im Hintergrund bei T_DIFF so abläuft). Dreimal Modulo sollten ausreichen, solange man hier nicht astronomische Berechnungen tausende Jahre in die Vergangenheit oder Zukunft vornehmen möchte.
 
Also die Berechnung eines Schaltjahres zu Fuß dürfte vermutlich nur ein hundertstel des Rechenaufwands von obigem Code darstellen
Die Berechnung ist erst mal ganz einfach:
- Jahr durch vier teilbar -> Schaltjahr
- Ausnahme-> volles Jahrhundert
- Ausnahme von der Ausnahme: Jahrhundert durch 4 teilbar -> doch wieder Schaltjahr

einfach gesagt: 2100, 2200, 2300 fällt das Schaltjahr aus, 2400 findet es wieder statt.

Jetzt könnte man auf die Idee kommen, dass bis 2100 noch so lange hin ist, aber wenn ich mir aktuelle Beiträge anschaue, wird immer noch von S5 eins zu eins migriert, es ist also zu befürchten, dass 2100 in so manchem Code falsch behandelt wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also einfach so:
Code:
CASE  #Month OF
2:
      IF    #Year MOD  4 <> 0 THEN
            #Days := 28 ;
      ELSIF #Year MOD 400 = 0 THEN
            #Days := 29 ;
      ELSIF #Year MOD 100 = 0 THEN
            #Days := 28 ;
      ELSE
            #Days := 29 ;
      END_IF ;
4, 6, 9, 11:    
      #Days := 30 ;
ELSE:
      #Days := 31 ;
END_CASE ;

Die Berechnung ist erst mal ganz einfach:
Aber sicher doch.

Also die Berechnung eines Schaltjahres zu Fuß dürfte vermutlich nur ein hundertstel des Rechenaufwands von obigem Code darstellen
...
Dreimal Modulo sollten ausreichen, solange man hier nicht astronomische Berechnungen tausende Jahre in die Vergangenheit oder Zukunft vornehmen möchte.
Eigentlich wollte ich doch nur ein Beispiel dafür geben, dass man das "KnowHow", das in "fertigen Funktionen" steckt, herauskitzeln bzw. sich damit behelfen kann, ohne sich um die Internas dieser Funktionen kümmern zu müssen.
Die Betrachtung, ob diese fertigen Funktionen intern so gestaltet sind, dass sie den hundertfachen oder vielleicht nur zehnfachen Rechenaufwand beinhalten, habe ich dabei allerdings aussen vor gelassen, zumal sich dies meiner genauen Kenntnis entzieht und von mir nicht beeinflusst wird. Natürlich kann dies dazu führen, dass man mit Spatzen auf Kanonen schiesst.

Was Deine "atronomischen Berechnungen tausende Jahre in die Vergangenheit oder Zukunft" betrifft, dürften für solche Betrachtungen die mehr oder weniger gängigen KalenderSysteme (gregorianisch, julianisch, ...) ohnehin irrelevant sein.
Die Erdumdrehung ist nicht über ein Getriebe an die Erdumlaufbahn gekoppelt und die KalenderSysteme sind lediglich um einen Kompromiss aus möglichst einfacher Berechenbarkeit bei möglichst hoher Genauigkeit bemüht, für die Benutzung durch viele (aber nicht endlos viele) Generationen gut geeignet.
 
Zuletzt bearbeitet:
@Heinileini:
Die Ausnahmen in der IF/THEN sollten ganz zu Anfang stehen, oder für die Ausnahmen noch mal ein IF/THEN anfügen. So wirkt immer die geteilt durch vier Regel.

Ich bin sonst auch dafür immer getestete Funktionen zu verwenden anstelle selber zu schreiben. Aber hier beschränkt sich das ja nicht nur auf das Aufrufen einer anderen Funktion, sondern um diverse Konvertierungen und Anpassungen vorher, sodass man das auch gleich alles selber machen kann. Weil die Regel für die Schaltjahre eben nicht sonderlich komplex ist.
 
Die Ausnahmen in der IF/THEN sollten ganz zu Anfang stehen, oder für die Ausnahmen noch mal ein IF/THEN anfügen. So wirkt immer die geteilt durch vier Regel.
Ganz genau. In meinem Vorschlag steht zuerst die Ausnahme, dass alle nicht durch 4 teilbaren JahresZahlen direkt aussortiert werden und somit 75% der Zahlen die folgenden ModuloPrüfungen gar nicht erst über sich ergehen lassen müssen. ;)
 
Zurück
Oben