Zwei Pumpenpaare abwechselnd + 1 Pumpe bei hohen Wasseraufkommen

Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt habe ich durch google gesehen, dass Du hier mal eine Schrittkette mit Hilfe von INT und ein SWITCH CASE Anweisung empfohlen hast.

Das wäre dann SCL - kommt aber auf das Gleiche heraus - egal ob INT- oder Merker-Schrittkette. Wenn dir SCL mehr liegt dann gerne auch so ... ;)
 
JA wir Arbeiten immer in SCL bei komplexeren Aufgaben

Also ich Versuche das mal auch für mich ein wenig runter zu schreiben:

Als erstes muss ermittelt werden Welcher Anlagen Typ verwendet wird, 2, 3 oder 2x2 Motoren.
Dann muss sortiert werden bzw. je nach welcher Motor oder 2 Motoren als letztes drann war/en den Nächsten/ die Anderen auswählen.

Code:
Initialschitt

Dann wenn eine Bedingung erreicht 
Schritt 1: Starte den einen Motor oder bei Analgentyp 2x2 den ersten Motor des Paares

Wenn eine Verzögerung abgelaufen ist
Schritt 2: Schalte den zweiten Motor des Paares ( NUR Bei Anlagentyp 2x2)

   Wenn zwischenzeitlich eine Andere Bedingung
   Parallelschritt 1: Starte weiteren Motor (NUR bei Analgentyp mit 2 oder 3 Motoren

   Wenn Abschaltbedining zusatzmotor dann 
   Parallelschritt 2: Schalte zusätlichen Motor ab

Wenn die Abschaltbediingung erreicht ist oder die MAX Laufzeit ist abgelaufen
Schritt 3: Schalte die Nachlaufzeit oder bei anlagentyp 2x2 Stoppe den 2. Motor des Paares

Wenn die Nachlaufzeit beendet ist, dann 
Schritt 4 Stoppe den Ersten Motor oder bei Anlagentyp 2x2 den zweiten Motor des Paares

Sollte die MAX Laufzeit ablaufen oder eine Störung ders Laufendes Motors (oder eines Paares), muss zwingend die Bedingung für Schritt 1erfüllt werden, damit der andere Motor, Paar einspringt.

Zusätzlich soll nach gewissen Startzyklen einstellbar nach dem Ausschalten der Motoren oder vor dem einschalten der Motoren ein Linkslauf erfolgen für z.b. 5 Sek. erfolgen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So wie ich das sehe benötigst du für jeden Motor eine eigene Schrittkette. Damit ist dann der Parallelbetrieb machbar und zwar auch so, dass sie unabhängig voneinander sind.
Welcher Motor anläuft kannst du darüber machen, dass du dir merkst welches der letzte Antrieb war - wenn Last_Motor = 1 dann muss als nächstes dann 2 anlaufen. Wenn Last_Motor = 2 und 3 Motoren vorhanden dann wäre der nächste Motor 3 sonst eben 1.
Mal unabhängig, dass ich ein großer SCL-Fan bin kann man eigentlich hier schon lesen, dass du damit auch bei SCL wahrscheinlich am Besten aufgehoben bist.
Ich denke aber mal, dass wir noch ein paar Mal hin- und herschreiben bis das finale Konzept so richtig steht ...

Gruß
Larry
 
So wie ich das sehe benötigst du für jeden Motor eine eigene Schrittkette. Damit ist dann der Parallelbetrieb machbar und zwar auch so, dass sie unabhängig voneinander sind.
...
Gruß
Larry

Das Verstehe ich nicht, ich könnt mir nur Vorstellen 2 Schrittkette für einmal bis zu 3 Motoren und eine für den Paarbetrieb.

Kann man für den Parallelbetrieb nicht eine Art Leerschritt machen und die Aktion nur ausführen wenn Parallelbetrieb aktiv in der einen Schritt kette genauso ein Schritt für den Linkslauf vor und nach dem Vorgang und je nachdem was aktiviert ist, dann auch den Linkslauf einschalten?

Vor allem möchte ich auch alles möglich nur einmal schreiben müssen und verwenden wie Methoden aufrufen...
 
Dann wollen wir mal im Psuedo Code starten

Haupt Schrittkette:

Code:
// Schritt 1
IF Einschaltpunkt THEN
   Schritt_1 := TRUE;
   Motor : = TRUE;
END_IF;

// Shritt 2 leerschritt
IF Schritt_1 AND NOT Parallelbetrieb_aktiviert THEN
   Schritt_1 := FALSE;
   Schritt_2 := TRUE;
END_IF;

//Alternativweg wenn Parallebetrieb aktiviert
IF (Schritt_1 AND Parallelbetrieb_aktiviert AND Einschaltbedinung_Parallel ) OR SPRUNG THEN
   Schritt_1 := FALSE;
   Schritt_2a := TRUE;
   Zusätlicher_Motor := NOT SPRUNG;
END_IF;

// Parallelbetrieb ausschalten
IF (Schritt 2a AND Ausschaltbedinung) OR SPRUNG THEN
   Schritt_2a := FALSE;
   Schritt_3 := TRUE;
   Zusätzlicher_Motor := FALSE;
   IF Linkslauf_Zusätzliher_Motor AND NOT SPRUNG THEN
      Zusätzlicher_Motor_Links := Schritt_6;
      TOF_Linkslauf_Zusatz(IN:= Zusätzlicher_Motor_links, PT: t#5s);
   END_IF;
END_IF;

// Jetzt kommt meine Frage, Parallelbetrieb ist Möglich muss aber nicht vorkommen, 
// wie kann man jetzt von Schritt 2a und oder 3 zu Schritt 4 Springen wenn eine Bedinnung erfolgt?

// Schritt 4
IF Schritt_2 OR Schritt_2a OR SPRUNG THEN
   Schritt_3 := FALSE;
   Schritt_2 := FALSE;
   Schritt_4 := TRUE;
   Starte_Nahchlauf();
END_IF;

// Schritt 5
IF Schritt_4 AND Nachlauf_abgelaufen THEN
   Schritt_4 := FALSE;   
   Schritt_5 := TRUE;   
   Motor  := FALSE;
END_IF;

// Schritt 6 leeschritt
IF Schritt_5 AND NOT Linkslaufbedining THEN
   Schritt_5 := FALSE;
   Schritt_6: = TRUE;
END_IF;

// Schriit_6a Linkslauf
IF Schritt 5 AND Linkslaufbedining THEN
   Schritt_5 := FALSE;
   Schritt_6 := TRUE;
   Motor_Links := Schritt_6;
   TON_Linkslauf(IN:= Motor_links, PT: t#5s);
END_IF;

IF Schritt_6 OR (Schritt_6a AND TON_Linkslauf.Q) THEN
   Schritt_6 := FALSE;
   Schritt_6a := FALSE;    
   INITIALSCHITT := TRUE;
END_IF;

Das Wäre jetzt erstmal für 2 bis 3 Motoren der Pseudo code. Wie ich jetzt einen Linkslauf() vor Schritt 1 oder nach Schritt 5 Umsetze weiß ich nicht genau, ich habe es mal probiert nach dem Motorlauf jeweils, des 1. und 2. angefoerderten Motors.

EDIT: Sprung selber versucht umzusetzen...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich dachte, du wolltest eine SELECT-Schrittkette machen ... nun ist ja doch eine Merker-Schrittkette ... 8) ;)
Egal !
Ich gehe eigentlich so vor, dass ich mir die Schrittkette immer erst graphisch erstelle. So runterschreiben klappt bei mir meißt nur bei relativ einfachen Abläufen.

Was soll "Sprung" darstellen ?
Beschreib mir doch mal genau, was so passieren soll in welcher Reihenfolge ...

Gruß
Larry
 
Ja von mir aus auch eine Select Schrittkette, nur habe ich sowas nicht nur gemacht.

Sprung soll eine Bedingung sein, wenn der Parallelbetrieb zwar möglich ist aber nicht immer aktiviert werden muss weil die Ausschalt Bedingung des 1. Motors greift. Welche die Transition für das beginnen der Nachlaufzeit ist.

Soll heißen dass der Parallelbetrieb nur benötigt wird, wenn der 1. Motor nicht reicht.

Prinzipiell Frage ich mich auch wie ich den Linkslauf beliebig vor dem Vorgang oder nach dem Vorgang mit einer Methode einfach Aufrufe.

So langsam bin ich immer mehr verwirrt 😕

Danke für deine Unterstützung
 
Ich beschreibe mal was ich verstanden habe :
- du hast 2 (oder 3) Motoren, die erstmal im kontinuierlichen Wechsel laufen sollen (damit ihre Auslastung insgesamt ungefähr gleich ist)
- wenn ein bestimmter Pegel erreicht wird dann schaltet sich die Pumpe, die als nächstes dran wäre ein
- diese Pumpe schaltet sich ab, wenn der Pegel wieder unterschritten wurde
- wenn eine maximale (vorgegebene) Laufzeit überschritten wurde - dann jedoch soll die nächste Pumpe weitermachen
- außer es ist 2-Pumpen-Modus angewählt - dann machen beide weiter bis Pegel wieder unterschritten
- wenn die nächste Pumpe übernimmt dann verfährt die genauso wie die vorhergehende ? ... oder macht die dann bis Pegel wieder OK ? (Ich fände es witziger wenn die sich so verhalten würde wie die vorherige)

was ich hier nicht verstanden habe ist die Geschichte mit der Rückwärtsfahrt (Linkslauf) - wofür ist das gedacht ? ... und wann soll das passieren ? (wahrscheinlich wenn überhaupt dann wenn keine Pumpe mehr aktiv ist ?)

Das 2x2-Szenario wäre einfacher (aber ein eigenständiger Zweig der Schrittkette).
S0 = warten
- wenn Pegel erreicht und nicht Ablauf 1-2 dann gehe nach S1
- wenn Pegel erreicht und Ablauf 1-2 dann gehe nach S5

S1 = Pumpe 1 Ein // Start Timer // setze Ablauf 1-2
- wenn Timer abgelaufen dann
S2 = Pumpe 2 Ein
- wenn Pegel unterschritten dann
S3 = Pumpe 1 Aus // Start Timer
- wenn Timer abgelaufen dann
S4 = Pumpe 2 Aus // Start Timer
- wenn Timer abgelaufen dann gehe nach S0

S5 = Pumpe 3 Ein // Start Timer // rücksetze Ablauf 1-2
- wenn Timer abgelaufen dann
S6 = Pumpe 4 Ein
- wenn Pegel unterschritten dann
S7 = Pumpe 3 Aus // Start Timer
- wenn Timer abgelaufen dann
S8 = Pumpe 4 Aus // Start Timer
- wenn Timer abgelaufen dann gehe nach S0

Aber : welche Funktion hat bzw. wo greift hier die Laufzeitkontrolle ? Was ist hier mit dem Linkslauf ?

Jetzt bist du wieder dran ... 8)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal vielen vielen Dank .

