Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 40 von 40

Thema: Schieberegister in SCL?

  1. #31
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich hab auf die schnelle mal ein Beispiel gemacht.
    Schau Dir das mal an, ob Du damit was anfangen kannst.

    Schieben.zip
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  2. #32
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    @hucki: Ja stimmt, das sind viele Vorteile. Dann werde ich das in Zukunft auch so machen! Aber einen Geschwindigkeitsvorteil bringt diese Art von Progr. nicht, oder?

    Zitat Zitat von Tigerente1974 Beitrag anzeigen
    Ich hab auf die schnelle mal ein Beispiel gemacht.
    Schau Dir das mal an, ob Du damit was anfangen kannst.
    Ganz lieben Dank für dein Beispiel Tigerente!

    Gleich am Montag werde ich mich an dein Beispiel machen... hoffe, ich verstehe es auch!

    Melde mich dann...
    LG
    spirit

  3. #33
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Zitat Zitat von Tigerente1974 Beitrag anzeigen
    Ich hab auf die schnelle mal ein Beispiel gemacht.
    Schau Dir das mal an, ob Du damit was anfangen kannst.

    Schieben.zip
    Hi Tigerente,

    nochmals Danke für dieses Beispiel. Habe mir es jetzt angeschaut und ich hoffe im Groben auch verstanden.

    Wenn ich es richtig sehe, dann schiebst du die vier Elemente aus dem UDT mit jedem Takt im DB100 um eine Stelle weiter und zwar in der Reihenfolge 13-->14, 12-->13, usw. bis 1-->2.

    Fragen hierzu:

    1)
    Hat das einen bestimmten Grund, dass du die vier Elemente nicht zuerst von Platz 1 auf 2, von 2 auf 3, usw. schiebst?

    2)
    Wie bildest du mit M10.0 den Takt? Er ist doch in der HW-Config. nicht als Taktmerker deklariert.


    Der Ausgang 13 wird aktiv, wenn Status_A im DB100 dem Platz 13 zugewiesen wurde und Fehler_A "FALSE" ist.

    Frage hierzu:

    1)
    Wo oder wodurch wird denn z.B. Status_A auf "TRUE" gesetzt?


    Lieben Dank…
    LG
    spirit

  4. #34
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Hallo Spirit,
    du mußt in einem Array beim Verschieben immer von hinten nach vorne Schieben.
    Wenn du von 1 auf 2 schiebst und dann erst von 2 nach 3 dann hast du in aller Speicherstellen den Inhalt von 1 drinstehen (1 -> 2 , dann 2 == 1 usw.)
    Deswegen erst 11 -> 12, dann 10 -> 11 usw.

    Der Takt wird hier wahrscheinlich (wie auch bei mir) als Impuls vom Drehtisch kommen.

    Den Ausgang gibt es nur für dich (schätze ich) ...

    Gruß
    Larry

    @Tigerente:
    Nimmst du für das Verschieben der einzelnen Elemente tatsächlich den Blockmove ? Ich habe bei mir 10-Byte-Blöcke (das Pendant zu deinem UDT) - da hat sich der SFC gegenüber dem regulären Code nicht "rentiert" ...

  5. #35
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hallo Spirit,
    du mußt in einem Array beim Verschieben immer von hinten nach vorne Schieben.
    Wenn du von 1 auf 2 schiebst und dann erst von 2 nach 3 dann hast du in aller Speicherstellen den Inhalt von 1 drinstehen (1 -> 2 , dann 2 == 1 usw.)
    Deswegen erst 11 -> 12, dann 10 -> 11 usw.

    Den Ausgang gibt es nur für dich (schätze ich) ...

    Gruß
    Larry
    Danke Larry,

    ja klaro stimmt - dann hätte ich überall das Gleiche drin stehen!

    Nochmals zu den einzelnen Elementen des UDT's:

    Würde man in der Praxis das Element Status_A beispielsweise irgendwo im Programm beschreiben, so dass dieses Element dann in einem Takt den Status 0 und in einem anderen Takt z.B. den Status 1 haben kann?
    LG
    spirit

  6. #36
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    @Tigerente:
    Nimmst du für das Verschieben der einzelnen Elemente tatsächlich den Blockmove ? Ich habe bei mir 10-Byte-Blöcke (das Pendant zu deinem UDT) - da hat sich der SFC gegenüber dem regulären Code nicht "rentiert" ...
    Hier mal der Code.
    Den Blockmove finde ich da schon passend. Besonders in dem Beispiel, weil das dann schön allgemein funktioniert.

    Code:
    FUNCTION_BLOCK schieben
    
    CONST
        erster_Platz := 1;
        letzter_Platz := 14;
    END_CONST
    
    VAR_INPUT
        Takt : BOOL;
    END_VAR
    
    VAR_IN_OUT
        register : ARRAY[erster_Platz..letzter_Platz] OF Register_typ;
    END_VAR
    
    VAR_OUTPUT
        Ausgang_13 : BOOL;
    END_VAR
    
    VAR_TEMP
        i : INT;
        Status_SFC20 : INT;
    END_VAR
    
    BEGIN
    
    // Alle Elemente von "Register_typ" mit SFC20 "BLKMOV" von hinten nach vorne durchschieben.
    
    IF Takt THEN
        // Erste Schleife : Register[13] -> Register[14]
        // Zweite Schleife: Register[12] -> Register[13]
        // ...
        // Letzte Schleife: Register[1]  -> Register[2]
        
        FOR i := letzter_Platz TO (erster_Platz + 1) BY -1 DO
            Status_SFC20:=BLKMOV(SRCBLK :=register[i-1],DSTBLK :=register[i]);
        END_FOR;
    END_IF;
    
    // Ausgang_zuweisen:
    Ausgang_13 := register[13].Status_A AND NOT register[13].Fehler_A;
    
    END_FUNCTION_BLOCK
    UDT dazu:

    Code:
    TYPE "Register_typ"
    VERSION : 0.1
    
    
      STRUCT 	
       Status_A : BOOL ;	
       Fehler_A : BOOL ;	
       Fehler_B : BOOL ;	
       Wert_XY : INT ;	
      END_STRUCT ;	
    END_TYPE
    Alles ist quasi nur ein Beispiel. Der UDT kann beliebig verändert werden.
    Wie vorher schon erwähnt "lohnt" sich das nicht, wenn man nur 1 Bit über den ganzen Tisch schieben möchte.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  7. #37
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    @Spirit:

    Das war jetzt mal ein ganz "allgemeines Beispiel". In dem UDT kannst Du die Elemente deklarieren, die mit dem Takt verschoben werden sollen. "Füllen" musst Du das natürlich entsprechend. Den Rest hat Larry schon erklärt.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  8. #38
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Zitat Zitat von spirit Beitrag anzeigen
    Würde man in der Praxis das Element Status_A beispielsweise irgendwo im Programm beschreiben, so dass dieses Element dann in einem Takt den Status 0 und in einem anderen Takt z.B. den Status 1 haben kann?
    Bleiben wir mal bei dem Rundtisch. Angenommen Status_A ist so etwas wie ein IO/NIO-Bit. Hat eine Station nicht gearbeitet oder eine Prüfstation einen Fehler erkannt, wird der Status an der entsprechenden Stelle zurückgesetzt. Z.B. an Position #6 ist eine Prüfstation, die ein "Schlechtteil" erkannt hat.

    Dann wäre der Code etwa so:

    Code:
    IF #M_Messung_NIO THEN
    Status_A[6] := FALSE;
    END_IF;
    Beim Takten wird das dann weitergereicht. (6-->7) Die nächste Station könnte eine Bearbeitungsstation sein. Die arbeitet nur dann, wenn Status_A "TRUE" ist:

    Code:
    Ausgang_7 := Status_A[7];
    Wie gesagt, alles nur ein Beispiel. Der Rest muss von Dir kommen...
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  9. #39
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Zitat Zitat von Tigerente1974 Beitrag anzeigen
    Den Blockmove finde ich da schon passend. Besonders in dem Beispiel, weil das dann schön allgemein funktioniert.
    Ich habe deshalb gefragt, weill du unter SCL ja auch genausogut so programmieren könntest : (egal wie das Array-Element aufgebaut ist)
    Code:
        FOR i := letzter_Platz TO (erster_Platz + 1) BY -1 DO
            register[i-1] :=register[i] ;
        END_FOR;
    ... das erspart den Compiler "ein wenig" das ANY-Pointer bauen, was ja auch nicht ganz Zykluszeit-unkritisch werden kann ...

    Gruß
    Larry

  10. Folgende 3 Benutzer sagen Danke zu Larry Laffer für den nützlichen Beitrag:

    Hohlkörper (16.08.2013),Tigerente1974 (14.08.2013),vollmi (14.08.2013)

  11. #40
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    War mir so nicht bekannt, dass es den Blockmove nicht braucht, obwohl ein "UDT" kopiert werden soll.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

Ähnliche Themen

  1. Schieberegister per SCL?
    Von SEAL im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 03.04.2013, 11:41
  2. Schieberegister im FC
    Von Stefan1982 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 02.11.2010, 16:58
  3. Schieberegister
    Von Anonymous im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 30.01.2006, 08:47
  4. Schieberegister
    Von andreHST im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.09.2005, 10:57
  5. Schieberegister
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 27.05.2005, 09:11

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •