FOR Schleife

der_NooB

Level-2
Beiträge
131
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Grüßt euch! Also, ich versuche, mir alles selbst beizubringen, und ihr seid quasi meine Lehrer😁, obwohl ich schon einen SPS-Kurs hinter mir habe. Aber das reicht nie aus, und ich bin neu bei CODESYS sowie in der ST-Programmiersprache.

Also, ich bin gerade dabei, eine Übung mit einer For-Schleife zu lösen, aber ich habe sie bestimmt schon zehn Mal gelesen wie For-Schleife funktioniert vllt habt ihr gute Beispiele oder Seiten. Das Verständnis ist gut, aber die Umsetzung ist schwer (immer beim ersten Mal).😅

so die wollen von mir
An einem Kran befinden sich fünf Lastaufnehmer. Die Lastaufnehmer sind jeweils mit einem analogen
Eingang verbunden und liefern Werte im Bereich von 0 bis 32767. Um die Gesamtlast sowie den Durch-
schnittswert zu ermitteln, müssen die Einzellasten zuerst summiert und durch die Anzahl der Lastaufneh-
mer dividiert werden. Lösen Sie die Aufgabe mit Hilfe einer FOR-Schleife.


und die Variable sind das
VAR
aWeights : ARRAY [0..4] OF INT;
iCnt : USINT;
sumWeight : DINT;
avgWeight : INT;
END_VAR


wie soll das funktionieren, bin dankbar für jede Hilfe.
 
Du definierst Dir eine Laufvariable. Oft wird i oder x genommen.

Die FOR-Schleife an sich ist ja simpel aufgebaut:


FOR i:=STARTWERT TO ENDWERT DO
...
END_FOR

wenn Du nicht mit Schrittweite 1 hochzählen willst, schreibst Du
FOR i:=STARTWERT TO ENDWERT BY SCHRITTWEITE DO
...
END_FOR

Jetzt wird in EINEM Zyklus (wichtig: Wenn die Schleife zu lange zählt, kann deine Zykluszeit zu lang werden!) die Schleife durchlaufen, und zwar gestartet bei STARTWERT und so lange, bis i größer als ENDWERT ist. ENDWERT ist inklusive.
Standardmäßig in 1er Schritten, sonst mit SCHRITTWEITE.

Innerhalb der Schleife hast Du i mit dem aktuellen Zählerstand zur Verfügung, um z.B. auf Arrays zuzugreifen: aWeights[i].

Viel mehr möchte ich jetzt nicht schreiben, um Dir die Aufgabe nicht zu leicht zu machen ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eigentlich ganz einfach (Ja, ich weiß, das ist mein Lieblingsspruch).
Du gehst in einer FOR-Schleife das Array Schritt für Schritt durch und addierst die einzelnen Gewichte oder genauer die Werte des analogen Eingangs, denn Gewichte sind das wohl eher nicht, aus aWeights in sumWeight, als Zähler wird iCnt für die FOR-Schleife genutzt.
Vor der FOR-Schleife muss sumWeight erst auf 0 gesetzt werden.
Am Ende die Summe sumWeight durch 5 teilen und dann der Variablen avgWeight zuweisen, aber vorher noch das Ergebnis richtig konvertieren.
 
Eigentlich ganz einfach (Ja, ich weiß, das ist mein Lieblingsspruch).
Du gehst in einer FOR-Schleife das Array Schritt für Schritt durch und addierst die einzelnen Gewichte oder genauer die Werte des analogen Eingangs, denn Gewichte sind das wohl eher nicht, aus aWeights in sumWeight, als Zähler wird iCnt für die FOR-Schleife genutzt.
Vor der FOR-Schleife muss sumWeight erst auf 0 gesetzt werden.
Am Ende die Summe sumWeight durch 5 teilen und dann der Variablen avgWeight zuweisen, aber vorher noch das Ergebnis richtig konvertieren.
So genau wollte ich es ihm nicht vorkauen, da ist die Aufgabe ja fast schon gelöst ;)
 
