Step 7 Schieberegister in SCL

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, habe folgende Frage:

Habe mir in SCL ein Schieberegister gebastelt und in der Symboltabelle Folgendes angelegt:

Schieberegister / MB30

Merker_1 / M30.0

Merker_2 / M30.5

Wenn Merker_1 TRUE dann wird das Bit 0 im Register gesetzt.

Über eine LS wird das Bit nach links geschoben, bis Merker_2 aktiv ist und einen Ausgang auf TRUE schaltet.

Soweit funktioniert alles prima!

ABER: Ich bekomme es nicht hin, dass ich das Schieberegister und die beiden Merker in SCL als Variablen deklariere. Dann funktioniert das alles nicht mehr.


Frage: Als welchen Typ Variable müsste ich denn das Register und die beiden Merker im FB deklarieren? :confused:
 
So, habe das jetzt mal in FUP versucht:

Unbenannt.JPG

Hier der Aufruf im OB1:

Code:
      CALL  FB     3 , DB3
       MW_0   :=MW60
       N         :=W#16#1
       Eingang :=E0.0
       MW_1   :=MW80


Wenn ich nun das Bit0 in MW60 auf TRUE setze, dann hätte ich erwartet, dass im MW80 mit jeder Flanke ein Bit nach links geschoben wird und entsprechend der Ausgang auf TRUE schaltet.

Das Bit wird aber in MW80 nur einmalig nach links geschoben und dann nicht mehr ... :confused:


Was mache ich denn hier falsch???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ABER: Ich bekomme es nicht hin, dass ich das Schieberegister und die beiden Merker in SCL als Variablen deklariere.
Globale Variablen werden in SCL nicht nochmal deklariert, die sind ja schon in der Symboltabelle drin.

Harald
 
Wenn ich nun das Bit0 in MW60 auf TRUE setze, dann hätte ich erwartet, dass im MW80 mit jeder Flanke ein Bit nach links geschoben wird und entsprechend der Ausgang auf TRUE schaltet.
Du schiebst das MW60 und speicherst in MW80, das MW60 bleibt unverändert. Vielleicht solltest Du auf MW60 zurückspeichern?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du schiebst das MW60 und speicherst in MW80, das MW60 bleibt unverändert. Vielleicht solltest Du auf MW60 zurückspeichern?

Harald

Habe an den Ausgang auch mal (versuchsweise) das MW_0 (also MW60) angelegt. Hat aber auch nicht geklappt. Dann müsste man dieses MW_0 ja als IN_OUT deklarieren, richtig?
 
Hallo, habe folgende Frage:

Habe mir in SCL ein Schieberegister gebastelt und in der Symboltabelle Folgendes angelegt:
Warum erstellst Du Dir denn eigentlich kein Array of Bool im STAT oder einem DB für das Schieberegister?
SCL ist doch in Verbindung mit einem Array geradezu prädestiniert für ein Schieberegister:

Code:
    // Boolsches Schieberegister
    IF #Schieben THEN
        
        // Register weiterschieben
        FOR Index := Schritte TO 1 BY -1 DO
            Schieberegister [Index] := Schieberegister [Index - 1];  
        END_FOR;
        
        // Eingang Schieberegister
        Schieberegister [0] := Eingang;
        
        // Ausgang Schieberegister
        IF Schieberegister [Schritte] THEN
            ...;
        END_IF;

    END_IF;
 
Warum erstellst Du Dir denn eigentlich kein Array of Bool im STAT oder einem DB für das Schieberegister?
SCL ist doch in Verbindung mit einem Array geradezu prädestiniert für ein Schieberegister:

Code:
    // Boolsches Schieberegister
    IF #Schieben THEN
        
        // Register weiterschieben
        FOR Index := Schritte TO 1 BY -1 DO
            Schieberegister [Index] := Schieberegister [Index - 1];  
        END_FOR;
        
        // Eingang Schieberegister
        Schieberegister [0] := Eingang;
        
        // Ausgang Schieberegister
        IF Schieberegister [Schritte] THEN
            ...;
        END_IF;

    END_IF;