Ich versuche es Mal zu beschreiben wobei ich da nicht der beste bin, jedoch Übung macht den Meister.

Also, je nach der Hydraulik ist ein Parallellauf möglich oder nicht. Und das auch nur wenn 2 oder 3 Pumpen gibt.

Machen wir es simple für den Anfang und gehen davon aus , dass Parallelbetrieb möglich ist und es nur 2 pumpen in der Anlage gibt. Dann gibt es 3 Pegel:

Einschalt, Ausschalt und parallel.

Normalerweise ist es so, dass Parallelbetrieb sehr selten vorkommt.

Also wird abwechselnd eingeschaltet und wieder ausgeschaltet. Beim Ausschalten greift eine Nachlaufzeit.

Erreicht die Pumpe ihre max Laufzeit wird diese abgeschaltet und eine Pausenzeit zählt runter.

Damit die nächste Pumpe starten kann muss zwingend der einschaltpegel erreicht werden und die Pausenzeit ablaufen.

Steigt beim normalen Vorgang der Pegel bis zum Parallelpunkt, dann startet die zweite Pumpe hinzu. Bis der Pegel des Einschaltpunjtes unterschritten ist. Es kann aber sein, dass der Pegel für den Parallelbetrieb nie eintrifft also müssen die Schritte eben übersprungen werden weil die eine Pumpe den Pegel zum ausschaltpunkt gesenkt hat. Die Bedingung für den Sprung wäre hier, dass der ausschaltpunkt erreicht ist. Also in diesem Vorgang kein Parallelbetrieb nötig war

