# WAGO: 6 Pumpen in Abhängigkeit der Temperatur und der Betriebsdauer aktivieren



## Leidi (25 April 2008)

Moin Moin

ich habe ein Problem mit der Realisierung einer Steuerung (Wago 750-838 CanOpen)
Aufgabenstellung:
6 Pumpen sollen in Abhängigkeit der Temperatur und der bisherigen Betriebsdauer aktiviert werden. 

Es sollen 6 Temperatur-Bereiche programmiert werden. In der 1. Stufe soll die Pumpe mit der geringsten Betriebsdauer aktiviert werden. In der zweiten Stufe wird die Pumpe mit der zweitwenigsten Betriebsdauer zur Ersten zugeschaltet usw. bis in der 6 Stufe alle Pumpen laufen. 
Ich habe in der WAGO-Bibliothek "Gebäude_allgemein.lib" die FBs 
"Fb_Stufen" --> Stufenschalter bis max *5* Stufen
"FbBetrDauer" --> nimmt die Betriebsdauer auf
"FbLaufzeit" --> nimmt von max *3* "Geräten" die Betriebsdauer auf und aktiviert das "Gerät" mit der geringsten
Da die FBs leider nicht 1 zu 1 übernommen werden können, habe ich Probleme eine Lösung für die Aufgabenstellung zu finden. 

Habt Ihr eine Idee, wie ich das Problem anpacken kann?
Besonders auch die Zuschaltung einer weiteren Pumpe in bspw. der 2 Stufe macht mir Probleme. Wie erhalte ich denn die Pumpe mit der 2. geringsten Betriebsdauer? 
Vielleicht habe ich auch nur Probleme, weil ich versuche die Aufgabe in FUP zu lösen?!?!?

Bin über alle Informationen/Tipps/Vorschläge und natürlich Lösungen dankbar!!!!

LG
Leidi


----------



## Immergewinner (25 April 2008)

Ist das eine Hausaufgabe? 
Zeig mal deinen Lösungsansatz!


----------



## Leidi (25 April 2008)

Moin Immergewinner

Den Lösungsansatz habe ich angerissen:
Wollte eigentlich die Bausteine in FUP von Wago verwenden...bis ich gemerkt habe, dass die Realisierung darüber nicht trivial ist. 

Deshalb meine Frage nach *Informationen/Tipps/Vorschläge* und natürlich Lösungen... 

Also dann eine konkrete Frage zu Anfang von einem Greenhorn:
Ist die Realisierung über FUP überhaupt möglich. Denke, ich brauche Schleifen und Wenn/Dann-Abfragen etc. die sich wohl eher in ST umsetzen lassen, oder? 

Gruß


----------



## drfunfrock (25 April 2008)

Ich würde ST wählen. Dann je einen FB  für  die Pumpen, welche dann Betriebszeit messen und die Pumpe an und Ausschalten. Einen FB für die Verwaltung aller Pumpen, mit dem Eingang, wie viele Pumpen angeschaltet werden sollen. Und dann hat man es.


----------



## eNDe (25 April 2008)

*6 Pumpen*

Hallo Leidi,
ohne nähere Hintergrundinformationen folgender Vorschlag:
- Betrachtet wird als Beispiel der Übergang von 3 --> 4:
Schritt 1: Heraussuchen aus den derzeit stehenden Pumpen diejenige mit der geringsten Laufzeit.
Schritt 2: Gefundene Pumpe einschalten
Schritt 3: Sekundengenaue Laufzeitmessung aktualisieren. (Ausgang abfragen)
Gleiche Vorgehensweise bei den anderen Übergängen.
- Übergang "rückwärts" z.B. von 4 --> 3:
Schritt 1: Heraussuchen aus den derzeit laufenden Pumpen diejenige mit der größten Laufzeit.
Schritt 2: Gefundene Pumpe ausschalten
Schritt 3: Laufzeitmessung anhalten 
Offene Fragen:
- Bei 6 Bereichen und 6 Pumpen sind immer alle Pumpen einsatzbereit  
- Was ist an den Grenzen der Bereiche  (Hysterese oder flattern)
- Wie lange sind die Bereiche "aktiv"  (Sekunden oder Stunden)
usw.
Sprache ST wäre ideal  , FUP fast undenkbar :? 
Falls noch Hilfe benötigt wird, dann bitte nur über PN.
MfG
eNDe


----------



## repök (25 April 2008)

