TIA For-Schleife

S.Schleich

Level-2
Beiträge
59
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen liebe Gemeinde,

ich habe folgende Problematik, bzw. folgendes Problem:

Ich möchte ein Schieberegister / Ringspeicher in SCL mit eine For-Schleife schreiben. Dafür habe ich einen DB angelegt mit einem Array[1..30] of Int.
Die Laufvariable (ich habe sie "Pointer" genannt) habe ich als temporäre Variable in der Bausteindeklaration angelegt.

Im InOut-Bereich der Bausteindeklaration habe ich das Array[1..30] ebenfalls angelegt.

Als Input-Variablen habe ich einen Taktmerker und eine Int-Variable.

Immer wenn der Taktmerker true ist, soll geschoben werden.

So sieht mein Programm aus:

IF #Taktmerker THEN

FOR #Pointer := 30 TO 2 BY -1 DO
#Array[#Pointer] := #Array[#Pointer -1];
END_FOR;

#Array[1] := #Int_Variable;

END_IF;


Nun werden allerdings alle Plätze mit der INT-Variable belegt. Ich habe zum testen mal den Pointer als statische Variable angelegt, um sie zu beobachten. Und siehe da. Der Pointer hat den Wert "1". Und genau das verstehe ich nicht.

Wäre um Hilfe sehr dankbar :)
 

Anhänge

  • For_Schleife.png
    For_Schleife.png
    52,8 KB · Aufrufe: 33
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Pointer hat den Wert "1". Und genau das verstehe ich nicht.
Die "Hilfsvariable" einer FOR Schleife ist beim verlassen der FOR Schleife immer um eins größer als der Bereich ( bzw. eins kleiner wenn die Schleife rückwärts zählt ).

Bei FOR i := 1 TO 100 hat i beim verlassen der Schleife 101, bei FOR i := 100 TO 10 BY -1 hätte i 9 beim verlassen der Schleife.

Wichtig für dich ist, dass ist der Wert, den die Hilfsvariable beim verlassen der Schleife hat. Den Wert während der Schleifenbearbeitung kannst du nicht sehen.
 
Wenn sich das Array seine Werte bis zum nächsten Bausteindurchlauf merken soll, dann muß es in einem FB in Static liegen, oder an InOut übergeben werden. "Umspeichern" heißt, die Werte müssen auch gelesen werden - das ist im Out-Bereich nicht möglich oder zumindest sehr schlechter Stil.

PS: Hatte ich mich verlesen?? Du hast ja schon InOut - also gut so.

Harald
 
Wenn sich das Array seine Werte bis zum nächsten Bausteindurchlauf merken soll, dann muß es in einem FB in Static liegen, oder an InOut übergeben werden. "Umspeichern" heißt, die Werte müssen auch gelesen werden - das ist im Out-Bereich nicht möglich oder zumindest sehr schlechter Stil.

Harald
Das Array habe ich als InOut-Variable angelegt. Genau aus dem Grund, den du ja sagt: Ich lese und beschreibe die Werte.
 
Was brauchst du denn? Dass alle zwei Sekunden fix geschrieben wird oder stupide 2 Sekunden nicht und dann zwei Sekunden jeden Zyklus?

Sauber ist das nicht.
Gute Frage :D es muss nicht fix exakt alle 2 sekunden geschrieben werden. Allerdings würde mich natürlich interessieren, wie dann die "saubere" Variante aussieht :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du als #Taktmerker den CPU-Taktmerker 0.5Hz verwendest, dann ist der 1s lang False und 1s lang True, d.h. da würde das Array in jedem Baustein-Aufruf geschoben werden, was üblicherweise nicht gewollt ist. Deshalb die Nachfrage von Tschoke, wie lang Dein #Taktmerker ist.

PS: zu langsam getippselt
 
Allerdings würde mich natürlich interessieren, wie dann die "saubere" Variante aussieht :)
Durchlauf bzw. Abarbeitung der FOR Schleife bei einem gewünschten Ereignis, dann aber auch nur 1x ( außer es ist anders gewollt/notwendig..., kann ja auch sein ). Auf jeden Fall nicht "unkontrolliert" per Taktmerker.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun werden allerdings alle Plätze mit der INT-Variable belegt.
Wenn Du mit schieben meinst ...

