# Logische Verknüpfungen einfach u. logisch programmieren



## good_mike (1 Mai 2011)

Hallo,

im Zusammenhang mit einer Rollosteurung möchte ich eine Logik programmieren welche für unterschiedliche Tage ein entsprechendes Verhalten aufweist.... Aber das nur am Rande.

Prinzipiel funktioniert meine Logik. Die Frage ist nur: Macht man das so oder kann man das irgendwie einfacher / logischer machen:

```
bAuf:=
(Kalender.WEEKDAY>=1 AND Kalender.WEEKDAY<=5 AND kalender.HOLIDAY=FALSE AND Urlaub=FALSE AND Ferien=FALSE AND kalender.LTOD=TODWerktag_AUF) OR
(Kalender.WEEKDAY=6 AND Kalender.HOLIDAY=FALSE AND  Urlaub=FALSE AND Ferien=FALSE AND Kalender.LTOD=TODSamstag_AUF) OR
((Kalender.WEEKDAY=7 OR Kalender.HOLIDAY=TRUE) AND  Urlaub=FALSE AND Ferien=FALSE AND Kalender.LTOD=TODSonnFeiertag_AUF) OR
(Urlaub=TRUE AND Ferien=FALSE AND Kalender.LTOD=TODUrlaub_AUF) OR
(Urlaub=FALSE AND Ferien=TRUE AND Kalender.LTOD=TODFerien_AUF);
```
 
Danke und Gruß

good_mike


----------



## Sockenralf (1 Mai 2011)

Hallo,

spontaner Einfall:

die Abfrage nach dem Arbeitstag würe ich in einem eigenen Merker "Arbeitstag" machen --> Wochenende entsprechend
==> macht´s schon ein wenig übersichtlicher


MfG


----------



## Tommi (1 Mai 2011)

good_mike schrieb:


> Prinzipiel funktioniert meine Logik.


 
Zwischenmerker und Kommentare (* xxx *)  wären hilfreich für 
andere, es zu verstehen! :-D

Gruß
Tommi


----------



## StructuredTrash (2 Mai 2011)

Machen kann man das auf jeden Fall so, aber ST ist zur Darstellung umfangreicher kombinatorischer Logik nicht so gut geeignet. So etwas erscheint in FUP übersichtlicher.
In ST würde ich einen anderen Ansatz verfolgen. Zur Unterscheidung der Werte von numerischen Variablen bietet sich "CASE OF" an. Eine numerische Variable hast Du ja bereits mit "Kalender.WEEKDAY", eine weitere könntest Du verwenden, wenn Du statt der booleschen Variablen "Ferien" und "Urlaub" eine Enumeration mit den Werten "Arbeit,Ferien,Urlaub" nimmst.
Dann könnte das Programm etwa so aussehen: 

```
CASE Zeitraum OF
   Arbeit:
      IF Kalender.HOLIDAY
      THEN
         bAuf:=TODSonnFeiertag_Auf;
      ELSE
         CASE Kalender.WEEKDAY OF
            1..5:   bAuf:=TODWerktag_Auf;
            6:       bAuf:=TODSamstag_Auf;
            7:       bAuf:=TODSonnFeiertag_Auf;
         END_CASE;
      END_IF;
   Ferien:
      bAuf:=TODFerien_Auf;
   Urlaub:
      bAuf:=TODUrlaub_Auf;
   ELSE
      bAuf:=False;
END_CASE;
```


----------



## good_mike (4 Mai 2011)

*Danke*

So etwas habe ich gesucht. Ich werde mich in den nächsten Tagen mal damit auseinander setzen. Mit ENUM habe ich noch keine Erfahrung.

good_mike


----------