Also ich würds so angehen:
Baustein schreiben, der mir 
1. Pumpen überwacht (Motorschutz usw.)
2. Laufzeit misst,
3. Einschalten mit *Startbedingung* und *Betriebsbedingung

*Dann die Laufzeiten sortieren, das Stichwort heisst hier wohl *Bubbel Sort*.

So, und wenn man das dann alles hat, dann sollte es schon gehen.

Mit welcher Sprache das dann gemacht wird, ist wohl egal.


----------



## Leidi (25 April 2008)

Vielen Dank für die Antworten!!!

@eNDe: dein Beispiel ist genau richtig. An den Grenzen zu den einzelnen Stufen muss eine Hysterse ins Spiel kommen. daher habe ich den Stufenschalter von Wago in Betracht gezogen (Hysterese inbegriffen). Spiele mit dem Gedanken, die letzten beiden Pumpen zu gruppieren damit ich den Baustein verwenden kann. Einsatzbereitschaft / Überwachung der Pumpen geschieht über Hilfskontakte (Motorschütz, Auto/Manuell-Betrieb, Rep-Schalter, Thermistorschutz). Die Einsatzzeit kann ich ehrlich gesagt gar nicht genau einschätzen...wird aber eher in Richtung Stunden gehen :?
Zu deinem Angebot der Hilfe komme ich bei Bedarf gern zurück. Möchte die Aufgabe aber erst einmal selbst in Angriff nehmen.

@repök: Kannst du mit näheren Infos (besser nen Beispiel) zum Thema Bubble Sort glänzen?


----------



## Kai (25 April 2008)

Leidi schrieb:


> @repök: Kannst du mit näheren Infos (besser nen Beispiel) zum Thema Bubble Sort glänzen?


 
Gib mal in die Suchfunktion Bubblesort ein, da findest Du einige Programmbeispiele (unter anderem von mir).

Gruß Kai


----------



## repök (25 April 2008)

Also, dies Forum besitzt eine wunderbare Maschine, die sich durch den gebrauch nicht abnutzt oder beschädigt.
Und ich bin überzeugt davon, dass der Markus dir auch erlaubt sie zu benutzen.

Also: klickst du suchen

Da war der Kai mal wieder schneller!


----------



## Kai (25 April 2008)

Bei Wikipedia findet man auch den Algorithmus für Bubblesort als Pseudocode:

http://de.wikipedia.org/wiki/Bubblesort

Gruß Kai


----------



## Leidi (25 April 2008)

Waow, seid ihr schnell!!! Danke

Okay...ich bastel mir ein Array aus INTs (Betriebsstunden). Mit BubbleSort erhalte ich damit das kleinste INT. 
Aber wie ordne ich diesen Wert wiederum der Pumpe zu? Oder anders gefragt, woher weiß ich welches Betriebsstunden-INT zu welcher Pumpe gehört? Versteht Ihr was ich meine?

Und außerdem: das Array muss ja dynamisch sein. Ist ja in der nullten Stufe mit 6 gefüllt, in der ersten Stufe mit 5 gefüllt (einer ja schon aktiv) und so weiter. Wie geht nen das?

Gruß


----------



## Kai (25 April 2008)

Leidi schrieb:


> Okay...ich bastel mir ein Array aus INTs (Betriebsstunden). Mit BubbleSort erhalte ich damit das kleinste INT.
> Aber wie ordne ich diesen Wert wiederum der Pumpe zu? Oder anders gefragt, woher weiß ich welches Betriebsstunden-INT zu welcher Pumpe gehört?


 
Siehe dazu das Programmbeispiel von mir aus dem folgendem Thread:

http://www.sps-forum.de/showthread.php?t=14527

http://www.sps-forum.de/showpost.php?p=90311&postcount=7

http://www.sps-forum.de/showpost.php?p=90336&postcount=9

Gruß Kai


----------



## Leidi (25 April 2008)

Ach du sch... für nen Newbie siehts heftig aus. Aber dann weiß ich ja, womit ich mich am Wochenende beschäftige  
Aber vielen Dank...
Werde dann mal schauen, wie ich durchkomme!!!

LG und schönes WE

Gruß


----------



## drfunfrock (27 April 2008)

Ich finde Bubblesort für 6 Pumpen einen etwas zu hohen aufwand. Man benörtigt doch nur eine Schleife durch alle Pumpen und hat dann die Pumpe mit der geringsten Betriebszeit. Bubblesort dürfte einen höheren Aufwand haben, auch wenn man die CPU-Zeit betrachtet.