Der Linkslauf ist auch optional und soll entweder nach oder vor einem Durchgang passieren, je nachdem nach eingestellten Zahl von Startzyklen.

So die Punkte des pegels bekomme ich aus einem Füllstandbaustein. Welches ich als Interface über inout einlese.

Die Zustände der pumpen auch über Inout Array of Pumps udt.

Jetzt will ich es so programmieren, dass es 1. Einfach zu warten ist,
2. Einfach erweitern.
3. Einfach zu lesen ist.

Am besten modular aufrufen zum Beispiel , Linkslauf()
Das Abfragen welche Pumpe dann ist bzw. Hinzuschaltet.
Etc.

Eine andere Frage ist, gibt es eine schnelle Möglichkeit nur diesen Teil vom Programm zu testen ohne es in den Programm selber zu testen sondern, in eine Art von Testprogramm.

Und wenn ja wie geht ihr da vor? Teste ihr mit den forcieren der Werte oder baut ihr Simulations Bausteine? Oder gibt es eine andere smarte Simulationsumgebung in tia?
 
Nach dieser Beschreibung würde ich jetzt auf jeden Fall jeder Pumpe einen eigenen Ablauf spendieren ...
Die Wahl, welche Pumpe sich zunächst zuständig fühlt kannst du über eine Variable machen, die speichert (z.B.) welche Pumpe zuletzt aktiv war.
Im Falle, dass du jeder Pumpe einen eigenen Ablauf spendierst kannst du das so machen, dass dann auch jede Pumpe einen eigenen Baustein hat - eine neue Instanz desselben FB's z.B. So ist es dann vollkommen egal, wieviele Pumpen du an den Start bringen willst. Du instanzierst halt einfach noch eine weitere dazu ...