Hilft es Dir, wenn das nochmal in menschlichen Worten geschrieben wird?

aWeights --> Hier sind Deine 5 Gewichte drin
iCnt --> Zählervariable für die FOR-Schleife
sumWeight --> Summe, gebildet in der Schleife
avgWeight --> Durchschnittsgewicht


PROG
Setze sumWeight auf 0
Setze avgWeight auf 0

Starte FOR Schleife bei 0, laufe bis 4
Addiere aWeights (identifiziert mit der Laufvariablen der FOR-Schleife) zu sumWeight hinzu
Ende der Schleife

sumWeight enthält nun die Summe aller Gewichte. Teile diese durch 5 (weil 5 Gewichte).
Weise das Ergebnis avgWeight zu
END_PROG

Hilft Dir das, das in Code umzusetzen?
 
Guten morgen 😬

Ihr denkt bestimmt dass ich es geschafft habe, aber leider muss ich euch enttäuschen 😞
ich denke nur noch paar kleine Fehlern oder ?

und glaubt mir mit mir gibt es keine Übertreibung 🤭

danke euch ^_^
 

Anhänge

  • 12.png
    12.png
    70,2 KB · Aufrufe: 29
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten morgen 😬

Ihr denkt bestimmt dass ich es geschafft habe, aber leider muss ich euch enttäuschen 😞
ich denke nur noch paar kleine Fehlern oder ?

und glaubt mir mit mir gibt es keine Übertreibung 🤭

danke euch ^_^
Bitte lies Dir die Abschnitte zur Benutzung von For-Schleifen und Arrays durch oder schau mal in der Codesys Hilfe nach.
Was Du da machst ist totaler Blödsinn. Das Schlüsselwort ARRAY hat zum Beispiel bei der For-Schleife nichts zu suchen und innerhalb der Schleife greifst Du falsch auf das Array aWeights zu.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich denke nur noch paar kleine Fehlern oder ?
Hast du diese Lösung frei erfunden oder wie kommst du auf diesen Code?

Mal als Ansatz:
Code:
iCnt := 0; // brauchst du nicht
sumWeight := 0;

FOR iCnt 0 TO 4 DO
    sumWeight := sumWeight + aWeights[iCnt];
END_FOR;

avtWeight := sumWeight /5;

Alternativ:
Code:
 sumWeight := aWeights[0] + aWeights[1] + aWeights[2] + aWeights[3] + aWeights[4];
 
Nein ... das ist es nicht ...
Mir ist aufgefallen, dass du oft Hilfe sehr frei interpretierst.
Erst einmal gibt es zu wirklich Allem Beispiele - auch und vor Allem hier im Forum. Naja ... und dann ist "ein ganz bisschen" Mitdenken manchmal auch nicht schlecht.
Dein Code im Beitrag #8 hat so gar nichts mit Olivers Erklärung zu tun.
Mein Statement hat jetzt übrigens nicht mit "nicht helfen wollen" zu tun - sondern genau im Gegenteil ...
 
Das Problem ist, ihr seid Profis, und ich beschäftige mich erst seit ein paar Wochen mit Codesys und ST
Bitte nicht einfach darauf losprogrammieren so wie man "sich das selber vorstellt". Es gibt hier genug Beispiele, du hast das Buch, es gibt die Programmhilfe...

Wenn du sowas schreibst:
1713943933652.png
dann hast du es nicht verstanden. Und tippe jetzt bitte nicht einfach den Code runter, den ich geschrieben habe sondern versuche dir wirklich mal Gedanken zu machen "was passiert da und wie kann ich das beeinflussen, nutzen und für meine Bedürfnisse anpassen".
 
Guten morgen 😬

Ihr denkt bestimmt dass ich es geschafft habe, aber leider muss ich euch enttäuschen 😞
ich denke nur noch paar kleine Fehlern oder ?

und glaubt mir mit mir gibt es keine Übertreibung 🤭

