TIA SCL Schieberegister

Also du setzt dein Schieberegister auf True indem du den Set := true machst.
Warum muss ich eigentlich Flanke und Schieberegister als statische Variable nehmen?

Was ich nicht ganz nachvollziehen kann ist: Forschleife 99 to 1 by -1
du lässt von 99 bis 1 mit -1 zählen dann steht aber in der Do anweisung schiebereg [index+1]

Wenn du eine positive Flanke bekommst dann fängt dein Schieberegister an zu zählen und bei Schiebereg [3] schaltet der ausgang oder ?

Gruß
EMZ
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Damit die Werte erhalten bleiben.
Dein Schieberegister muss ja die Werte speichern und für die Flanke musst du auch speichern um mit den Zyklus davor vergleichen zu können.

Er Zählt runter um in der Schleife alle Werte um eine Stelle nach vorne schieben zu können.
Wenn du unten anfängst überschreibst du dir ja was.

Wenn alles geschoben ist schaut er an Stelle [3] was drin steht und gibt es aus.

Gruß

Jens
 
Jens hat es ja eigentlich schon sehr schön erklärt.
Ansonsten kannst du natürlich auch einfach mal schauen, was passiert ... und vor Allem, was welche IN-Beschaltungen bewirken ... 8)

Gruß
Larry
 
Code:
IF #Takt and not #Flanke then
    FOR #Index := 99 TO 1 BY [B]-1[/B] DO
        #Schiebereg[#Index[B]+1[/B]] := #Schiebereg[#Index] ;
    END_FOR;


ich meinte das hier. Als Schrittweite in der Forschleife steht -1 und unten im Schiebereg +1
Das versteh ich nicht so ganz.

Also so wird es nicht gehen oder ?

Code:
IF #Takt and not #Flanke then
    FOR #Index := 1 TO 3 BY +[B]1[/B] DO
        #Schiebereg[#Index] := #Schiebereg[#Index+1] ;
    END_FOR;

Gruß
EMZ
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das bedeutet folgendes :
In der Schleife zähle ich runter, weil ich das Schieben von hinten nach vorne machen muss.
Ich nehme also beim ersten Mal den Inhalt von 99 und packe ihn in 99+1. Dann nehme ich den Inhalt von 98 und packe ihn in 98+1.
Würde die Schleife anders herum laufen dann würdest du dir alle folgenden Speicherstellen mit dem ersten Wert überschreiben - also 1 in 1+1, dann 2 in 2+1 usw.
Wenn dich das aber interessiert dann kannst du ja einfach den Code abändern und schauen was dann passiert.

Das ist aber genau das, was ich irgendwann einmal in diesem Thread schon angemerkt habe : es hilft gar nichts, dir einen fertigen Code-Block zu liefern - du musst es im Grunde selber machen und VERSTEHEN.
Der Code eines Anderen, nicht verstanden, nützt dir im Grunde gar nichts ...

Gruß
Larry


Nachsatz dazu:
Wenn du mein Profil anschaust und die ca. 11000 Beiträge, die ich in diesem Forum schon geschrieben habe, ansiehst dann wirst du feststellen, dass ich gerne helfe ... aber ein ganz klein bißchen Mitarbeit von Seiten des Fragenden darf dabei schon erwartet werden können ...
 
Zuletzt bearbeitet:
Ok ich fande es bisschen irritierend
Sorry eigentlich würde ich das sofort testen da ich die möglichkeit nicht habe ich kann erst am abend ausprobieren deshalb frage ich einbisschen das ich dann am abend die alternativen testen kann.
Deshalb wollte ich keinen fertigen Code weil der Lerneffekt gleich null ist.
Das möchte ich sobald ich daheim bin testen
würde heute abend schreiben sofern noch fragen aufkommen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Doch ich habe PLCSIM aber leider nicht auf der Arbeit. Muss es leider immer Zuhause üben.

So zum Thema:

