# Anfängerfrage ST



## coldice (23 September 2015)

Wie kann ich 
	

		
			
		

		
	



	

		
			
		

		
	
in ST schreiben ?


xLevel_1 := S xLevel_1;

geht leider nicht .


Lösung?????

Danke für Eure Hilfe.


----------



## Verpolt (23 September 2015)

Hallo,


```
xLevel_1 := True;
```


----------



## oliver.tonn (23 September 2015)

Hallo coldic,
ganz einfach:

xLevel_1 := TRUE;

Gruß

Oliver


----------



## coldice (23 September 2015)

ich brauch das "SET" für "xLevel_1" um später auch wieder "RESET" auszuführen.


----------



## oliver.tonn (23 September 2015)

Arrgh, beim Tippen überholt worden, das ist bitter.

:sb8:


----------



## Verpolt (23 September 2015)

coldice schrieb:


> ich brauch das "SET" für "xLevel_1" um später auch wieder "RESET" auszuführen.




Reset

```
xLevel_1 := False;
```


----------



## oliver.tonn (23 September 2015)

Dann als Reset

xLevel_1 := FALSE;

In ST gibt es kein Set und Reset, die Variable behält Ihren Wert in FBs solange der Wert nicht geändert wird.
Die TRUE und die FALSE Anweisung musst Du dann halt in je eine If Anweisung tun.


----------



## oliver.tonn (23 September 2015)

Sag mal Verpolt, machst Du das mit Absicht???!!!


----------



## Verpolt (23 September 2015)

ja klar, sitz vor dir an der Tafel..


----------



## coldice (23 September 2015)

also in etwa so:


```
IF rmode >=1 AND rmode <2 THEN
    xLevel_1:= TRUE;


    ELSIF rmode >=2 AND rmode <3 THEN
        xLevel_2:= TRUE;
            xLevel_1:= FALSE;
```


----------



## oliver.tonn (23 September 2015)

Genau,
nur am Ende noch ein END_IF und die Einrückung vom zweiten XLevel_1 muss auch nicht sein, außerdem fehlt eventuell ein xLevel_2 := FALSE oben.


----------



## oliver.tonn (23 September 2015)

Ha, erster, erster, erster!!!

:s11:


----------



## coldice (23 September 2015)

aktueller Stand:

```
IF rmode >=1 AND rmode <2 THEN
    xLevel_1:= TRUE;
        xLevel_2:= FALSE;
            xLevel_3:= FALSE;
                xLevel_4:= FALSE;
                    xLevel_5:= FALSE;
                        xLevel_6:= FALSE;


    ELSIF rmode >=2 AND rmode <3 THEN
            xLevel_1:= FALSE;
                xLevel_2:= TRUE;
                    xLevel_3:= FALSE;
                        xLevel_4:= FALSE;
                            xLevel_5:= FALSE;
                                xLevel_6:= FALSE;


        ELSIF rmode >=3 AND rmode <4 THEN
                xLevel_1:= FALSE;
                    xLevel_2:= FALSE;
                        xLevel_3:= TRUE;
                            xLevel_4:= FALSE;
                                xLevel_5:= FALSE;
                                    xLevel_6:= FALSE;

            ELSIF rmode >= 4 AND rmode < 5 THEN
                    xLevel_1:= FALSE;
                        xLevel_2:= FALSE;
                            xLevel_3:= FALSE;
                                xLevel_4:= TRUE;
                                    xLevel_5:= FALSE;
                                        xLevel_6:= FALSE;

        ELSIF rmode >=5 AND rmode <6 THEN
                xLevel_1:= FALSE;
                    xLevel_2:= FALSE;
                        xLevel_3:= FALSE;
                            xLevel_4:= FALSE;
                                xLevel_5:= TRUE;
                                    xLevel_6:= FALSE;

    ELSIF rmode >=6 AND rmode <8 THEN
                xLevel_1:= FALSE;
                    xLevel_2:= FALSE;
                        xLevel_3:= FALSE;
                            xLevel_4:= FALSE;
                                xLevel_5:= FALSE;
                                    xLevel_6:= TRUE;

END_IF;
```

Wie kann ich aber das Problem lösen das bei fallendem "rmode" die "xLevel" nicht wieder zurückgestellt. Dies soll durch eine separate Variable "Reset" geschehen unabhängig von "rmode".


----------



## oliver.tonn (23 September 2015)

Hallo coldice,
was ist ein fallender rmode? Vorher 8 dann, z.B. 5?


----------



## coldice (23 September 2015)

Ja, die Werte werden aber nach der Reihe zurückgehen:   8 ->7 ->6    oder so ähnlich.


----------



## oliver.tonn (23 September 2015)

Dann macht das Dein Programm doch schon von selber. Sobald rMode auf 5 zurückgeht wird xLevel_5 wieder gesetzt und alle anderen werden FALSE.


----------



## .:WAGO::015844:. (23 September 2015)

Hallo coldice,

sinnvoll ist es sicherlich Variablen möglichst Zentral an einem Ort mit einer Bedingung zu verknüpfen.
So siehst du direkt unter welcher Bedingung, welcher Zustand besteht, ohne lange das Programm zu durchsuchen.