danke euch ^_^
Auch Codesys hat wohl eine eingebaute Hilfe.. wenn nicht gibt es noch die Online Hilfe von Codesys, an diese darf man sich auch gerne wenden.

Dort gibts sogar ein Beispie wie eine For Schleife auszusehen hat:



vllt habt ihr gute Beispiele oder Seiten. Das Verständnis ist gut, aber die Umsetzung ist schwer (immer beim ersten Mal).😅
Google, das Forum, die Codesys Hilfe.. es gibt zu allem irgendwo ein Beispiel.. man muss sich nur fünf Minuten hinsetzen und suchen, auch wenn ein Thread aufmachen und drauflos programmieren ohne Sinnigkeit einfacher erscheint.
 
Auch Codesys hat wohl eine eingebaute Hilfe.. wenn nicht gibt es noch die Online Hilfe von Codesys, an diese darf man sich auch gerne wenden.

Dort gibts sogar ein Beispie wie eine For Schleife auszusehen hat:


bei mir kommt immer diese Seite, was du geschickt hast, ist viel besser und übersichtlicher.
ist das auch F1?
danke
Google, das Forum, die Codesys Hilfe.. es gibt zu allem irgendwo ein Beispiel.. man muss sich nur fünf Minuten hinsetzen und suchen, auch wenn ein Thread aufmachen und drauflos programmieren ohne Sinnigkeit einfacher erscheint.
Mach ich :)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
hat funktioniert, und nein @DeltaMikeAir ich habe es nicht von dir kopiert, ich habe F1hilfe gelesen und was ihr geschrieben habt, und könnte alleine es schaffen
danke euch allen

@oliver.tonn Bestimmt wirst du mir sagen, ob ich den Abschnitt gelesen habe, in dem steht, dass ich keine große Variable in eine kleine konvertieren soll. Es könnte etwas verloren gehen, wenn die Zahl höher wird
aber bei dem ist ja /5.
so groß wird nicht sein, da auch mein Array von Typ INT ist
oder ^_^
 

Anhänge

  • ll.png
    ll.png
    76,5 KB · Aufrufe: 18
Zuletzt bearbeitet:
Die Einrückung / Anzahl der Leerzeichen beim schreiben solltest du noch beachten.
aber bei dem ist ja /5 so groß wird nicht sein da auch mein Array INT ist
oder ^_^
Ich habe deine Frage jetzt 3x gelesen aber nicht verstanden. Letztendlich musst du dir halt selber überlegen: Mit welchen Größen arbeite ich, welche Rechnungen mache ich und reicht dafür der Datentyp.
 
@oliver.tonn Bestimmt wirst du mir sagen, ob ich den Abschnitt gelesen habe, in dem steht, dass ich keine große Variable in eine kleine konvertieren soll. Es könnte etwas verloren gehen, wenn die Zahl höher wird
aber bei dem ist ja /5 so groß wird nicht sein da auch mein Array INT ist
oder ^_^
Was unterstellst Du mir hier? Also wirklich, das ist ja eine Unverschämtheit.

🤣

Aber im Ernst, nein, alles gut soweit.
Die einzelnen "Gewichte" haben den Typ Integer, die Variable für die Summe hat den Typ Double Integer, weil bei der Addition zweier oder mehr Integer ein Integer zur Ablage des Ergebnisses nicht mehr ausreichend sein kann.
Die Summe der "Gewichte" wird durch die Anzahl der addierten "Gewichte" geteilt, dadurch kann der maximale Zahlenwert des Ergebnisses nicht den Wertebereich eines Integers überschreiten. Dann wird das Ergebnis von einem Double Integer in ein Integer gewandelt und in eine Variable vom Typ Integer abgelegt.
Also, wie gesagt, alles gut.
Übrigens darf man natürlich eine größere Variable in eine kleinere konvertieren, das wird auch immer wieder gemacht, nur muss man sich halt im klaren sein, was dabei passieren kann.
 
Zurück
Oben