Wie gut es zu warten, erweitern und lesen ist hängt schwer davon ab, wieviel Mühe du dir mit der Doku gibst - aber auch wie klar die Abläufe dargestellt sind.

Das Testen (auch im "Trockenen") sollte bei den wenigen Signalen, die du hier hast, nicht so das Problem sein - das solltest du schon mit PLCSim hinbekommen ... Es geht aber auch mit ein paar Schaltern und Lämpchen - ganz nach Geschmack ... oder du baust dir ein Äquivalent dazu auf deiner Visu auf - ist vielleicht auch ganz nett ...

Gruß
Larry
 
Also was ich nicht versteh wie du das meinst, dass jeder Pumpe einen eigenen Ablauf hat.

Wie gesagt, je nachdem wie viele pumpen es gibt, erstelle ich ein Instanzen für eine Pumpe . Dieser Baustein kümmert sich jedoch nicht für die Steuerung sondern bekommt Eingänge für den Automatik Anforderung, Hand, Störungen etc. Und setzt diese um.

Die Pumpe kann entweder geregelt sein oder ein Direktantrieb mit einfacher Freigabe.

Und sollte dann auch für andere Zwecke verwendet werden können.

Daher binde habe ich vor im DB der Pumpensteuerung das udt als inout an und steuerue die jeweilige Pumpe ob sie rechts, links oder in Pause ist. Etc

