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

Ergebnis 1 bis 9 von 9

Thema: Schieberegister variabeler Länge erstellen mit KPT 400 und S7-300

  1. #1
    Registriert seit
    12.09.2013
    Beiträge
    13
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich brauche mal ne Idee wie ich vorgehen kann.
    Für eine Konrtrolleinrichtung benötige ich ein Schieberegister das ich in der Länge verändern kann (Über die HMI), da an unterschiedlicher Stelle kontrolliert wird.
    Wie setze ich es am besten um, oder womit fange ich am besten an. Habe TIA 11 als Software zur Verfügung

    Feste Registerlängen habe ich bisher über MW realisiert.

    Gruß Jens
    Zitieren Zitieren Schieberegister variabeler Länge erstellen mit KPT 400 und S7-300  

  2. #2
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Ein boolsches Schieberegister hab' ich hier in SCL für EMZ entworfen:
    Zitat Zitat von hucki Beitrag anzeigen
    Code:
    FUNCTION_BLOCK "Boolsches_Schieberegister"
    
    VAR_INPUT
        Start1: BOOL;                               // Startbedingung 1
        Start2: BOOL;                               // Startbedingung 2
        Takt: BOOL;                                 // Impuls-Eingang
        Schritte: INT;                              // Impulszahl bis zur Ausgabe
        Laenge: INT;                                // Ausgabelänge des Impulses in Takten
    END_VAR
    
    VAR_OUTPUT
        Ausgabe: BOOL;                              // Impulsausgabe
    END_VAR
    
    VAR
        Takt_Old: BOOL;                             // Flankenmerker für Eingang Takt
        Start: BOOL;                                // Startbedingung erfüllt
        Schieberegister: ARRAY [0..500] OF BOOL;    // Boolsches Schieberegister
        Ausgangszaehler: INT;                       // Zähler für Ausgabelänge
    END_VAR
    
    VAR_TEMP
        Schieben: BOOL;                             // positive Flanke Eingang Takt
        Index: INT;                                 // Array-Zeiger
    END_VAR
    
    
        // Schrittbegrenzung
        IF Schritte > 500 THEN
            Schritte := 500;
        END_IF;
        
        // Startbedingung erfüllt?
        IF Start1 AND Start2 THEN
            Start := true;
        END_IF;
        
        // Flankenerkennung Eingang Takt
        Schieben := Takt AND NOT Takt_Old;
        Takt_Old := Takt;
        
        
        // Schieberegister
        IF Schieben THEN
            
            // Register weiterschieben
            FOR Index := Schritte TO 1 BY -1 DO
                Schieberegister [Index] := Schieberegister [Index - 1];  
            END_FOR;
            
            // Startbedingung ins Schieberegister übernehmen
            Schieberegister [0] := Start;
            Start := false;
            
            // Ausgang Schieberegister
            IF Schieberegister [Schritte] THEN
                Ausgangszaehler := Laenge;
            END_IF;
            
            // Ausgabe
            Ausgabe := Ausgangszaehler > 0;
            
            // Zähler Ausgabelänge
            IF Ausgabe THEN
                Ausgangszaehler := Ausgangszaehler - 1;
            END_IF;
            
        END_IF;
        
        
    END_FUNCTION_BLOCK
    und dann in diesem Thread auf TIA übertragen.


    Wenn Du vlt. noch genauer erklärst, was Du machen willst, kann man das sicher leicht anpassen.
    Die Startbedingung z.B. wirst Du ja so auf keinen Fall benötigen.

  3. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    maverickxxll (15.09.2013)

  4. #3
    maverickxxll ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.09.2013
    Beiträge
    13
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Hucki,
    danke für deine schnelle antwort. Den Input muss ich erstmal verdauen.
    Zur Anwendung

    Ich habe eine Maschine die Flaschen mit Etiketten versieht. Vorm Abspenden werden dort an 2 unterschiedlichen Stellen Kontrollen durchgeführt. Sobal eine der Kontrollen negativ ausfällt soll die Flasche mit dem Etikett ausgewiesen werden. Somit brauche ich ein Register für die Kontrollen (hab gerade die Idee das in einer festen Länge zu machen und über eine Vergleich die entsprechende Stelle auf null zu setzen...). DIe kontrollen ändern sich in der Länge zum Übergabepunkt durch die länge des Etiketts, somit variabel, meisten im Bereich zwischen 1 und 16 Takten. Danach muss die Auswertung an ein Laufbandregister übergeben werden das die information bis zur Ausweisung mit führt. Dafür ist dein Register schon mal hervorragend geeignet, da ich die Länge dann einteachen könnte.
    Mal sehen was mir einfällt...
    Gruß Jens

  5. #4
    maverickxxll ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.09.2013
    Beiträge
    13
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Guten Morgen,

    ich habe für die Kontrollen mal was entworfen. Siehe Bilder, Würde das so funktionieren ?
    Das Laufbandregister würde ich versuchen über das boolsche Schieberegister zu machen.

    Gruß Jens
    PLC1.jpgPLC2.jpg
    Geändert von maverickxxll (15.09.2013 um 09:50 Uhr)

  6. #5
    maverickxxll ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.09.2013
    Beiträge
    13
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo zusammen,

    wie weit kann man den Array in dem Code vergrößern ? So auf den Wert von ca. 4000 ? Gibt es dafür einschränkungen ?

    Gruß Jens

  7. #6
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von maverickxxll Beitrag anzeigen
    Gibt es dafür einschränkungen ?
    Ja, Deine Zykluszeit!
    Notfalls muss man das Schieben auf mehrere Zyklen aufteilen oder mit Blockmove arbeiten.

  8. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    maverickxxll (16.09.2013)

  9. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Wenn man nicht für die Darstellung z.B. in einem HMI die Daten im Array in der richtigen Reihenfolge haben muss, löst man sowas durch einen Schreib- und Lesezeiger. Bei Lesen oder Schreiben auf die Daten im Schieberegister wird dann nur der Zeiger umgesetzt, und nicht mehr das komplette Array umkopiert. Dann ist es egal ob das Array 10, 100, oder 10000 Einträge hat.

  10. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    hucki (15.09.2013),maverickxxll (16.09.2013)

  11. #8
    maverickxxll ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.09.2013
    Beiträge
    13
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    Die Register funktionieren . Vielen Dank für die Hilfe.

    Gruß Jens

  12. #9
    Registriert seit
    15.04.2008
    Ort
    Dippoldiswalde (Sachsen)
    Beiträge
    18
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo maverickxxll,
    ich habe in meinem neuen Projekt so etwas ähnliches gemacht.
    Schau dir mal die SCL Quelle an.

    FUNCTION "ERGEB" : Void
    TITLE = Ergebnisse registrieren
    { S7_Optimized_Access := 'FALSE' }
    //registrieren und löschen von Ergebnissen
    VAR_INPUT
    START : Bool; // startet das Rotieren der Ergebnisse
    RESET : Bool; // löscht den kompletten Speicher
    "DB" : Block_DB; // Datenbaustein
    LBYTE : Int; // Startbyte Ergebnisse links
    RBYTE : Int; // Startbyte Ergebnisse rechts
    SBYTE : Int; // Startbyte Status
    ANZAHL : Int; // Anzahl der Bytes pro Spur
    END_VAR

    VAR_OUTPUT
    BUSY : Bool; // Baustein ist beschäftigt
    END_VAR

    VAR_TEMP
    X : Int; // Zählvariable
    END_VAR


    BEGIN
    IF #START THEN
    #BUSY := TRUE;
    FOR #X := (#ANZAHL - 1) TO 0 BY -1 DO
    #DB.DB(#LBYTE + #X) := SHR(IN:=#DB.DB(#LBYTE + #X), N:=1);
    #DB.DB(#RBYTE + #X) := SHR(IN:=#DB.DB(#RBYTE + #X), N:=1);
    #DB.DB(#SBYTE + #X) := SHR(IN:=#DB.DB(#SBYTE + #X), N:=1);
    IF #X > 0 THEN
    #DB.DX((#LBYTE + #X), 0) := #DB.DX(((#LBYTE + #X) - 1), 7);
    #DB.DX((#RBYTE + #X), 0) := #DB.DX(((#RBYTE + #X) - 1), 7);
    #DB.DX((#SBYTE + #X), 0) := #DB.DX(((#SBYTE + #X) - 1), 7);
    END_IF;
    END_FOR;
    #BUSY := FALSE;
    GOTO Ende;
    END_IF;
    IF #RESET THEN
    #BUSY := TRUE;
    FOR #X := (#ANZAHL - 1) TO 0 BY -1 DO
    #DB.DB(#LBYTE + #X) := 0;
    #DB.DB(#RBYTE + #X) := 0;
    #DB.DB(#SBYTE + #X) := 0;
    END_FOR;
    #BUSY := FALSE;
    END_IF;
    Ende:
    RETURN;
    END_FUNCTION

    Der Baustein rotiert mit steigender Flanke am "START" einmal alles durch. Am Ende musst du die genaue Stelle im DB wissen die du dann nur noch abfragen oder mit einem Ergebnis setzen musst.
    "BUSY" wird TRUE wenn der Baustein läuft. "RESET" löscht alles. Da ich das für drei Spuren mache brauch ich "LBYTE", "RBYTE" und "SBYTE". Du brauchst ja nur eine Spur.
    Der Baustein schiebt immer ganze Bytes und kopiert dann Bit7 vom vorhergehenden in Bit0 vom nachfolgenden Byte, so das die Kette einmal von vorn nach hinten verschoben wird.

    MfG Peter.
    Programmierung bedeutet, mechanische Fehler zu kompensieren ...

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 07.05.2012, 10:02
  2. Meldungen Mit S7-1200 und KPT 600
    Von Michael J. im Forum HMI
    Antworten: 2
    Letzter Beitrag: 28.12.2011, 10:36
  3. Schieberegister mit S7-300
    Von Spag im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 06.08.2008, 13:06
  4. Biete s7 300 und 400
    Von speedyspeedy im Forum Suche - Biete
    Antworten: 12
    Letzter Beitrag: 18.04.2008, 20:41
  5. Proble mit S7 TCP Verbindung zwischen S7 300 und 400
    Von Jochen Kühner im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 02.11.2006, 12:15

Lesezeichen

Berechtigungen

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