# Tanksteuerung mit strukturiertem text



## Joachim Gjesing Laybourn (24 Mai 2021)

Moin SPS-Forum

Ich hab ein kleines Problem und hoffe Ihr könnt mir weiterhelfen. Ich muss in Factorytalk View eine Pumpe programmieren. Die Pumpe soll einen Tank befüllen. 

Die Pumpe soll pumpen, wenn das Niveau unter 55% ist und dann den Tank auf 85% aufpumpen. Danach wird der Tank langsam entleert und wenn das Tankniveau wieder auf 55% ist soll die Pumpe wieder den tank auffüllen. 

Dazu muss die Programmierung in "Strukturiertem Text" geschrieben werde. Ich versuche schon seit gestern das irgendwie hinzukriegen, leider ohne erfolg. 

Ich hoffe Ihr könnt mir helfen 

Joachim


----------



## DeltaMikeAir (24 Mai 2021)

```
If Niveau < 55 Then
    Pumpe := TRUE;
End_If;

If Niveau > 84 Then
    Pumpe := FALSE;
End_If;
```


----------



## Joachim Gjesing Laybourn (24 Mai 2021)

Moin DeltaMikeAir

Danke für deine Antwort! Leider klappt das so nicht. Ich hab dir n Screenshot von dem Fehler angefügt. Hast du noch ne andere Idee?


----------



## hucki (24 Mai 2021)

Joachim Gjesing Laybourn schrieb:


> Moin DeltaMikeAir
> 
> Danke für deine Antwort! Leider klappt das so nicht. Ich hab dir n Screenshot von dem Fehler angefügt. Hast du noch ne andere Idee?


Von *ELSE* hat DeltaMikeAir nix geschrieben...



PS:
Ich kenne Factorytalk View nicht, daher die Frage, wer bekommt denn die 1 oder 0 in Deinem IF zugewiesen?

PPS:
Und für Standard-ST fehlen da auch jede Menge Semikola.


----------



## Heinileini (24 Mai 2021)

Oder für Schreibfaule:

```
Pumpe := ( Pumpe OR ( Niveau < 55 ) ) AND ( Niveau <= 85 ) ;
```
Michaels Vorschlag ist schon richtig ... wenn man ihn richtig abschreibt.  Allerdings: das zweite 'E' bei 'ENDE_IF' solltest Du weglassen.
Anscheinend machen die IF-Konstruktionen immer wieder (Verständnis-)Probleme. Warum eigentlich?

Anm.:
'Pumpe' muss static sein oder VAR_IN_OUT

PS:
Einerseits suchst Du eine Lösung als StructuredText (hast Du bekommen) und andererseits arbeitest Du mit dem Factorytalk View Expression Editor, der offensichtlich eine andere Schreibweise erwartet. Aber welche? Keine Ahnung. :sad: 

PPS:
Lässt sich den so etwas eingeben:

```
if ({LT-1_controller}<55) then 1 else Pumpe
if ({LT-1_controller}>85) then 0 else Pumpe
```
wobei 'Pumpe' die Variable sein muss, der das Ergebnis zugewiesen wird.

PPPS:
Der expression editor sollte eigentlich (dem Namen nach) dafür sein, Ausdrücke einzugeben. Aber if ... then ... else ... end_if ist doch kein Ausdruck!?
Dass da nicht ganz andere FehlerMeldungen kommen?!
Lässt sich denn mein Vorschlag für "Schreibfaule" eingeben, also ' ( Pumpe OR ( Niveau < 55 ) ) AND ( Niveau <= 85 ) '?
Wo und wie man allerdings die Zuweisung 'Pumpe := ' schreiben muss, entzieht sich meiner Fantasie .

Wofür sind überhaupt die geschweiften Klammern in Deinem screenshot? Müssen VariablenNamen so geschrieben werden?
Z.B.: ' ( {Pumpe} OR ( {Niveau} < 55 ) ) AND ( {Niveau} <= 85 ) ' ?


----------



## DeltaMikeAir (24 Mai 2021)

Heinileini schrieb:


> ...Allerdings: das zweite 'E' bei 'ENDE_IF' solltest Du weglassen.


Diese Autokorrektur....


----------



## Frohnius (24 Mai 2021)

hi, 
ich bin da eher der FlipFlop-fetischist ... da es sicherlich noch mehr bedingungen gibt die pumpe abzuschalten ...

 Pumpe_RS(SET:= Nieveau < 55 , 		RESET1:=  (Nieveau > 85) OR AnlageAus OR NOT Notaus OR NOT Motorschutz , 
		Q1=> GVLdq_PumpeEin);


----------



## Mrtain (24 Mai 2021)

Frohnius schrieb:


> ... da es sicherlich noch mehr bedingungen gibt die pumpe abzuschalten ...



Die man auch genauso gut in einem If-Konstrukt, oder wenn’s sein muss, auch in einem Einzeiler abfragen könnte...


----------



## DeltaMikeAir (24 Mai 2021)

> ... da es sicherlich noch mehr bedingungen gibt die pumpe abzuschalten ...



Ja, z.B. Laufzeit-Überwachung damit bei einem Leck oder Drahtbruch die Pumpe nicht unendlich lange pumpt.


----------



## Mrtain (25 Mai 2021)