Zu den Datenstrukturen:

Eine Struktur für jede Pumpe in einem Array:

STRUCT pumpe
betriebsdauer : TIME,
...
END_STRUCT

allepumpen: ARRAY[1..6] OF pumpe;

Jedes instanziierte FB einer Pumbe bekommt dann als Argument genau eine Var vom Typ Pumpe überreicht. Z.B.:

pumpe1 : FB_pumpe;

pumpe1(ST_PUMPE:=allepumpen[1]);

ST_PUMPE ist dann In_Output im Kopf des FB.


----------



## Leidi (28 April 2008)

Hallo

bin da nicht abgeneigt Bubblesort zu ersetzen...bin ich nämlich nicht durchgestiegen. Habe wirklich meine Probs mit ST. Hab mich überschätzt oder ST unterschätzt 

Bin gerade dabei den Tipp von *drfunfrock* umzusetzen. Aber da scheitere ich auch wieder kläglich. Habe es bislang noch nicht 100%ig verstanden.

Ich habe mir nun 6 Funktionsblöcke gebastelt (in FUP, da ich so den WAGO-Betriebsdauer Baustein verwenden kann). Die Betriebsdauer in (VAR Output Retain REAL) und die Einschaltbedingungen (Motorschütz aus, Motorschutz aus etc. als VAR OUTPUT BOOL) werden ausgegeben. 
Ein weiterer FB wertet die jeweilige Stufe aus (auch wieder in FUP, da ich den WAGO-Baustein nutzen wollte). 5 mal Var Output BOOL für jede einzelne Stufe. (in der letzten Stufe sollen zwei Pumpen laufen)

Jetzt muss ich mir doch die 6 Betriebsdauern ins Array of struct schieben, oder??? Dazu habe ich mir nen Unterprogramm (ST) erstellt und dort das Array lokal deklariert. Aber nun komme ich nicht mehr weiter, weil ich die letzten 3 Zeilen von drfunfrock nicht verstehe





> pumpe1 : FB_pumpe;
> 
> pumpe1(ST_PUMPE:=allepumpen[1]);
> 
> ST_PUMPE ist dann In_Output im Kopf des FB.


Ganz vorsichtig gefragt: wäre es möglich mir an diesem auf die Sprünge zu helfen? Und ganz ehrlich: irgendwie fällt es mir schwer die Zuordnung (Pumpe mit geringster Betriebszeit) zu verstehen?!? 
Bin weiterhin über jeden Tipp dankbar!!!

Gruß
ein Verzweifelter


----------



## drfunfrock (1 Mai 2008)

Also, nach meinem kleinem Urlaub will ich mal wieder loslegen:

Eine Struktur ist eine Variablentype, die andere Variablen enthält und kann damit z.B. alle Variablen für eine Pumpe zusammenfassen. Um so  ein Ding anzulegen, musst du nur das linke Fenster betrachten, um dann unten den 2.Tab anzuwählen. Dann im Fenster ein Rechtsklick für ein neues Objekt und schon hast du das Grundgerüst mit struct und so weiter.

Deine Variable stundenzaehler legst du da rein und alles was für eine pumpe benötigt wird. 

STRUCT pumpe
betriebsdauer : TIME,
inbetrieb : BOOL;
END_STRUCT

Du hast dann eine neue Type, die noch in eine globale Variable angelegt werden muss. Z.B. 

VAR
  pumpe1 : PUMPE;
END_VAR

Dann kannst du z.B. schreiben:

pumpe1.zaehler := pumpe1.zaehler + T#100ms;

Aber du hast 6 Pumpen, die wir deswegen in ein Array legen:

VAR
  pumpen : ARRAY[1..6] OF PUMPE;
END_VAR

In der Funktion die die Pumpe auswählt sieht es so aus:


```
FUNCTION WaehlePumpe
VAR 
  min : TIME := -1;
  i : INT;
  pumpe := 0;
END_VAR

FOR i:=1 TO 6 DO
  if (pumpen[i].zaehler<min) AND (pumpen[i].inbetrieb=FALSE) then
    min := pumpen[i].zaehler;
    pumpe := i;
  end_if
END_FOR

WaehlePumpe := pumpe;
return;
```
Ich hoffe, dass hilft


----------