Ich habe es ausprobiert, soweit alles gut es funktioniert erstmal.
Aber ich muss sagen mir ist eins noch nicht so ganz klar. Vielleicht mag mir das einer von euch nochmal erklären:

Ich habe ein Arrayfeld von 100 /99 Elementen.
Ich denke das die FOR-Schleife dieses hier macht (ich glaube das ist falsch):

1.Durchlauf

For Index[99] := 99 to 1 by -1 do
Schiebereg[99+1] := Schieberegister [99]

2.Durchlauf

For Index[98] := 99 to 1 by -1 do
Schiebereg[98+1] := Schieberegister [98]

usw...

Ausgang := Schiebereg[3]

wie geht es denn, dass ich aber schon nach 3 Takten ein Ausgangssignal bekomme. Eigentlich muss ich doch erst nach 96 mal runtertakten, dass ich auf die Wertigkeit 3 komme, dass am Ausgang true Signal steht. Oder schiebt er die 99 Elemente in einem Zyklus (1 Takt) durch.
Irgendwie bin ich durch diesen Code einbisschen irritiert. Ich steht grade richtig aufm Schlauch. Ich denke eine kleine Aufklärung würde mir nicht schaden.

Gruß
EMZ
 
Du hast es noch nicht ganz richtig verstanden - das ist vielleicht von Anfang an das generelle Problem gewesen, da die Anderen dich auch schon darauf hingewiesen haben.
Die Schleife läuft quasi in einem Rutsch durch - also mit dem ersten Aufruf des Bausteins bei dem "Takt" = True ist.
Die Schleife wird also erst verlassen wenn alle 99 Iterationen erfolgt sind.

Gruß
Larry
 
Ok also werden die 99 Iterationen in einem Zyklus "durchgearbeitet"
und wie geht es dann, dass nach drei bzw zwei Takten der Ausgang true wird da hab ich noch nen hänger ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn wir mal bei meinem Code bleiben dann startest dieses Schleifen-Konstrukt 3 mal.
Jeder Start der Schleife bewirkt, dass alle Inhalte deines Array's um ein Element aufrücken.
Die Schleife zwischen "FOR" und "END_FOR" wird so oft durchlaufen (im selben Programm-Zyklus) bis die angegebenen Iterationen stattgefunden haben (bei dir wären es 99). Danach erst geht der normale Programm-Zyklus weiter. Im Klartext heißt das auch, dass eine große Schleife mit vielen Operationen darin deine SPS-Zykluszeit ganz schön aufblähen kann - damit solltest du aktuell aber noch kein Problem bekommen.

Dein Code macht Folgendes :
Wenn "Start" da ist wird, bedingt durch den einprogrammierten Flankenmerker, die Schleife nur ein mal komplett durchlaufen (in dem Moment, wo sich "Start" von False nach True ändert) - also alle Inhalte rücken um eins auf.
Nun nimmst du "Start" wieder weg - dadurch löscht sich der Flankenmerker - jetzt kannst du das wiederholen.

Gruß
Larry
 
Ahhsooooo, also heißt es, dass es in etwa so aussieht ?

Da ich eher der visuelle Lerntyp bin hab ich mal kurz sowas aufgezeichnet mit Array 0..5 :

Ich bin davon ausgegangen, dass bei Start true Schiebereg [0] gesetzt wird.

Schiebreg.jpg

Ist das so richtig?

[TABLE="align: left"]
[TR]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD="width: 7"][/TD]
[TD="width: 31"][/TD]
[TD="width: 15"][/TD]
[TD="width: 31"][/TD]
[TD="width: 21"][/TD]
[TD="width: 31"][/TD]
[/TR]
[TR]
[TD][/TD]
[TD="align: left"][/TD]
[TD][/TD]
[TD="align: left"][/TD]
[TD][/TD]
[TD="align: left"][/TD]
[TD][/TD]
[TD="align: left"][/TD]
[TD][/TD]
[TD="align: left"][/TD]
[/TR]
[/TABLE]
 
Zuletzt bearbeitet:
Zurück
Oben