Ich will nicht sagen, dass die Lösung mit einem RS/SR-Baustein per se nicht gut ist. Es macht für mich in diesem Fall nur keinen unterschied, ob ich die Abschaltbedingungen am Reseteingang des Bausteins verschalte oder in einem If-Konstrukt abfrage. Läuft beides aufs gleiche hinaus.

So ich hohl mir erstmal nen Kaffee...


----------



## Frohnius (25 Mai 2021)

Mrtain schrieb:


> Ich will nicht sagen, dass die Lösung mit einem RS/SR-Baustein per se nicht gut ist. Es macht für mich in diesem Fall nur keinen unterschied, ob ich die Abschaltbedingungen am Reseteingang des Bausteins verschalte oder in einem If-Konstrukt abfrage. Läuft beides aufs gleiche hinaus.
> 
> So ich hohl mir erstmal nen Kaffee...



huch ? niemand hat gesagt dass if / then nicht gut ist ...

ich vermeide das nur wenn immer es geht ... 
gibt es mehrere setz- und rücksetz bedingungen bleibt das rs (für mich) im code einfach übersichtlicher ...

naja und ich habe bei einem kollegen auch schon schwachsinn gesehen wie:

if a > b then
  schalten:=true;
end_if


----------



## hucki (25 Mai 2021)

Frohnius schrieb:


> und ich habe bei einem kollegen auch schon schwachsinn gesehen wie:
> 
> if a > b then
> schalten:=true;
> end_if


Warum siehst Du dies als Schwachsinn an?


Bei:

```
if a > b then
   schalten := true;
else
   schalten := false;
end_if
```
könnte ich Dir folgen, da man dies zu:

```
schalten := a > b;
```
 vereinfachen kann.
Aber oben?


PS: 
Bitte nutze zukünftig doch die Code-Tags (#-Button, 2. Iconleiste ganz rechts).
Wie man sieht, macht es den Code deutlich lesbarer und Du kannst auch Einrückungen nutzen.


----------



## DeltaMikeAir (25 Mai 2021)

hucki schrieb:


> Warum siehst Du dies als Schwachsinn an?



Hatte ich mich auch gefragt.


----------



## Frohnius (25 Mai 2021)

ahhh ok ... mein beispiel war nicht ganz richtig  ...


```
if a and b then
schalten := true;
else
schalten := false;
end_if
```

^^ so war das ...
was ein einfaches 

```
schalten := a and b;
```
ersetzt

if / then hat große vorteile wenn die bedingung nicht true ist, der eingeschlossene code nicht ausgeführt werden muss ...

aber wenn es darum geht z.b. eine pumpe zu schalten bin ich dann doch eher bei einem RS - Flipflop ...


```
schalten_RS(SET:= (Hand and TasteEin) or (automatik and FuellstandLow),
RESET1:= (Hand and TasteAus) or
                (automatik and FuellstandHigh) or
                not motorschutz or not notaus or not FuellstandAlarm or not Trockenlaufschutz
);
```
^^ sowas bleibt einfach überschaubarer für MICH ....


----------



## DeltaMikeAir (25 Mai 2021)

Frohnius schrieb:


> ahhh ok ... mein beispiel war nicht ganz richtig  ...
> 
> 
> ```
> ...



Ok, dass macht schon mehr Sinn


----------



## DeltaMikeAir (25 Mai 2021)

Frohnius schrieb:


> ahhh ok ... mein beispiel war nicht ganz richtig  ...
> 
> ...
> 
> ...



Das ist halt Geschmackssache, ich persönlich finde hier ein IF Konstrukt übersichtlicher ( vor allem je mehr Bedingungen dazu kommen ).
Aber da hat halt jeder seinen eigenen Stil. Funktionieren wird letztendlich beides


----------



## Oberchefe (25 Mai 2021)

Ich will mir jetzt gar nicht die hier geposteten Details anschauen, aber Logik gehört in die SPS und nicht ins HMI!


----------



## Heinileini (26 Mai 2021)

Oberchefe schrieb:


> ... aber Logik gehört in die SPS und nicht ins HMI!


Natürlich! Das ist es! 
Der TE sagt (s. #1), er muss in structured text programmieren, aber er tut es nicht. Er fummelt stattdessen anscheinend im HMI herum.
Das erklärt die Merkwürdigkeiten und Rätsel, denen wir uns hier ausgesetzt haben!?


----------



## JesperMP (26 Mai 2021)

Joachim Gjesing Laybourn schrieb:


> Ich hab ein kleines Problem und hoffe Ihr könnt mir weiterhelfen.


Gerne.

Ahem....

1. Verstehe dass eine HMI ist nur für das Schnittstelle zwischen Bediener und Maschine oder Prozess. Logik der die Maschine oder Prozess beeinflusst gehört ind die SPS.
2. Es gibt ein Anzahl SPS Programmsprachen. Structured Text ist eine standardisierte Sprache und gehört zu IEC 61131-3. Die Expression Editor in Factory Talk View gehört nicht zu diese Standard.
3. Die Pumpe Programmaufgabe ist so basal, dass ich denke dies ist eine Aufgabe in die Schule. Wenn dies in der Tat eine Aufgabe in die Schule ist, dann erklär dass als das allererste. Probier nicht es zu verstecken.


----------

