Geht leider nicht: iWeekDay = 1 (Sonntag) für heute Dienstag den 01.11.2022.
Die Formel von Heinrich ist leider nicht korrekt.
Da habt ihr leider Recht, Harald und mista. Sorry vielstmals!
Ich hatte die Formel mit den TabellenBlattFunktionen von Excel getestet.
In Windows geginnt die Zählung mit dem 19
00-01-01 und in SCL mit dem 19
90-01-01. So weit, so schlecht.
Aber es gibt da noch einenweiteren feinen Unterschied, den ich leider übersehen hatte: in Windows beginnt die Zählung mit
1 für den 1900-01-01 und in SCL mit
0 für den 1990-01-01.
Code:
dDate := DATE_TO_DINT(D#2022-10-28) ;
iWeekDay := DINT_TO_INT((dDate + X) MOD 7) + Y ; // 1 (monday) .. 7 (sunday)
Die richtige Formel zu ermitteln bzw. auszuprobieren (sofern man SCL zur Verfügung hat) ist aber in der Tat simpel, Harald.
Habe hier meine Formel mit X und Y anstelle der "Anpass"-Konstanten geschrieben.
Y mit den Werten 0 oder 1 entscheidet allein darüber, ob die Zählung der WochenTage bei 0 beginnt oder bei 1.
X mit den Werten
0..6 schliesslich entscheidet darüber, mit welchem Wochentag die Zählung beginnt, also hiermit anpassen!
Anfangs mit AT Funktion auf das 7 Byte geschaut aber da der Wochentag 4LSB codiert ist und UW nicht in SCL Verfügbar ist wollte ich den Lösungsweg probieren
UW ist in SCL nicht verfügbar? WORD1 AND WORD2 bzw. DWORD1 AND DWORD2 funktioniert aber doch in SCL. Aber das sagte Harald ja schon.
WOW, ich wusste nicht, dass es so einfach sein kann^^
Einfach ist daran aber lediglich, dass man sich den MOD-Operator und zwei Additionen ersparen kann, wenn man die Umrechnung in den DatenTyp DATE_AND_TIME - mit welcher Funktion auch immer - dem "BetriebsSystem" überlässt.
Leider konnte ich meiner SCL-Dokumentation nicht entnehmen, ob und wenn ja, wie man verhältnismässig "schmerzlos" von den DatenTypen TIME und DATE zum DatenTyp DATE_AND_TIME bzw. umgekehrt gelangen kann. Die "druckbaren" Versionen der DatenTypen als Schnittstelle per Umwandlung in STRING zu nutzen, fänd ich naheliegend, aber dennoch recht umständlich.
Und mein grösstes Hindernis: nicht einmal die Konvertierungen in den DatenTyp STRING oder zurück kann ich finden.
Muss man das alles tatsächlich "zu Fuss" programmieren?
Der DatenTyp DATE_AND_TIME mit seinen BCD-Zahlen ist zwar schon recht nah am DatenTyp STRING, weil man pro Tetrade lediglich noch 30hex bzw. 48dez bzw. '0' addieren und pro (Zwischen-)Ergebnis je 1 Byte spendieren muss, aber das erfordert ja schon einiges an Aufwand. Auch die Umrechnungen DUAL <--> BCD bleiben einem bei mehr als einstelligen DezimalZahlen nicht erspart.
Daher erschien mir "meine" Variante mit MOD und 2 Additionen und dem Rückgriff auf den DatenTyp DATE als relativ einfach und "direkt".
PS:
Wie gelangt man denn nun in SCL an eine Umwandlung von DATE in DATE_AND_TIME bzw. umgekehrt?
Gibt's das etwas "Fertiges", das ich noch nicht entdecken konnte?
PPS:
Nicht einmal mit ...
Code:
dDate := DATE_TO_DINT(D#2022-10-28) ;
... komme ich klar.
Bedeutet das etwa, dass die Schreibweise D#2022-10-28 vom Compiler in die serielle Zahl umgewandelt wird und zur Laufzeit des Programms keine entsprechende Umwandlung zur Verfügung steht?
Warum finde ich in der SCL-Doku rein gar nichts zu diesem Thema, nicht einmal ein "beiläufig" erwähntes Beispiel?
Das wäre ja wohl ein nennenswertes Manko von SCL.