Festellen ob gerade oder ungerade Kalenderwoche

Kiter11

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


ich benutze bereits die Kalenderfunktion. Ich bekomme auch die aktuelle Arbeitwoche angezeigt.
Ich möchte aber nun einfach feststelen ob es eine gerade oder ungerade Kalenderwoche ist.
Mir fehlt derzeit die Erfahrung mit der Programmierung von codesys und würde mich freuen wenn mir jmd helfen könnte.
 
Hallo und danke für eure antworten.

Ich kenne noch aus Schulzeiten die Funktion /2 .... wen Rest > 0 dann ....
Ich habe mit codesys aber bisher nur FUP gemacht und mir fehlt die syntax...

Ich weiß also a nicht was KW AND 1 = 1 bedeutet und b wo und wie ich das in mein codesys Projekt bekomme :confused:
 
Ich weiß also a nicht was KW AND 1 = 1 bedeutet und b wo und wie ich das in mein codesys Projekt bekomme :confused:
Ach, das ist kein großes Problem, das kann man leicht im Codesys-Handbuch und in der Codesys-Hilfe nachlesen. :D


Mit AND kann man Werte bitweise UND-Verknüpfen. Bei allen ungeraden Zahlen ist das niederwertigste Bit 1, bei allen geraden Zahlen ist es 0. Diese Eigenschaft kann man ausnutzen und das niederwertigste Bit abfragen, indem man den Wert mit der Zahl 1 UND-verknüpft (ausmaskiert) und schaut, ob das Ergebnis 1 oder 0 ist. Oder einfacher: gleich oder ungleich 0 ist. Außerdem kann man das Bit sogar direkt abfragen (Slice).
Code:
//ausführliches Schul-Mathe
Woche_ist_ungerade := (Woche AND 1) = 1 ;

//oder mit implizitem Vergleich auf <>0 :
Woche_ist_ungerade := Woche AND 1 ;

//oder das niederwertigste Bit direkt abfragen: (was der Compiler vermutlich wie Variante 2 löst)
Woche_ist_ungerade := Woche.x0 ;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Von der Kompatibilität der Datentypen und der Logik her, ist MOD allerdings vorzuziehen. Dann passen die Datentypen schon zusammen, da die Woche üblicherweise ein Werttyp wie Integer ist, und kein Wort oder Doppelwort.
Außerdem muss ich mir bei Modulo keine Gedanken um die binäre Repräsentation eines Integers im Speicher zu machen.
 
Das ist alles richtig, jedoch:
  • Codesys erlaubt den Zugriff auf einzelne Bits von Ganzzahl-Variablen. Da gibt es kein Datentyp-Problem. Doch gut, es könnte ja Compiler geben, welche in der Grundeinstellung den Bitzugriff auf INT (korrekterweise) abweisen.
  • Es schadet nichts, wenn man den Aufbau von Datentypen kennt. Und es ist eher unwahrscheinlich, daß sich irgendwann die binäre Repräsentation eines Integers ändert - die ist schon mehr als 100 Jahre so.
  • Zusätzlich behaupte ich mal, daß bei den meisten bestehenden Computerprogrammen das gerade/ungerade-Problem durch Abfrage des niederwertigsten Bits gelöst ist. Das funktioniert in jeder Programmiersprache.

Wenn man sich für MOD zur Prüfung entscheidet, dann sollte man allerdings wissen, daß man das Ergebnis eines "MOD 2" nicht auf "gleich 1" sondern nur auf "gleich/ungleich 0" prüfen sollte, weil die Funktion 3 Ergebnisse haben kann: 0, 1 und -1. Ein "ungerade := (KW MOD 2) = 1 ;" ist unvollständig.

Mit MOD müßte man also korrekterweise so prüfen:
Code:
Woche_ist_gerade   := (Woche MOD 2) = 0 ;
Woche_ist_ungerade := (Woche MOD 2) <> 0 ;

//oder
Woche_ist_gerade   := (Woche MOD 2) = 0 ;
Woche_ist_ungerade := NOT Woche_ist_gerade ;

Harald
 
Zurück
Oben