Innherlb der Pumpensteuerung FB möchte aber den oben beschrieben Vorgang steuern können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie gesagt, je nachdem wie viele pumpen es gibt, erstelle ich ein Instanzen für eine Pumpe . Dieser Baustein kümmert sich jedoch nicht für die Steuerung sondern bekommt Eingänge für den Automatik Anforderung, Hand, Störungen etc. Und setzt diese um.

Die Pumpe kann entweder geregelt sein oder ein Direktantrieb mit einfacher Freigabe.

Das ist vollkommen OK so und macht für mich auch Sinn ...

Innherlb der Pumpensteuerung FB möchte aber den oben beschrieben Vorgang steuern können.

Was spricht nun aber dagegen, die Abläufe auch einzeln zu betrachten ?
Es läuft ja erstmal (so wie du es beschrieben hast) jede Pumpe für sich.
Arbeitet nun z.B. Pumpe 1 UND es wird der 3. Pegel erreicht dann sollte Pumpe 2 mit ins Rennen kommen - dies wäre dann also eine mögliche Startbedingung für den Ablauf von Pumpe 2, der ja, so wie aussieht, ansonsten identisch mit dem vom Pumpe 1 ist.
Die Weiterschaltbedingung vom Initialschritt des Ablaufs von Pumpe 2 könnte also z.B. sein :
Code:
U -Pumpe_2_ist_dran_mit_arbeiten
U -Einschaltpegel_erreicht
O
U -Pumpe_1_arbeitet_schon
U -Zuschaltpegel_erreicht
Genauso würde es bei jeder anderen Pumpe ja aussehen. Wäre nun dein Ablauf ein FB dann könnten diese einzelnen Bits IN-Parameter von dem Baustein sein ...

Kannst du mir folgen ?

Gruß
Larry
 
Also meinst du mit eigenen Strang ein Pumpenvorgang (Start, Ende) einer Pumpe. Ok das verstehe ich!.

Was ich nicht verstehe ist, wie du in den vorherigen Posts geschrieben hast von Schritt 0 Entwerder zu S1 oder S2 spingst, meinst Du da einen alternativen Pfad?

Mir ist aufgefallen, dass ich keinen alternativen Pfad/Strang sondern einen Parallelen brauche.
Denn wenn die Einschaltbedingung für 1 Pumpe kommt kann ja der Strang für die zusätzliche Pumpe auch aktiv werden mit einem Leerschritt.
Dann warte ich einfach auf die Bedingung für die zweite Pumpe im paralleln Strang und wenn die nicht kommt dann springe ich raus.

Nur dieses Springen im CASE wüsste ich nicht wie ich es machen sollte. Ich würde mir einen Abrrechen, mit verscheiden Merkern in dem DB.

Ich schreib das jetzt mal runter:

Transitionen:
Wenn S0 und Pegel 2
dann S1 und -S1a (falls Parallelbetrieb eingestellt)

Wenn (S1 oder S2a )und Pegel 1
dann S2

Wenn (S2 und 5s abgelaufen) oder (MAX Laufzeit und nicht Parallelaktiv)
dann S3

Wenn Anforderung Linkslauf nach Vorgang
dann S4

Wenn kein Linkslauf
dann S0

Wenn S4 und 5s abgelaufen
dann S0

Wenn S1a und Pegel 3
dann S2a

Aktionen:
S0 = Initialschritt
S1 = Starte erste Pumpe; starte Laufzeit,
S2 = Starte Nachlaufzeit, rucksetze Laufzeit
S3 = Stoppe erste (und wenn Parallelbetrieb die zweite Pumpe), rücksetze parallelaktiv
S4 = Linkslauf

S1a = Starte Leeschritt parallel
S2a = Starte zweite Pumpe, setze Parallelaktiv

so in der Art.

Sollte linkslauf angefordert werden vor S1 oder S2a dann muss nach dem Linkslauf eine Pausenzeit aktiv werden.
eine Pausenzeit muss auch aktiv werden wenn eine Pumpe ihre MAX Laufzeit erreicht hat.

Wie Ihr seht, habe ich schon einen Plan weiß aber nicht wie man OPTIONALE Schritte oder Schrittketten (Linkslauf und Parallelbetrieb) in einem GRAFCET darstellt und in SCL Programmiert ohne sich ein abzubrechen mit 1000 von Merkern.

Eine Idee die ich noch gerade in dem Sinn gekommen ist, zumindest bei Linkslauf den die Kette nicht als option aber einfach den Laufzeit für den Linkslauf t#0s zu setzen wenn der Linkslauf nicht angefordert wird.

Gruß
Mike
 
Zuletzt bearbeitet:
So langsam kommen wir uns näher ;)

Du brauchst keinen parallelen Pfad - es reicht ein alternativer Pfad. In dem einen Fall startest du nur die eine Pumpe (kein Parallelbetrieb) im anderen Fall gehst du in den Alternativschritt und startest dort beide Pumpen.

Wenn du irgendwann einmal auf eine SELECT-Schrittkette gehen willst dann solltest du das mit dem S1a lassen - ein "a" kannst du mit einer INT-Variablen nicht wirklich darstellen - das muss dann auch wieder eine Zahl werden. Warum nicht S1 und als Alternative S2 (statt S1a) ?

Zur Schrittkette (das ist jetzt aber quick-and-dirty) :
Code:
SELECT CASE Schritt_aktiv
   0:
      IF Pegel_2 AND NOT Parallelbetrieb then Schritt_aktiv := 1 ; END_IF ;
      IF Pegel_2 AND Parallelbetrieb then Schritt_aktiv := 2 ; END_IF ;
   1:
      IF Pegel_1 AND NOT Pegel_2 then Schritt_aktiv := 3 ; END_IF ;
   2:
      IF Pegel_1 AND NOT Pegel_2 then Schritt_aktiv := 3 ; END_IF ;


// usw.
END_SELECT;
Die Aktionen selbst würde ich nicht innerhalb der Schrittkette umsetzen sondern dahinter ... also ungefähr so :
Code:
Start_Pumpe_1 := (Schritt_aktiv = 1) ;
Start_Pumpe_2 := (Schritt_aktiv = 1) or (Schritt_aktiv = 2) ;

Hilft dir das weiter ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achso, also nicht mit Setzen der Pumpenfreigaben sondern nur Freigeben solange ein Schritt aktiv ist?

Das Problem ist, dass der Parallelbetrieb nach dem Einschalten der ersten Pumpe erfolgen kann (nicht muss) und nicht beide Pumpen gleich Starten.
Sondern erst eine, dann wenn die nicht ausreicht die zweite.

Wie werden denn optionale Schritte realisiert?
 
Wie werden denn optionale Schritte realisiert?
Ich würde an jedem Schritt, an dem das möglicherweise geschehen kann, eine Parallel-Verzweigung machen - immer in Abhängigkeit mit dem Parallelbetrieb ...
Du solltest dieses Konstrukt dann aber AUF JEDEN FALL auch graphisch dokumentieren (es muss jetzt nicht GRAPH sein), weil es dir ja wichtig war, dass man auch später da noch durchsteigen kann.
(Ich habe meine Schrittketten immer mit einem ECad-Programm gezeichnet)

Gruß
Larry
 
So erstmal vielen vielen Dank..

Ich werde die switch Case Anweisung nehmen. Alles in einer..

Benötige ich am Anfang einen links Lauf springe ich von Schritt 0 zu 1

Wenn nicht dann da wo der normale Vorgang begibt z.b. Schritt 4

Ist Schritt 4 aktiv abpumpvorgang und eventuellen Parallelbetrieb aktivieren.

Dann gehe ich weiter bis zum Schluss und wenn da ein Linkslauf gefordert wird durchlaufe ich die Kette weiter sonst springe ich zu Schritt 0.

So ist alles zentralisiert und modular aufgebaut. Weil ich für zum Beispiel den Linkslauf in einer eigenen Funktion aufrufen kann und per inout sogar die Pumpe, die linksfahren soll übergeben.

So langsam wird ein Schuh raus!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist das Wasservorkommen zu hoch und Niveau 3 wird erreicht lauft eine weitere Pumpe des jeweiligen anderen Pumpenpaares an, welche die weinigsten Betriebsstunden aufweist.
Eine Störumschaltung der Pumpenpaare soll natürlich auch implementiert werden.
Wie stark soll die "PaarBindung" denn sein und was bezwecken? Ist sie überhaupt sinnvoll/nötig?

Wenn Niveau 3 erreicht wird, wird sie ja ohnehin gelockert: "... läuft 1 weitere Pumpe des anderen PumpenPaares ...", also nicht das komplette andere Paar.

Laut Beitrag #6 sind aus 3 Niveaus plötzlich 10 geworden, 5 für NormalBetrieb und 5 für ReinigungsBetrieb.
Hast Du 10 SchwimmerSchalter oder 1 analoge PegelMessung (ggfs kombiniert mit SchwimmerSchaltern)?

StörUmschaltung: Wodurch? Meldekontakte von Motorschutzschaltern? StörMeldungen von Umrichtern?
Evtl. noch manuelle Vorgaben angedacht, um einen Motor stilllegen zu können?

RichtungsUmkehr: WendeSchützSchaltung? Umrichter? Digitale oder analoge Schnittstelle zum Antrieb?

Die Pumpe kann entweder geregelt sein oder ein Direktantrieb mit einfacher Freigabe.

Und sollte dann auch für andere Zwecke verwendet werden können.
Für andere Zwecke??? Z.B.? Pumpe als "Turbine" und PumpenMotor als Generator?

Welche Strategie soll verfolgt werden, wenn der Einsatz von Pumpen gefordert wird, die (vorübergehend) nicht einsatzfähig sind?
So richtig nennenswerte Reserve für "NotFälle" scheint bisher nicht eingeplant zu sein. In der Variante "paarweiser Betrieb von Pumpen" sind die AusweichMögklichkeiten zudem für meinen Geschmack zu sehr und unnötig eingeschränkt.

Wozu dienen die "ZwangsPausen" zwischen den BetriebsZeiten verschiedener Pumpen?
In welcher GrössenOrdnung liegen diese PausenZeiten?
Wie kritisch ist das Einhalten der vorgegebenen Pegel? Werden die Pausen zu einem unerwünschten/vermeidbaren Überschwingen führen?

Bevor Du Dir Gedanken über Details der eierlegenden WollMilchPumpenSchrittketten machst, solltest Du einmal abklopfen, über welche Schnittstellen das Werk mit der "AussenWelt" verbunden werden soll.
Werden die Pegel (Niveaus) über digitale und/oder analoge Werte gemeldet?
Welche Informationen/RückMeldungen stehen zur Verfügung, z.B. bezüglich der EinsatzFähigkeit der einzelnen Pumpen?
Werden die PumpenMotoren über digitale und/oder analoge Werte angesteuert (Links- und RechtsLauf berücksichtigen)?

Und abklopfen, welche TeilAufgaben die Software bewältigen soll und wie die Schnittstellen zwischen diesen TeilAufgaben aussehen sollten.
Ich sehe folgende TeilAufgaben:
- Bearbeitung der ZeitWerte (BetriebsStunden, aktuelle LaufZeiten, Zeit seit dem letzten Abschalten einer Pumpe, ... , falls keine Timer verwendet werden, hier auch den TimerErsatz verwalten).
- Auswertung der NiveauMeldung[en]. Ermittlung, wieviele Pumpen laufen müssen (für PumpenPaare evtl. die minimale Anzahl Pumpen von 1 auf 2 umbiegen).
- Vergleich des Soll- und Istwertes der Anzahl laufenden Pumpen. Muss eine Pumpe hinzugeschaltet oder abgeschaltet werden?
Der IstWert muss "manipuliert" werden: ist für eine Pumpe ein Einsatz vorgegeben, pausiert sie aber gerade, so muss sie trotzdem als laufend erfasst werden.
- Entscheidung, welche Pumpe hinzugeschaltet/abgeschaltet wird.
- Ansteuerung einer Pumpe. Muss/darf eine LinksLaufPeriode eingefügt werden? Ist eine Einschalt-/AusschaltVerzögerung erforderlich (z.B. für PumpenPaar)?

