# Mit Bool Werten Real Werte setzen



## Xebi (28 September 2017)

Hallo zusammen,

ich will mit verschiedenen Bool Werten, Bsp. xTaster_1; xTaster_2; xTaster_3 drei verschiedene Real werte 
setzen Bzw ausgeben. Bei Taster_1 sollen 33. und bei Taster 2  70 ausgegeben Bzw aktiviert werden.

ich Rätsel herum ob es dafür fertige Bausteine gibt, oder man sich dies selber bauen muss. Ich hab gelesen das
man mit ST etwas machen kann. Habt ihr Tipps, Bzw ein Gutes Tutorial was ihr empfehlen könnt?

ich verzweifle grade,  

vielen Dank


----------



## Matze001 (28 September 2017)

Schau Dir mal den MOVE Baustein ein.

In ST wäre die Lösung:


```
IF Taster_1 THEN
    REALWERT = 33;
END_IF;

IF Taster_2 THEN
    REALWERT = 70;
END_IF;

...
```

Grüße

Marcel


----------



## SPS_A (29 September 2017)

Moin, abgekürzt könntest du es auch mit Elsif's verknüpfen:
IF Taster1 THEN
Wert1 := 1;
ELSIF Taster2 THEN
Wert2 := 2;
ELSIF Taster3 THEN
Wert3 := 3;
END_IF
Dies würde aber bedingen, dass nur ein Taster gleichzeitig aktiv ist. Wie soll hier die Rangfolge sein?


----------



## Tiktal (29 September 2017)

Dan nimm doch den SEL-Baustein.
Da kannst Du zwei Werte dran schreiben, wenn False z.B, wenn True z.B. 10.
Je nachdem wird dann der entsprechende Wert ausgegeben.

Gruß

Onno


----------



## oliver.tonn (29 September 2017)

SPS_A schrieb:


> Dies würde aber bedingen, dass nur ein Taster gleichzeitig aktiv ist. Wie soll hier die Rangfolge sein?


Das nicht, aber durch die Reihenfolge in der IF-Anweisung ergibt sich eine Priorisierung. Wenn Taster 1 und Taster n gedrückt ist wird der Wert für Taster 1 gesetzt. Wenn tatsächlich immer nur ein Taster gedrückt sein darf müsste der TE die IF-Abfrage so aufbohren, dass der gewünschte Taster auf TRUE und alle anderen auf FALSE abgefragt werden.


----------



## hucki (29 September 2017)

oliver.tonn schrieb:


> Das nicht, aber durch die Reihenfolge in der IF-Anweisung ergibt sich eine Priorisierung.


Die ist bei den einzelnen IF-Anweisungen ebenso vorhanden wie bei ELSIF.
Allerdings in umgekehrter Reihenfolge, da die letzte Zuweisung die vorigen ggf. überschreibt.


----------



## PN/DP (29 September 2017)

SPS_A schrieb:


> Dies würde aber bedingen, dass nur ein Taster gleichzeitig aktiv ist. Wie soll hier die Rangfolge sein?


Da hat sich der Kollege wohl ein bißchen ungenau ausgedrückt?

Wenn Taster 1 und Taster n gedrückt sind:
(1) bei der "normalen" Version wie von Matze001 gezeigt "gewinnt" Taster n
(2) bei der "abgekürzten" Version von SPS_A für tippfaule Programmierer "gewinnt" Taster 1.

In einer frei laufenden Task würde die zweite Version bei Taster 1 gedrückt/nicht gedrückt eine größere Zykluszeitschwankung verursachen als die erste Version. Bei der ersten Version ist die Zykluszeit gleich, egal ob Taster 1 oder Taster n gedrückt ist.

Harald


----------



## weißnix_ (29 September 2017)

Bitte auch an die Wertzuweisung denken, wenn kein Taster gedrückt ist  , sonst steht der letzte Tasterwert u.U. dauerhaft an.


----------



## egro (29 September 2017)

Sicher nicht die schönste und einfachste Art, aber funktioniert... im CFC!!!

Taster_1->BOOL_TO_REAL, diesen MUL mit dem gewünschten Wert.
Das mit allen Tastern und zusammenrechnen (ADD).
Wenn immer nur ein Wert ausgegeben werden soll, die Taster gegeneinander verriegeln.

