Step 7 Strukturen an Funktionen übergeben

Kannst du mal erklären, was hier genau passieren soll?

Code:
    980:// Speichere neue Reihenfolge im Array
        WHILE #PS_Step[#i] = #Stop_B_Wechsel DO
            #PS_Step[#i] := #Start_B_Wechsel;
            #lx_Wechsel := FALSE;
            #i := 1;
            #step := 0;
        END_WHILE;
        #i := #i + 1;
      
        IF #i > 6 THEN
            #i := 0;
        END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann das überhaupt funktionieren, ich habe es nur mal kurz überflogen aber hat im Schritt 980 nicht Start_B und Stop_B die Wertigkeit 50.
Für was braucht es überhaupt die WHILE Schleife? Das hochzählen von i außerhalb der WHILE und dann wieder rücksetzen von i auf 1 innerhalb der WHILE ist mir auch etwas schleierhaft.

1666765201207.png
 
In dem Array wurde die Startreihenfolge der 5 Pumpen gespeichert. Es müssen nicht immer alle Pumpen aktiv sein.

Bsp.:
Array[0] = Pumpe 1
Array[1] = Pumpe 2
Array[2] = Pumpe 3
Array[3] = leer
Array[4] = leer

Beim Betriebsstundenwechsel wird eine nicht aktive Pumpe zugeschalten und eine Aktive Pumpe weggeschalten.

Bsp.:
Pumpe 1 wird durch Pumpe 4 ersetze

Durch die While-Schleife wird da Array nun so bearbeitet das jetzt Pumpe 4 anstelle von Pumpe 1 steht.

Array[0] = Pumpe 4
Array[1] = Pumpe 2
Array[2] = Pumpe 3
Array[3] = leer
Array[4] = leer

wenn diese Aktion beendet ist wird die While- Schleife beendet und die Zählvariable i wieder auf Anfangswert gesetzt, damit sie beim nächsten Betriebsstundenwechsel wieder von vorne Starten kann.
 
Ich frage mich auch wozu die WHILE-Schleife gut sein soll. Nach Deiner letzten Erklärung soll doch nur ein einziger Array-Eintrag geändert werden - dafür braucht es keine Schleife.

Warum ist da überhaupt eine Schleife? Was soll der Sinn davon sein? Wann soll die Schleife enden?
So wie es programmiert ist kann die Schleife nur enden, wenn #PS_Step[1] <> #Stop_B_Wechsel ist oder wird.
Soll die Schleife darauf warten daß sich #Stop_B_Wechsel durch ein "höheres" Ereignis ändert? Wird von außen mit einer höher prioren Task in die Instanzvariablen geschrieben?

Die Schleife wird entweder
- gar nicht : #PS_Step[#i] <> #Stop_B_Wechsel
- oder einmal : #PS_Step[#i] = #Stop_B_Wechsel und #PS_Step[1] <> #Stop_B_Wechsel
- oder zweimal : #PS_Step[#i] = #Stop_B_Wechsel und #PS_Step[1] = #Stop_B_Wechsel und #Stop_B_Wechsel <> #Start_B_Wechsel
- oder endlos : #PS_Step[#i] = #Stop_B_Wechsel und #PS_Step[1] = #Stop_B_Wechsel und #Stop_B_Wechsel = #Start_B_Wechsel
ausgeführt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich frage mich auch wozu die WHILE-Schleife gut sein soll. Nach Deiner letzten Erklärung soll doch nur ein einziger Array-Eintrag geändert werden - dafür braucht es keine Schleife.
Ich habe es mir jetzt auch 3x angeschaut und konnte keinen Sinn erkennen bzw. es wundert mich dass es überhaupt funktioniert.
Ich gehe auch ganz ganz schwer davon aus, dass diese paar Zeilen für den STOP verantwortlich sind.
 
Die Schleife wird nur aufgerufen nachdem beim Betriebsstundenwechsel eine Pumpe gestoppt wurde. Sprich ich habe in der Variable Stop_B_Wechsel eine Zahl stehen.
Das Array das durchlaufen wird mithilfe der Zählvariable i enthält an einer unbekannten stelle auch diese Zahl. Da die Reihenfolge in der die Pumpen zu und weggeschalten werden immer Dynamisch ist. Dazu wird auch die Schleife benötigt, da nie gesagt werden kann in welchem Speicherbereich sich mein gewünschter wert befindet.
Wenn ich den Speicherbereich mithilfe der Schleife gefunden habe wird er überschrieben mit der neu gestarteten Pumpe und die Schleife ist beendet.

WHILE #PS_Step[#i] = #Stop_B_Wechsel DO
#PS_Step[#i] := #Start_B_Wechsel;
#lx_Wechsel := FALSE;
#i := 1;
#step := 0;
END_WHILE;
#i := #i + 1;
 
