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

Ergebnis 1 bis 9 von 9

Thema: Verbesserungen SCL-Schrittkette

  1. #1
    Registriert seit
    27.05.2014
    Beiträge
    114
    Danke
    43
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich setze meine Schrittketten für die S7-1200 immer folgendermaßen um. Allerdings finde ich hier immer eine Erweitererung problematisch. Ich kann zwar eine begrenzte Anzahl an Schritten noch zwischen meinen Schritten einführen, aber wenn ich größere Änderungen machen muss ist das immer Problematisch. Hat jemand eine Idee wie man das besser bei der S7-1200 lösen kann? SCL oder FUP ist mir hierbei egal.


    Grüße
    Bob

    Code:
    //Schrittbits löschen
    FOR #i := 0 TO 220 BY 1 DO
        "DB_Programm".Programmsteuerung.Schrittnummer_Bool[#i] := 0;
    END_FOR;
    
    //Schrittkette
    CASE "DB_Programm".Programmsteuerung.Schrittnummer OF
        0: //Initialschritt
            "DB_Programm".Programmsteuerung.Schrittnummer_Bool[0] := 1;
            "DB_Programm".Programmsteuerung.Schrittnummer := 5;
            
        5: //Flasche zu Verschließposition befördern
            "DB_Programm".Programmsteuerung.Schrittnummer_Bool[5] := 1;
            IF "DB_Antriebe".Flaschenband."Lenze->SPS"."Zielposition erreicht" 
            THEN
                "DB_Programm".Programmsteuerung.Schrittnummer := 10;
            END_IF;
            
        10: //Flasche zentrieren und Sensorbacke zu Flasche
            "DB_Programm".Programmsteuerung.Schrittnummer_Bool[10] := 1;
            IF "DB_Akt".Zentrierbacke.AS AND "DB_Akt".Ausrichtriemen.AS AND "DB_Akt".Sensorbacke.AS
                
            THEN
                "DB_Programm".Programmsteuerung.Schrittnummer := 15;
            END_IF;
    Zitieren Zitieren Verbesserungen SCL-Schrittkette  

  2. #2
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.725
    Danke
    314
    Erhielt 1.519 Danke für 1.282 Beiträge

    Standard

    Die einzige Lösung die es für dein Problem gäbe, wäre Graph, welches aber gegenwärtig leider nicht für die 1200er existiert.
    Ansonsten hast du deine Grundproblematik bei allen konventionellen Arten eine SK zu programmieren, von Merker SR bis Case, gleichermaßen.
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  3. #3
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Beitrag

    Zunächst würde ich statt echten Zahlen Konstanten für die Schrittnummern verwenden. Dann spielt die echte Zahl schon mal nur noch 'ne untergeordnete Rolle und ist nur an einer Stelle zu definieren:
    Code:
    CONST
        SK_Ini:= 0;
        SK_Transport:= 5;
        SK_Zentrieren:= 10;
        SK_Next:= 15;
        ...
    END_CONST
    
    
    //Schrittbits löschen
    FOR #i := 0 TO 220 BY 1 DO
        "DB_Programm".Programmsteuerung.Schrittnummer_Bool[#i] := 0;
    END_FOR;
    
    //Schrittkette
    CASE "DB_Programm".Programmsteuerung.Schrittnummer OF
        SK_Ini: //Initialschritt
            "DB_Programm".Programmsteuerung.Schrittnummer_Bool[SK_Ini] := 1;
            "DB_Programm".Programmsteuerung.Schrittnummer := SK_Transport;
            
        SK_Transport: //Flasche zu Verschließposition befördern
            "DB_Programm".Programmsteuerung.Schrittnummer_Bool[SK_Transport] := 1;
            IF "DB_Antriebe".Flaschenband."Lenze->SPS"."Zielposition erreicht" 
            THEN
                "DB_Programm".Programmsteuerung.Schrittnummer := SK_Zentrieren;
            END_IF;
            
        SK_Zentrieren: //Flasche zentrieren und Sensorbacke zu Flasche
            "DB_Programm".Programmsteuerung.Schrittnummer_Bool[SK_Zentrieren] := 1;
            IF "DB_Akt".Zentrierbacke.AS AND "DB_Akt".Ausrichtriemen.AS AND "DB_Akt".Sensorbacke.AS
                
            THEN
                "DB_Programm".Programmsteuerung.Schrittnummer := SK_Next;
            END_IF;

    Die Schrittweiterschaltung könnte man dann auch noch alternativ berechnen:
    Code:
    ...
        SK_Zentrieren: //Flasche zentrieren und Sensorbacke zu Flasche
            "DB_Programm".Programmsteuerung.Schrittnummer_Bool[SK_Zentrieren] := 1;
            IF "DB_Akt".Zentrierbacke.AS AND "DB_Akt".Ausrichtriemen.AS AND "DB_Akt".Sensorbacke.AS
                
            THEN
                "DB_Programm".Programmsteuerung.Schrittnummer := "DB_Programm".Programmsteuerung.Schrittnummer + 5;
            END_IF;
    Bei Berechnung muss man seine CONST-Liste bei neuen Einfügungen einmal neu durch nummerieren.
    Bei Festangaben der Schrittnummer muss man sich dann entsprechend die Schritte raussuchen, wo was zwischen gekommen ist.
    Das erste ist also etwas mehr Tipparbeit ohne Suchen, das zweite weniger Tippen mit mehr Suchen (Verweisfunktion). Muss jeder für sich entscheiden.



    PS: Ach ja, man muss sich noch entscheiden, ob man die Konstanten lokal oder global deklariert. Kommt halt drauf an, ob man das in mehr als einem Baustein verwenden möchte.
    Geändert von hucki (12.04.2016 um 18:00 Uhr)

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

    Bobbybau91 (12.04.2016)

  5. #4
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    Dann sollte man aber auch konsequent sein. Man weiss doch was der nächste Schritt ist und wie man ihn nennen muss, hier habe ich ihm mal den Namen FlascheIstAngeschlossen gegeben:

    Code:
    ...
        SK_Zentrieren: //Flasche zentrieren und Sensorbacke zu Flasche
            "DB_Programm".Programmsteuerung.Schrittnummer_Bool[SK_Zentrieren] := 1;
            IF "DB_Akt".Zentrierbacke.AS AND "DB_Akt".Ausrichtriemen.AS AND "DB_Akt".Sensorbacke.AS
                
            THEN
                "DB_Programm".Programmsteuerung.Schrittnummer := SK_FlascheIstAngeschlossen;
            END_IF;
    PS: Ach ja, man muss sich noch entscheiden, ob man die Konstanten lokal oder global deklariert. Kommt halt drauf an, ob man das in mehr als einem Baustein verwenden möchte.
    Natürlich möglichst FB lokal oder als Enumeration, wenn von aussen der Schritt abgefragt werden soll!

    Wenn mit Codesys 3.x dann den Schritt als protected set und public get implementieren.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Dann aber konsequent  

  6. #5
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    Dann sollte man aber auch konsequent sein. Man weiss doch was der nächste Schritt ist und wie man ihn nennen muss
    Darum geht's ja.
    Wenn Schritte eingefügt werden, heißt er eben nicht mehr so wie vorher.

    Bei der konkreten Benennung muss demzufolge der (vorige) Schritt rausgesucht werden und der Name der Konstante geändert werden.
    Beim Addieren legt man die Schrittreihenfolge ausschließlich in der Konstantendeklaration fest.
    Beides hat Vor- und Nachteile. Wie immer halt.

    Definitiv ist es bei Nutzung von Konstanten und Addition einfacher, neue Schritte am bestehenden Inhalt nur hinten dran zu hängen. Denn die Übersicht, welcher Schritt auf welchen folgt, steckt jetzt hauptsächlich in der Konstantendeklaration und nicht mehr so sehr im CASE selbst. Und die Deklaration ist bis auf die Schrittnummer von sämtlichen "Ballast" befreit.
    Ob es das besser macht, muss wieder jeder für sich entscheiden.




    Zitat Zitat von RobiHerb Beitrag anzeigen
    Wenn mit Codesys 3.x dann den Schritt als protected set und public get implementieren.
    Zitat Zitat von Bobbybau91 Beitrag anzeigen
    meine Schrittketten für die S7-1200

  7. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Wenn Schritte eingefügt werden, heißt er eben nicht mehr so wie vorher.
    ?? Wieso sollte sich da der Name ändern, da bekommen höchstens die vorhandenen Namen andere Werte?

    Wenn man konsequent nur den Name des Schrittes benutzt, dann ist der tatsächliche numerische Wert unwichtig. Am besten unbekannt - dann kommt man auch nicht in Versuchung, auf die Schrittnummer irgendwelche Berechnungen anzuwenden:
    Code:
    //sowas vermeiden!
    #Schrittnummer := #Schrittnummer + 5;
    #Ventil_Auf := (#Schrittnummer >= 5) AND (#Schrittnummer <= 7);
    
    //richtig:
    #Schrittnummer := SK_Schritt6;
    #Ventil_Auf := (#Schrittnummer = SK_Schritt5) OR (#Schrittnummer = SK_Schritt6) OR (#Schrittnummer = SK_Schritt7);
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #7
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    ?? Wieso sollte sich da der Name ändern, da bekommen höchstens die vorhandenen Namen andere Werte?
    Weil der vorherige nächste Schritt nach dem Einfügen von Zwischenschritten nicht mehr der nächste Schritt ist, sondern der übernächste oder z.B. erst der 10. danach.
    Und mit dem Namen des nächsten Schritts hat man halt ein konkretes Sprungziel, dass dann bei Neueinfügungen angepasst werden muss. Mit einem Offset zum nächsten Schritt hat man dies nicht. Da ist der nächste Schritt immer z.B. 5 Nummern weiter. Dafür müssen bei Neueinfügungen die Schrittnummern in der Deklarationsliste angepasst werden.
    Wie gesagt, hat beides Vor- und Nachteile.

    Und wie MSB schon sagte, nur Graph würde das komplett automatisch erledigen.

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

    Bobbybau91 (13.04.2016)

  10. #8
    Bobbybau91 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.05.2014
    Beiträge
    114
    Danke
    43
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Den Ansatz finde ich auf jeden Fall besser als meinen bisherigen. Werde das dann mal nachher in die Tat umsetzen.

    Danke schonmal für die Ideen.

  11. #9
    Registriert seit
    08.04.2016
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vorschlag:
    TYPE SK_TYPE:
    (SK_Ini, SK_Transport, SK_Zentrieren, SK_Next , ... )
    END_TYPE


    VAR
    SK_VALUE: SK_TYPE;
    END_VAR

    im Programm:

    case SK_VALUE of
    SK_Ini:
    machwas_1();
    SK_VALUE :=
    SK_Transport;

    SK_Transport:
    machwas_2();
    SK_VALUE :=
    SK_Zentrieren;

    SK_Zentrieren:
    machwas_3();
    SK_VALUE :=
    SK_Next;

    SK_Next:
    machwas_4();
    SK_VALUE :=
    SK_Ini;

    END_CASE


    Nachträgliche Änderungen können in der TYPE Deklaration jederzeit einfach nachgetragen/eingefügt/gelöscht werden und es reichen die symbolischen Werte dafür aus.
    So ähnlich mach ich das in "C".

    Gruß
    Thomas

Ähnliche Themen

  1. Verständnisfrage: Schrittkette verschachtelt in Schrittkette
    Von AnddnA im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 14.09.2015, 21:09
  2. Eine Frage zur Schrittkette in SCL
    Von schnecke im Forum Simatic
    Antworten: 34
    Letzter Beitrag: 05.03.2012, 20:56
  3. Schrittkette IN SCL oder mit SPL in AWL
    Von Bensen83 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 22.06.2010, 11:40
  4. Antworten: 0
    Letzter Beitrag: 16.11.2005, 16:30
  5. S7 Schrittkette
    Von Hugo-Soft im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.10.2004, 13:48

Lesezeichen

Berechtigungen

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