# Hilfe bei Funktionsoptimierung IF ELSEIF ELSE



## KingHelmer (24 Mai 2012)

Hi leute,

ich habe ein Problem, welches mein Programm überquellen lässt.

Ich kann mir vorstellen, dass es für mein problem eine "relativ einfache" Lösung gibt.

Momentan ist dies hier ein Auszug aus meinem Programm, in welchem ich einem Analogwert (AnalVal1) verschiedene, einstellbare Szenenwerte zuweisen will:


```
(*Licht einschalten  *)
IF AnalVal1 = 0 AND W1Imp = TRUE THEN
AnalVal1 := StartValW1;
(* Licht ausschalten *)
ELSIF AnalVal1 > 0 AND W1Imp = TRUE THEN
AnalVal1 := 0;
(* Szenenwert für Szenen 1-8 setzen *)
ELSIF Scene1Imp = TRUE THEN
AnalVal1 := Scene1ValW1;
ELSIF Scene2Imp = TRUE THEN
AnalVal1 := Scene2ValW1;
ELSIF Scene3Imp = TRUE THEN
AnalVal1 := Scene3ValW1;
ELSIF Scene4Imp = TRUE THEN
AnalVal1 := Scene4ValW1;
ELSIF Scene5Imp = TRUE THEN
AnalVal1 := Scene5ValW1;
ELSIF Scene6Imp = TRUE THEN
AnalVal1 := Scene6ValW1;
ELSIF Scene7Imp = TRUE THEN
AnalVal1 := Scene7ValW1;
ELSIF Scene8Imp = TRUE THEN
AnalVal1 := Scene8ValW1;
END_IF;
```

Eine kleiner Erklärung zu den Variablen:

- Scene1ValW1 steht für "Szenenwert der Szene Nr. 1 für Lichtfarbe Weißlicht1"
- Scene1Imp steht für "Scenen-Impuls", also den Initiator für das setzen des Analogwertes
- W1Imp steht für "Weißlicht1 Impuls", also den Einschaltimpuls für Weißlicht1

Nun habe ich insgesamt vorerst 8 Szenen und 5 Lichtfarben.
Das heisst, dass ich diese Zeilen 5 mal im Programm einfügen muss.

Das ist eine "dumme" Arbeit, die wie ich finde lästig ist und bestimmt vereinfachbar ist.

Ich hatte schon etwas von "array"-Funktionen gehört, allerdings kenne ich diese nicht wirklich und wäre über eine Erklärung des Lösungsweges (falls es einen gibt) sehr dankbar.

Beste Grüße,

Florian


----------



## ukemnitz (24 Mai 2012)

Willst du wissen wie man mit Array umgeht?


----------



## KingHelmer (24 Mai 2012)

Wenn du denkst, dass dieses Problem mit Array Funktionen zu lösen ist, dann ja


----------



## ukemnitz (24 Mai 2012)

Mh ich erkenne dein Problem nicht. Naja egal.

Also einen Array deklarieren kannst du mit:
 ArrayName : Array [1..10] of datentyp;

und zurgreifen mit:
 ArrayName[Nummer]:=irgendwas

Der Vorteil ist das du das ganze in einer For-Schleife verwenden kannst.

for i=1 to 10 by 1 do
ArrayName_:= ......
end_for

Weiß nicht ob du das wissen wolltest. Du kannst auch einen Array of Strukts machen._


----------



## Lupo (24 Mai 2012)

Woher kommen denn die Scene-Imp's ? Sind das IN-Parameter deines Bausteins ?
Müssen das 8 IN's sein oder ginge auch ein IN als Imp und eine Nummer zum Auswählen ?


----------



## KingHelmer (24 Mai 2012)

hi Lupo,

es gibt 1 Taster für Szene 1, einen Taster für szene 2, einen für szene 3 und so weiter und so weiter.
Also insgesamt 8 inputs.

Drücke ich einen dieser Taster, beispielsweise szene Nr. 4, so muss jeder "Lichtsorte" (5 Stück an der Zahl) eine einstellbare Lichtstärke (zum Beispiel 80% Grün, 30% Blau, 20% Rot, 10% Weiß 1, 5% Weiß 2) zugewiesen werden.

Die Lichtstärke stelle ich über AnalVal1 ein. Dieser AnalVal1 ist der Analogwert eines 1-10V Analogausgabeklemme, welche ein Vorschaltgerät von RGBW-Leuchten ansteuert.
In diesem Fall ist AnalVal1 eben für das Weißlicht Nr. 1 zuständig.
Es gibt dann weiterhin im Baustein noch AnalVal2, AnalVal3, AnalVal4 und AnalVal5.

Es müssen also für jede Szene und für jede Farbe ein bestimmter Prozentwert als Integer hinterlegt werden, welcher durch betätigen des Szenentasters auf den entsprechenden Analogausgang zugewiesen wird.

Ist es jetzt klarer geworden?

Grüße


----------



## MSB (24 Mai 2012)

Also wäre hier zur sinnvollen Array Adressierung folgendes nötig:

arSceneImp : ARRAY[1..8] OF BOOL ;
arSceneVal : ARRAY[1..8] OF typSceneValues;

typSceneValues
Red : INT;
Green : INT ;
Blue : INT ;
White : INT ;
Temperature: INT ;


```
FOR iSchleife := 1 TO 8 BY 1 DO
    IF arSceneImp[iSchleife] THEN
         AnalVal1 := arSceneVal[iSchleife].Red
         AnalVal2 := arSceneVal[iSchleife].Green
         AnalVal3 := arSceneVal[iSchleife].Blue
         AnalVal4 := arSceneVal[iSchleife].White
         AnalVal5 := arSceneVal[iSchleife].Temperature

         (* Eventual *)
         arSceneImp[iSchleife] := FALSE ;

   END_IF;
END_FOR;

IF NOT Ligth_On THEN
    AnalVal1 := 0 ;
    AnalVal2 := 0 ;
    AnalVal3 := 0 ;
    AnalVal4 := 0 ;
    AnalVal5 := 0 ;
END_IF;
```

Das ganze ist sicher ausbaufähig, aber die Grundweise sollte klar werden.

Mfg
Manuel


----------

