Hilfe bei Funktionsoptimierung IF ELSEIF ELSE

KingHelmer

Level-1
Beiträge
1.076
Reaktionspunkte
139
Zuviel Werbung?
-> Hier kostenlos registrieren
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:

Code:
(*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
 
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.
 
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 ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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 ;

Code:
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
 
Zurück
Oben