... um vier bis fünf weitere ein und ausschaltzeiten der tageszeitschaltuhr zu bekommen?
Mit TAGESZEITschaltuhr ist doch gemeint, dass nur die Tageszeit zählt, egal zu welchem Datum? Und vermutlich soll es auch möglich sein, erst zu der angegeben Zeit am folgenden Tag auszuschalten (z.B. EIN um 21:00 und AUS um 03:00)? Und EinschaltDauern von maximal 23h59m[59s] sollten ausreichen?
Ich würde dafür keinen FB machen, sondern einen FC mit den Eingängen EinschaltZeit, AusschaltZeit und aktuelleTageszeit. Das Ergebnis des FC wäre die BOOLesche Information, ob EIN bzw. AUS.
Den FC kannst Du für beliebig viele Ein-/AusschaltZeitenPaare aufrufen, ohne Dich um (Multi-)Instanzen kümmern zu müssen.
Dieser FC enthält allerdings 3 ZeitVergleiche:
Code:
bInv := iEinschaltZeit > iAusschaltZeit ;
bEin := iAktuelleTageszeit >= iEinschaltZeit ;
bNichtAus := iAktuelleTageszeit < iAusschaltZeit ;
obErgebnis := bInv XOR ((bInv XOR bEin) AND (bInv XOR bNichtAus)) ;
Ich würde möglichst nicht den DatenTyp DT (DATE_AND_TIME) verwenden, sondern viel lieber TOD (TIME_OF_DAY), der kein Datum enthält, das man noch "unschädlich machen" müsste.
Hinweise zum Verständnis der Vergleichereien und "XORgien":
Wenn EinschaltZeit < AusschaltZeit ist, dann gilt Ergebnis := (aktuelleTageszeit >= EinschaltZeit)
AND (aktuelleTageszeit < AusschaltZeit) ;
aber,
wenn EinschaltZeit > AusschaltZeit ist, dann gilt Ergebnis := (aktuelleTageszeit >= EinschaltZeit)
OR (aktuelleTageszeit < AusschaltZeit) ;
Diese FallUnterscheidung kann man mit IF ... Then ... Else ... erschlagen. Muss man aber nicht, man kann stattdessen auch das If-Then-Else-Konstrukt erschlagen und DeMorgan bemühen, kombiniert mit einer Nutzung der XOR-Verknüpfung als bedingte Negation.
DeMorgan:
- negiert/invertiert man an einer UND-Verknüpfung alle Eingänge und den Ausgang, so verhält sie sich wie eine ODER-Verknüpfung
bzw. (der Vollständigkeit halber)
- negiert/invertiert man an einer ODER-Verknüpfung alle Eingänge und den Ausgang, so verhält sie sich wie eine UND-Verknüpfung
also x OR y = NOT(NOT x AND NOT y).
XOR als bedingte Negation:
x XOR FALSE = x
bzw.
x XOR TRUE = NOT x
bzw.
x XOR y = x, wenn y = FALSE und x XOR y = NOT x, wenn y = TRUE.