Lieben Dank hucki für das Beispiel!

Nur - ist es hier nicht so, dass wenn #Schieben = TRUE das gesamte Schieberegister einmal "durchgeschoben" wird?

Gewünscht ist ja, dass mit jedem #Schieben das Bit0 jeweils um eine Stelle nach links geschoben wird ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, aber das Ergebnis ist doch das Gleiche. X Takte später kommt das Bit vom Eingang zum Ausgang.

Du kannst ja notfalls den Eingang sperren, solange das Bit unterwegs ist, damit nur dieses eine wandern kann und nicht mehrere gleichzeitig.
 
Ja, aber das Ergebnis ist doch das Gleiche. X Takte später kommt das Bit vom Eingang zum Ausgang.

Im Array steht doch die Anzahl der Schritte. Hm, dann habe ich es noch nicht ganz kapiert. War der Meinung, dass wenn #Schieben = TRUE ist, das Bit0 immer 1x komplett durchgeschoben wird und der jeweilige Ausgang (z.B. A4.4) mit jedem #Schieben immer 1x TRUE wird. So ist es dann aber nicht, oder?


Muss es morgen mal in der Praxis versuchen ...
 
Im Array steht doch die Anzahl der Schritte. Hm, dann habe ich es noch nicht ganz kapiert. War der Meinung, dass wenn #Schieben = TRUE ist, das Bit0 immer 1x komplett durchgeschoben wird und der jeweilige Ausgang (z.B. A4.4) mit jedem #Schieben immer 1x TRUE wird. So ist es dann aber nicht, oder?
Ja, so ist es nicht.

Immer wenn Schieben TRUE ist (Flankenabfrage!), wird genau um eine Position weiter geschoben, indem von hinten angefangen immer der Wert von einer Stelle vorher kopiert wird.


PS: Ich habe übrigens kürzlich EMZ das Ganze mehr als ausführlich erklärt (ab hier so ungefähr).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo hucki,

habe mich bemüht deine Erklärungen zu verstehen - und fast klappt das Programm auch:

Unbenannt.JPG

Ein Problem besteht allerdings noch.

Ich wollte als Schieberegister ein Byte abbilden (siehe Array). Bei "Ausgang Schieberegister" habe ich eine [3] geschrieben, in der Hoffnung, dass dann über das 3. Bit der Ausgang gesetzt wird.

Das passiert in meinem Programm aber erst nach 4x Schieben und nicht wunschgemäß nach 3x Schieben.


Wo habe ich da einen Gedankenfehler? :confused:


Vielen Dank!
 
Moin,

wenn Du ein Byte haben willst, mußt du die Grenzen Deines Array's anpassen.
Code:
Schieberegister : Array [0..7] of Bool;

Raik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Flanke Schieben:

1. Bit0 gesetzt

2. Bit1 gesetzt

3. Bit2 gesetzt

4. Bit3 gesetzt

...:rolleyes:

Aber Flux,

werden denn beim Durchlaufen der Schleife die Inhalte nicht wie folgt kopiert:

1. Schieberegister[7] --> Schieberegister[8]
2. Schieberegister[6] --> Schieberegister[7]
3. Schieberegister[5] --> Schieberegister[6]
4. Schieberegister[4] --> Schieberegister[5]
5. Schieberegister[3] --> Schieberegister[4]
6. Schieberegister[2] --> Schieberegister[3]
7. Schieberegister[1] --> Schieberegister[2]
8. Schieberegister[0] --> Schieberegister[1]
 
Und was fehlt?

Beim 1.Takt kommt das neue Bit in Register [0]. Das wäre dann 9.


So, kleine Statusänderung - bin nochmal all eure Erklärungen haarklein durchgegangen und was soll ich schreiben: Programm läuft jetzt und ich verstehe es auch endlich!


Puh, aber nicht ganz einfach (zumindest für mich ;) ) das Zeugs ...
 
Zuletzt bearbeitet:
Zurück
Oben