Aber das Array wird doch in der WHILE Schleife nicht durchlaufen, da erst nach dem "#PS_Step[#i] = #Stop_B_Wechsel" nicht mehr erfüllt ist, die Indexvariable #i hochgezählt wird?!
Oder verwechsle ich da gerade etwas?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Array das durchlaufen wird mithilfe der Zählvariable i
Innerhalb der Schleife wird #i nur einmal auf 1 gesetzt und ändert sich dann nicht mehr. Dein #i := #i + 1 liegt ja außerhalb der Schleife, daher wird auch das Array nicht "durchlaufen" sondern immer nur #PS_Step[1] verglichen - und da kommt dann immer dasselbe raus, wodurch die Schleife endlos läuft.

Harald
 
Wenn ich den Speicherbereich mithilfe der Schleife gefunden habe wird er überschrieben mit der neu gestarteten Pumpe und die Schleife ist beendet.
Irgendwie fehlt in der Schleife dann auch noch ein IF...
Und wenn der Pumpencode nicht gefunden wird, dann läuft die WHILE-Schleife endlos.

Steht jeder Pumpencode nur (höchstens) einmal in dem Array? Dann könntest Du doch einfach mit einer FOR-Schleife das Array durchsuchen:
Code:
FOR #index := 1 TO 5 DO
  IF #PS_Step[#index] = ... THEN //gesuchter Pumpencode gefunden?
    ...   //neuen Pumpencode eintragen
    EXIT; //und Suchschleife benden
  END_IF;
END_FOR;
Dann hätte die Schleife auch ein Ende, wenn (warum auch immer) der gesuchte Pumpencode nicht in dem Array steht (nicht gefunden wird).

Harald
 
Zuletzt bearbeitet:
Innerhalb der Schleife wird #i nur einmal auf 1 gesetzt und ändert sich dann nicht mehr. Dein #i := #i + 1 liegt ja außerhalb der Schleife, daher wird auch das Array nicht "durchlaufen" sondern immer nur #PS_Step[1] verglichen - und da kommt dann immer dasselbe raus, wodurch die Schleife endlos läuft.

Harald
Es kann gut sein das ich die Funktion der While schleife falsch interpretiert habe.

Nach meinem Verständnis wird der erste Teil der Schleife durchlaufen wenn er erfüllt ist und der zweite Teil nach der Schleife wenn die Bedingung nicht erfüllt ist. Sprich solange im Array nicht der gleiche wert steht, wird i hochgezählt.

####################################erste Teil#################################
WHILE #PS_Step[#i] = #Stop_B_Wechsel DO
#PS_Step[#i] := #Start_B_Wechsel;
#lx_Wechsel := FALSE;
#i := 1;
#step := 0;
END_WHILE;

####################################zweite Teil###############################
#i := #i + 1;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgendwie fehlt in der Schleife dann auch noch ein IF...
Und wenn der Pumpencode nicht gefunden wird, dann läuft die WHILE-Schleife endlos.

Steht jeder Pumpencode nur (höchstens) einmal in dem Array? Dann könntest Du doch einfach mit einer FOR-Schleife das Array durchsuchen:
Code:
FOR #index := 1 TO 5 DO
  IF #PS_Step[#index] = ... THEN //gesuchter Pumpencode gefunden?
    ...   //neuen Pumpencode eintragen
    EXIT; //und Suchschleife benden
  END_IF;
END_FOR;
Dann hätte die Schleife auch ein Ende, wenn (warum auch immer) der gesuchte Pumpencode nicht in dem Array steht (nicht gefunden wird).

Harald
JA jeder Pumpe kann höchstens einmal im Array stehen.

Das mit der For schleife ist eine gute alternative. Das Fehlerhandlig, das der wert nicht im Array steht wurde bis jetzt noch nicht betrachtet, was durchaus zu einem Problem führen könnte bei der While schleife.
 
Nach meinem Verständnis wird der erste Teil der Schleife durchlaufen wenn er erfüllt ist und der zweite Teil nach der Schleife wenn die Bedingung nicht erfüllt ist
Es gibt bei einer While Schleife keinen zweiten Teil. Wenn die Bedingung erfüllt ist, dann "hängt" die SPS in der WHILE Schleife. Ist die Bedingung nicht mehr erfüllt, dann wird die Schleife verlassen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre der Aufbau hier dann richtig ?

WHILE #PS_Step[#i] <> #Stop_B_Wechsel DO
#i := #i + 1;

IF #i >= 6 THEN
#i := 1;
EXIT;
END_IF;
END_WHILE;

#PS_Step[#i] := #Start_B_Wechsel;
#lx_Wechsel := FALSE;
#i := 1;
#step := 0;
 
Zurück
Oben