```
// Mode 1
IF rmode = 1 THEN
    xLevel_1 := TRUE;
ELSE
    xLevel_1 := FALSE;
END_IF;

// Mode 2
IF rmode = 2 THEN
    xLevel_2 := TRUE;
ELSE
    xLevel_2 := FALSE;
END_IF;

// Mode 3
IF rmode = 3 THEN
    xLevel_3 := TRUE;
ELSE
    xLevel_3 := FALSE;
END_IF;

// Mode 4
IF rmode = 4 THEN
    xLevel_4 := TRUE;
ELSE
    xLevel_4 := FALSE;
END_IF;

// Mode 5
IF rmode = 5 THEN
    xLevel_5 := TRUE;
ELSE
    xLevel_5 := FALSE;
END_IF;

// Mode 6
IF rmode = 6 THEN
    xLevel_6 := TRUE;
ELSE
    xLevel_6 := FALSE;
END_IF;
```


----------



## coldice (23 September 2015)

Das soll es aber nicht. s.o.
Geht "rmode" rückwärts soll sich "xLevel" nicht mehr ändern. "xLevel" soll durch eine separate Variable "RESET" auf false gesetzt werden.


----------



## Verpolt (23 September 2015)

Mal am Rande...

rmode ist keine Reahlzahl, oder?  (entweder 1 oder 2 aber nie 1.3...)
dann ist das >=1 und <2 nix anderes als ein Vergleich auf =1

Wago... hat das ja bereits übersichtlich dargestellt.



> Das soll es aber nicht...


 ???

bezieht sich auf...?


----------



## .:WAGO::015844:. (23 September 2015)

Hallo coldice,

das ging aus deinem Beispielcode so nicht hervor. Ich habe nur die gleiche Funktionalität abgebildet.
Also hier nochmal die von dir beschriebene:


```
rMode: REAL:= 0.0;
xLevel_1: BOOL:= FALSE;
xLevel_2: BOOL:= FALSE;
xLevel_3: BOOL:= FALSE;
xLevel_4: BOOL:= FALSE;
xLevel_5: BOOL:= FALSE;
xLevel_6: BOOL:= FALSE;
xReset: BOOL:= FALSE;

// Level 1
IF rMode >= 1.0 THEN
    xLevel_1 := TRUE;
END_IF;

IF xReset THEN
    xLevel_1 := FALSE;
END_IF;


// Level 2
IF rMode >= 2.0 THEN
    xLevel_2 := TRUE;
END_IF;

IF xReset THEN
    xLevel_2 := FALSE;
END_IF;


// Level 3
IF rMode >= 3.0 THEN
    xLevel_3 := TRUE;
END_IF;

IF xReset THEN
    xLevel_3 := FALSE;
END_IF;


// Level 4
IF rMode >= 4.0 THEN
    xLevel_4 := TRUE;
END_IF;

IF xReset THEN
    xLevel_4 := FALSE;
END_IF;


// Level 5
IF rMode >= 5.0 THEN
    xLevel_5 := TRUE;
END_IF;

IF xReset THEN
    xLevel_5 := FALSE;
END_IF;


// Level 6
IF rMode >= 6.0 THEN
    xLevel_6 := TRUE;
END_IF;

IF xReset THEN
    xLevel_6 := FALSE;
END_IF;
```


----------



## coldice (23 September 2015)

es ist eine Real Zahl (sind am Ende Temperaturen)

Das soll es aber nicht .... bezog sich auf die Änderung des Wertes "rmode". Wenn er kleiner wird soll sich nix ändern. Das Rücksetzen soll durch eine separate Variable "RESET" erfolgen.


----------



## hucki (23 September 2015)

.:WAGO::015844:. schrieb:


> ```
> // Mode 1
> IF rmode = 1 THEN
> xLevel_1 := TRUE;
> ...


@Wago-Support,

ist das Euer Ernst?
In FUP/KOP würdet Ihr doch auch nur 'ne Zweisung nehmen und nicht so'n Rumgehopse, oder?

```
xLevel_1 := rmode = 1;
```


----------



## .:WAGO::015844:. (23 September 2015)

Hallo hucki,

grundsätzlich gebe ich dir Recht.
Um aber Anfänge in ST zu erläutern würde alles Andere nur zur völligen Verwirrung beitragen.

Komplexer, mit weniger Code geht immer. Ob das zur Übersichtlichkeit beiträgt, bleibt jedem selbst überlassen.
Zudem würde deine Variante die weiterführende gewünschte Funktionalität nicht erfüllen können.


----------



## oliver.tonn (23 September 2015)

So auf die Schnelle würde mir da nur einfallen das Du alle Schritte gegen die höheren verriegelst in etwa so:


```
ELSIF rmode >=2 AND rmode <3 AND NOT xLevel_3 AND NOT xLevel_4 AND NOT xLevel_5 AND NOT xLevel_6 THEN
            xLevel_1:= FALSE;
            xLevel_2:= TRUE;
            xLevel_3:= FALSE;
            xLevel_4:= FALSE;
            xLevel_5:= FALSE;
            xLevel_6:= FALSE;
```

Zum Thema Reset werde ich meine Hilfe mal etwas runterschrauben, Du sollst ja auch etwas tun. Du weißt ja jetzt wie man Variablen setzt und zurücksetzt und If-Afragen kennst Du auch. Bei einem Reset sollen die xLevel Flags ja wieder alle auf false sein. Such mal nach positiver Flanke in der Hilfe.

Gruß

Oliver


----------