Not macht erfinderisch!!!


----------



## Xebi (5 Oktober 2017)

Hallo zusammen,

Ich danke euch für eure Hilfe und habe mit euren Tipps nun dies hier rausgemacht. Ist die Variable True wird der Wert der am Eingang liegt in den Ausgang geschrieben. Ist der Eingang NOT True
schreibe ich eine 0 rein. Dieser Funktionsblock nutze ich im Hauptprogramm und die Ausgänge gehen auf ein [MAX] und der Spuckt mir von den jeweiligen werden immer den höchsten den ich will.
Sicherlich kann man in ST diese MAX Funktion noch einbauen, nur weis ich noch nicht ganz wie. 

Deklarations:

FUNCTION_BLOCK oLichtwerte_Stufen_schalten
VAR_INPUT
	xEN_1: BOOL;
	rIn_1: REAL;
	xEN_2: BOOL;
	rIn_2: REAL;
END_VAR
VAR_OUTPUT
	rOut_1: REAL;
	rOut_2: REAL;
END_VAR
VAR
	rvar3: REAL := 0;
END_VAR

Programm in ST:



IF xEN_1 THEN
	rOut_1 := MOVE(rIn_1);
END_IF


IF NOT xEN_1 THEN
	rOut_1 := MOVE(rvar3);
END_IF




IF xEN_2 THEN
	rOut_2 := MOVE(rIn_2);
END_IF


IF NOT xEN_2 THEN
	rOut_2 := MOVE(rvar3);
END_IF



Vielen Dank für eure Hilfe!!!

Xebi


----------



## Heinileini (5 Oktober 2017)

Moin Xebi!
Ich habe leider nicht verstanden, worauf Du hinaus willst. 


Xebi schrieb:


> ... Dieser Funktionsblock nutze ich im Hauptprogramm und die Ausgänge gehen auf ein [MAX] und der Spuckt mir von den jeweiligen werden immer den höchsten den ich will. ...
> Xebi


Willst Du mit den Tasten so nach und nach einen Wert steigern, ohne ihn wieder vermindern oder gar löschen zu können?
Oder willst Du speichern (um später auswerten zu können), welcher MaximalWert im Laufe der Zeit irgendwann mal erreicht wurde?
Den MaximalWert von 2 EingangsVariablen festzustellen, dürfte doch wohl nicht das Problem sein? (if X1 > X2 then Max := X1 else Max := X2)

Gruss, Heinileini


----------



## Xebi (5 Oktober 2017)

Ich habe an der Wago eine DALI Karte und wir werden damit unsere Ausenbeleuchtung der Hallen Steuern.
Unsere Chefs sagen nach ASR reicht eine Beleuchtung von xy Luxund zugleich sagen die ISO 50.001 Energie Sparen.

Sobald meine Steuerung sagt das es Dunkel ist sende ich per Dali an alle Ausenlampen geht an mit 30%, LED Fluter im 
Verladebereich LKW /Stapler werden als Ausenbeleuchtung genutzt solange ich da nicht Verlade. Die Mitarbeiter drücken einen Taster den ich auswerte und dann für Zeit X machen wir denen im Bereich die Beleuchtung auf 70,80 oder 100%. Nach der Zeit geht die Beleuchtung wieder auf 30% Runter. Dasselbe für unseren Überweg in die andere Halle, geht eines der beiden Schnelllauftore auf.Soll kurzzeitig die Beleuchtung auf 100% gehen und dann wieder auf 30%

Daher benötige ich den Max Wert.

Der Dali Baustein Sendet bei Werteveränderung die Daten ins EVG. Und da unser Dämmerungsschalter und der Taster
Bool Werte liefern, bräuchte ich das.


----------



## hucki (5 Oktober 2017)

Xebi schrieb:


> und habe mit euren Tipps nun dies hier rausgemacht. Ist die Variable True wird der Wert der am Eingang liegt in den Ausgang geschrieben. Ist der Eingang NOT True
> schreibe ich eine 0 rein.


Grausam, grausam, diese IF-THEN-Orgien.



Das Gleiche in grün für rOut_1:

```
rOut_1 := SEL (G := xEN_1, IN0 := 0.0, IN1 := rIn_1);
```


----------



## Heinileini (5 Oktober 2017)

Xebi schrieb:


> ... Sobald meine *Steuerung sagt das es Dunkel *ist sende ich per Dali an alle Ausenlampen geht an mit 30%, LED Fluter im
> Verladebereich LKW /Stapler werden als Ausenbeleuchtung genutzt solange ich da nicht Verlade. Die Mitarbeiter drücken einen Taster den ich auswerte und dann für Zeit X machen wir denen im Bereich die Beleuchtung auf 70,80 *oder* 100%. Nach der Zeit geht die Beleuchtung wieder auf 30% Runter. Dasselbe für unseren Überweg in die andere Halle, geht eines der beiden Schnelllauftore auf.Soll kurzzeitig die Beleuchtung auf 100% gehen und dann wieder auf 30% ...


Aaach sooo! Drei Fragen habe ich noch:
1. Wovon soll abhängen, ob bei TastenDruck auf 70% oder 100% geschaltet wird? 
2. Soll das Licht durch die Taste auch eingeschaltet werden können, wenn Deine Steuerung nicht sagt, dass es dunkel ist?
3. Die Leuchten für den VerladeBereich und die zwischen den Schnelllauftoren sollen vermutlich unabhängig von einander vorübergehend heller geschaltet werden?

Version 1 (EnergieSparen hat Vorrang):
- Drücken eines Tasters startet Timer 1
- Öffnen eines der SchnelllaufTore Tore startet Timer 2 
- immer 30% an LeuchtenGruppen A und B
- solange Timer 1 läuft, 70% (oder 100%?) an LeuchtenGruppe A
- solange Timer 2 läuft, 70% (oder 100%?) an LeuchtenGruppe B
- wenn nicht Dunkel, dann 0% an LeuchtenGruppen A und B 

Version 2 (gutes Licht hat Vorrang):
- Drücken eines Tasters startet Timer 1
- Öffnen eines der SchnelllaufTore Tore startet Timer 2 
- wenn nicht Dunkel, dann 0% an LeuchtenGruppe A und B, sonst 30%
- solange Timer 1 läuft, 70% (oder 100%?) an LeuchtenGruppe A
- solange Timer 2 läuft, 70% (oder 100%?) an LeuchtenGruppe B

Version 3 (gutes Licht hat Vorrang bei LeuchtenGruppe A, aber EnergieSparen bei LeuchtenGruppe B):
- Drücken eines Tasters startet Timer 1
- Öffnen eines der SchnelllaufTore Tore startet Timer 2 
- wenn nicht Dunkel, dann 0% an LeuchtenGruppe A, sonst 30%
- immer 30% an LeuchtenGruppe B 
- solange Timer 1 läuft, 70% (oder 100%?) an LeuchtenGruppe A
- solange Timer 2 läuft, 70% (oder 100%?) an LeuchtenGruppe B
- wenn nicht Dunkel, dann 0% an LeuchtenGruppe B

Würde das Deinen Vorstellungen entsprechen?

Gruss, Heinileini


----------



## Heinileini (5 Oktober 2017)

hucki schrieb:


> Grausam, grausam, diese IF-THEN-Orgien.


Grundsätzlich bin ich Deiner Meinung, hucki. Insbesondere Anfänger, die vorher nur "HochSprachen" kannten, formulieren die Aufgabenstellungen manchmal so, dass man sich wundern muss.
Und vergessen dann auch noch den ELSE-Zweig. 
Man kann aber den ELSE-Zweig auch absichtlich "vergessen" (=weglassen), wenn man auf diesem Wege "Setzen" bzw. "Rücksetzen" realisieren will.

Aber, ob ...


hucki schrieb:


> Das Gleiche in grün für rOut_1:
> 
> ```
> rOut_1 := SEL (G := xEN_1, IN0 := 0.0, IN1 := rIn_1);
> ```


... so viel besser lesbar ist, z.B. auch für ServicePersonal, dürfte wohl weiterhin individuell sehr unterschiedlich empfunden werden.


----------



## egro (5 Oktober 2017)

So wie ich das verstanden habe, willst du DALI-Leuchten mal mit 30%, mal mit 70%, usw. ansteuern.
Wieso machst du das nicht mit Szenen?
Szene 1 = 30%
Szene 2 = 70%
usw...
Die kannst du mit Bool-Variablen aufrufen.


----------