vorletztes Element in letztes kopieren,
vorvorletztes Element in vorletztes kopieren,
...
zweites Element in drittes kopieren,
erstes Element in zweites kopieren.
INT-Wert in erstes Element kopieren,
dann Schleife "rückwärts" durchlaufen (FOR ... BY -1 ...) aber das tust Du ja schon.
Also wird vermutlich Dein TriggerSignal (Taktmerker) länger als 1 Zyklus auf TRUE stehen.

Ich habe zum testen mal den Pointer als statische Variable angelegt, um sie zu beobachten. Und siehe da. Der Pointer hat den Wert "1". Und genau das verstehe ich nicht.
S. Michaels Beitrag #3.

alle 2 Sekunden springt der auf True ... wozu eine Flanke? Weil die immer für einen Zyklus true ist?
Alle 2 s springt sie auf TRUE ... und wann bzw. wodurch springt sie dann wieder auf FALSE??? Oder bleibt sie sogar ewig auf TRUE?

PS: noch langsamer getippselt. ;)
 
Durchlauf bzw. Abarbeitung der FOR Schleife bei einem gewünschten Ereignis, dann aber auch nur 1x ( außer es ist anders gewollt/notwendig..., kann ja auch sein ). Auf jeden Fall nicht "unkontrolliert" per Taktmerker.
achso ja danke, klar. es soll nur eine Übung sein, weil wir Ende diesen Jahres sowas integrieren sollen. Und ich wollte nur prüfen, ob ich´s richtig programmiert habe.
 
Wenn Du mit schieben meinst ...

vorletztes Element in letztes kopieren,
vorvorletztes Element in vorletztes kopieren,
...
zweites Element in drittes kopieren,
erstes Element in zweites kopieren.
INT-Wert in erstes Element kopieren,
dann Schleife "rückwärts" durchlaufen (FOR ... BY -1 ...) aber das tust Du ja schon.
Also wird vermutlich Dein TriggerSignal (Taktmerker) länger als 1 Zyklus auf TRUE stehen.


S. Michaels Beitrag #3.


Alle 2 s springt sie auf TRUE ... und wann bzw. wodurch springt sie dann wieder auf FALSE??? Oder bleibt sie sogar ewig auf TRUE?

PS: noch langsamer getippselt. ;)
danke. der Taktmerker der CPU springt (soweit ich das verstanden habe) genau so lange auf false (in hertz) wie auf true ?.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
danke. der Taktmerker der CPU springt (soweit ich das verstanden habe) genau so lange auf false (in hertz) wie auf true ?.
Naja, aber das ist doch keine Art. Eine Schleife eine Sekunde nicht bearbeiten und eine Sekunde hunderte/tausende mal bearbeiten....
 
Naja, aber das ist doch keine Art. Eine Schleife eine Sekunde nicht bearbeiten und eine Sekunde hunderte/tausende mal bearbeiten....
okay. wäre dann die schönste Lösung, dass ich mir selber einen Taktmerker baue, der alle 2 Sekunden eine Flanke setzt? Würde die Schleife dann alle 2 Sekunden genau 1 mal schieben ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
okay. wäre dann die schönste Lösung, dass ich mir selber einen Taktmerker baue
???
Wie wäre es mit einer einfachen positiven Flanke auf den Taktmerker?

Gibt es kein genaues Ereignis, wann geschoben werden soll? Einfach nonstop mit einem Taktmerker klingt etwas merkwürdig.
 
... bin noch recht neu in der Thematik ... manchmal sehe ich den Wald vor lauter Bäumen noch nicht :)
Das ist ganz normal. Als Programmierer hat bzw. bekommt man einen ganz anderen Blick auf die Welt.
Dinge, die für einen OttoNormalVerbraucher ...
- ganz selbstverständlich erscheinen, müssen für einen bzw. von einem Programmierer haarklein auseinandergenommen und geklärt werden und
- ziemlich kompliziert aussehen, können sich hingegen für einen Programmierer als recht simpel herausstellen.

OttoNormalVerbraucher denkt nämlich recht sprunghaft und in grösseren Sprüngen, ohne sich dabei über alle ZwischenSchritte klar zu sein bzw. zu werden, während Programmierer dem Computer die Aufgaben als Folge aus kleinsten Schritten aufgedrieselt erklären müssen.
Dabei müssen sie auch noch die ganzen denkbaren Ausnahmen von irgendwelchen Regeln im Blick behalten.
Und Programmierer müssen ständig panisch auf der Hut sein vor Annahmen (Hoffnungen), die da lauten "dieser Fall wird nur sooo selten auftreten, dass wir ihn nicht berücksichtigen müssen".
 
Zurück
Oben