Eine Anwendung von SchrittKetten sehe ich allenfalls bei entweder der letzten oder vorletzten TeilAufgabe, jenachdem, wo LinksLauf bzw. PausenZeiten realisiert werden.
Auf jeden Fall würde ich es vermeiden, auch solche TeilAufgaben mit Gewalt in die SchrittKetten hineinzuzerren, die dort nichts zu suchen haben und unnötig die Komplexität aufblähen würden.

Eine "StörUmschaltung" als solche separat zu realisieren, halte ich für überflüssig. Diese wird "automatisch" wirksam, wenn durch Ausfall einer BetriebsBereitschaft der Vergleich zwischen Ist- und SollAnzahl der fördernden Pumpen plötzlich verändert wird.
Allenfalls für den Betrieb von PumpenPaaren wird es etwas komplex - darum nochmal die Frage: muss das wirklich sein? Das bringt nur mehr Aufwand für weniger (Ausweich-)Möglichkeiten.
 
Verdammt!!!

Ab Beitrag 15 ist es ein anderes Projekt!!!

Vielleicht sollte da ein Moderator zwei Threads raus machen?
 
So sieht Sie jetzt aus die Schrittkette


Code:
REGION Schrittkette
    CASE #statAktuellerSchritt OF
        0:  // Schritt 0 = Grundstellung
            IF #Einstellungen.Anlagentyp < 2 THEN                          // Anlagentyp 2 bis 3 Pumpen
                #statAktuellerSchritt := 1;
            ELSE                                            // Anlagentyp 2x2 Pumpen
                #statAktuellerSchritt := 200;
                ;
            END_IF;
            
        1:  // Linkslauf falls Anforderung
            IF Einschaltunkt erreicht THEN
                IF Linkslauf THEN
                    // Aktiviere Linkslauf
                    #statAktuellerSchritt := 2;
                ELSE
                    // Springe zum normalen Vorgang
                    #statAktuellerSchritt := 4;
                END_IF;
            END_IF;
        2: // Starte Linkslauf
            IF Timer Beendet THEN
                #statAktuellerSchritt := 3;
            END_IF;
        3: // Pause Linkslauf
            IF Pause Beendet AND einschaltpunkt erreicht
            THEN
                #statAktuellerSchritt := 4;
            END_IF;
        4: //  Pumpvorgang      
            IF MAX Abgelaufen THEN
                #statAktuellerSchritt := 5;
            ELSIF Ausschaltbedingung THEN
                #statAktuellerSchritt := 6;
            ELSIF Parallelbedingung THEN
                #statAktuellerSchritt := 70;
            END_IF;
            
        70: // parallel
            IF Abschaltbedingung THEN
                #statAktuellerSchritt := 6;
            END_IF;
        5: // PAUSE Nach Abschaltung
            IF Pause Beendet THEN
                #statAktuellerSchritt := 0;
            END_IF;
            
        6: // Nachlaufzeit
            IF Nachlaufzeit Beendet THEN
                IF Reversion THEN
                    #statAktuellerSchritt := 7;
                ELSE
                    #statAktuellerSchritt := 0;
                END_IF;
            END_IF;
        7: // Pausenzeit VOR Revision
            IF Pause vor Revision durch THEN
                #statAktuellerSchritt := 8;
            END_IF;
        8:
            //Revision
            IF Revision Zeit durch THEN
                #statAktuellerSchritt := 0;
            END_IF
            ;
        ELSE  // Statement section ELSE
            #statAktuellerSchritt := 0;
    END_CASE;
END_REGION
 
Zurück
Oben