# Programmierung mit ST (Structured Text)



## DerBenutzer (19 Dezember 2014)

Hallo liebe Leute.
Ich bin noch ein Anfänger mit SPS Maschinen, bin aber auf ein kleines Problem gestoßen das
ich leider noch nicht lösen konnte.

Ist es irgendwie möglich Eingaben vom User abzufangen und darauf zu reagieren?

Kleines Beispiel:
Ich habe einen Sensor der zählt Objekte. Immer wenn er 3 gezählt hat, wechselt eine Lampe die Farbe, von Grün auf Rot, dann wieder auf Grün usw.

Jetzt möchte ich aber, wenn ein Benutzer die Farbe mit einem Knopf umstellt der Zähler wieder von 0 gezählt wird. Wenn er aber denselben Knopf drückt wie die aktuelle Farbe, dann soll
gar nichts passieren und alles wie gewohnt weiterlaufen. Mein Code sieht bisher so aus von der reinen Logik:


```
IF (Sensor=True) THEN
    
        Zaehler:=+1;
        
    ELSIF (Zaehler>=3 AND Gruen=True) THEN
    
            Gruen:=False;
            Rot:=True;
            Zaehler:=0;
            
    ELSIF (Zaehler>=3 AND Rot=True) THEN    
            
            Gruen:=True;
            Rot:=False;
            Zaehler:=0;
            
    END_IF;
```

Ich müsste praktisch vergleichen ob die aktuelle Farbe der Lampe mit dem übereinstimmt, was der Benutzer drückt. Das ist aber ein uns dasselbe, da meine Lampe ja praktisch ein bool ist der 0 oder 1 sein kann, deswegen weiss ich nicht wie ich etwas mit sich selbst vergleichen kann...


----------



## vollmi (19 Dezember 2014)

DerBenutzer schrieb:


> Hallo liebe Leute.
> Ich bin noch ein Anfänger mit SPS Maschinen, bin aber auf ein kleines Problem gestoßen das
> ich leider noch nicht lösen konnte.
> 
> ...



So z.B.
TasteX muss allerdings als Flanke gebildet sein. 

Bool musst du nie auf True oder False vergleichen wenn du ein Boolsches ergebnis erwartest. Da eine Boolsche Variable ja schon ein Boolsches Ergebnis zurückgibt.

Also IF Variable1 AND NOT Variable2 THEN
anstatt
IF (Variable1=TRUE) and (Variable2=FALSE) THEN

mfG René


----------



## DerBenutzer (19 Dezember 2014)

Super, vielen Dank für die schnelle Antwort. Ja das mit dem Bool war ein Flüchtigkeitsfehler meinerseits.
Könnt ihr mir vielleicht gute Literatur mit praktischen Beispielen empfehlen zu ST?
Ich habe bisher nur sehr theoretische Werke gefunden, die sich mehr mit dem Aufbau und der Funktionsweise einer SPS
beschäftigen.

Ich habe da nämlich noch ein Problem mit der Variablendeklaration.
Eigentlich sind "Grün" und "Rot" ja Steuerungssignal die von Außen kommen.
Dementsprechend wollte ich sie mit VAR_INPUT deklarieren.
Allerdings hat man Variablen die innerhalb von VAR_INPUT deklariert sind
ja nur Lesezugriff, ich könnte also in einer Schleife wie hier den Wert nicht ändern.

Wie macht man das idealerweise? Übergeb ich meinen input mit einer zuweisung auf lokale Variablen, sprich:


```
VAR_INPUT
Rot:BOOL;
END_VAR
VAR
Rot_lokal:BOOL;
END_VAR
Rot_lokal:=rot;
```

?


----------



## StructuredTrash (19 Dezember 2014)

DerBenutzer schrieb:


> Eigentlich sind "Grün" und "Rot" ja Steuerungssignal die von Außen kommen.


Warum das? Werden "Rot" und "Grün" im aufrufenden Programm auch manipuliert? Wenn nicht, würde ich sie lokal im FB deklarieren.


DerBenutzer schrieb:


> Allerdings hat man Variablen die innerhalb von VAR_INPUT deklariert sind ja nur Lesezugriff


Ich kann nur für CoDeSys sprechen, dort kann ein FB seine VAR_INPUTs auch beschreiben. Eigentlich müsste der Bereich also VAR_PUBLIC und nicht VAR_INPUT heissen.
Allerdings ist die Rückmeldung von Ergebnissen im VAR_INPUT-Bereich unüblich und wohl durchaus geeignet, einen Glaubenskrieg zu entfachen. Wenn Du das machen willst, würde ich die Variablen besonders kennzeichen, z. B. so:

```
VAR_INPUT   (* INPUT, FB read only *)
   inpSensor:BOOL;
END_VAR
VAR_INPUT   (* PUBLIC *)
   pubGruen:BOOL;
   pubRot:BOOL;
END_VAR
```
Empfehlenswert ist das aber nur, wenn "Rot" und "Grün" ausschliesslich zwischen dem PRG und diesem einen FB ausgetauscht werden und nur durch den FB manipuliert werden. Wenn das PRG diese Variablen dagegen auch manipuliert oder sie noch an weitere FB's übergeben muss, sind sie besser im PRG aufgehoben. Dann kann man sie als VAR_IN_OUT an die FB's übergeben.


----------



## vollmi (19 Dezember 2014)

Statt VAR_INPUT kannst du auch VAR_IN_OUT nehmen
Die werden zu beginn gelesen und am ende geschrieben.

Du kannst also eine Variable an VAR_IN_OUT inkrementieren.

Also Deklarationen nach Bedarf:
VAR_INPUT // Eingangsschnittstelle
VAR_OUTPUT // Ausgangsschnittstelle
VAR_IN_OUT // Sowohl Ein wie auch Ausgabe Ich nehm die z.B. bei UDTs standartmässig da in UDTs bei mir meist von allen Variablentypen vorhanden sind. Also welche die ich auch beschreiben muss aber auch z.t. nur Parameter.

VAR_Temp // Flüchtige Variablen. Zustand undefiniert bis drauf geschrieben wird und zwar in JEDEM Zyklus
VAR // Statische Variablen. Werden im Instanzdb gesichert und wie Merker behandelt.
CONST // Lokale Konstanten. Brauchen keine Deklaration weil sie eigentlich nur ein Label darstellen deren Inhalt hier definiert wird.

```
CONST
   Max_Abweichung := 3; // Maximal zulässige Abweichung soll/ist 
   Max_OeffnungZU := 5; // Maximal zulässiger öffnungswinkel um als Geschlossen zu gelten
   Min_OeffnungAUF := 85; // Minimaler öffnungswinkel um als offen zu gelten
   Offenwinkel := 90; // Winkel für volle öffnung der KLappe
END_CONST
```

Auf Const sollte verzichtet werden, da in TIA diese Möglichkeit so wegfällt. Stattdessen Temp verwenden und direkt nach der Schnittstellenbeschreibung einen Wert zuweisen. Braucht halt ne Typdeklaration.

mfG René


----------



## DerBenutzer (19 Dezember 2014)

Ich habe mir das Feedback mal zu Herzen genommen und in einem neuen Thread "weiterverarbeitet". So ganz blicke ich aber immer noch nicht durch.


----------

