TIA Aufbau einer Schrittkette in SCL

Tmbiz

Level-2
Beiträge
642
Reaktionspunkte
21
Hallo, ich habe mir eine primitive Schrittkette aufgebaut. Dazu habe ich eine Case genutzt. Für die Übersichtlichkeit würde ich aber gerne die Weiterleitung in den nächsten Schritt Automatisieren. Das heisst, ich hätte gerne so was wie eine "next" aus AWL Dort habe ich immer eine SPB next eingefügt. Das hat dann eine Logik ausgeführt, die dann die Schrittnummer erhöht hat und eine über eine Sprungverteiler in den entsprechenden nächsten Schritt weiter geleitet hat.

Wie kann ich das in SCL am geschicktesten umsetzen oder nachbilden? Ich habe schon gelesen, dass man z.B. eine GOTO nutzen kann aber ist das eine gute Lösung oder gibt es da was einfacheres was ich nutzen kann?



Code:
 CASE "GlobalDB".stepnr OF
            
        1:
            "Lampe80.0" := 1;
            
            IF "SchalterE80.0" = 1
            THEN "GlobalDB".stepnr := "GlobalDB".stepnr +1;
            END_IF;
            
        2:
            "Lampe80.1" := 1;
            
            IF "SchalterE80.1" = 1
            THEN
                "GlobalDB".stepnr := "GlobalDB".stepnr +1;
            END_IF;
            
            
        3:
            "Lampe80.2" := 1;
            
            IF "SchalterE80.2" = 1
            THEN
                "GlobalDB".stepnr := "GlobalDB".stepnr +1;
            END_IF;
            
        4:
            "Lampe80.3" := 1;
            
            IF "SchalterE80.3" = 1
            THEN
                "GlobalDB".stepnr := "GlobalDB".stepnr +1;
            END_IF;
            
        5:
            "Lampe80.0" := 0;
            "Lampe80.1" := 0;
            "Lampe80.2" := 0;
            "Lampe80.3" := 0;
            
            IF "SchalterE80.4" = 1
            THEN
                "GlobalDB".stepnr := 1;
            END_IF;
            
            
            
            
        
            ;
        ELSE  // Statement section ELSE
            ;
    END_CASE;
 
Ich verstehe jetzt nicht so ganz Dein Problem, was ist denn an Deinem Beispiel nicht automatisiert? Wenn im jeweiligen Schritt die Bedingung erfüllt ist wird im nächsten Zyklus automatisch der nächste Schritt ausgeführt.
 
Ich bin der Meinung, dass der Quelltext dadurch sehr lang wird. in meiner ALW Kette, muss ich halt nur "SPB Next" schreiben. Dann kommt ein Sprung in das Netzwerk Next und dort wird dann die Weiterleitung in den nächsten Schritt erstellt. Es kann ja auch sein, dass ich gerade total falsch denke. Ich habe nicht viel Erfahrung in SCL
 
Hast Du nur streng lineare Schrittketten ohne Verzweigungen und sind Deine Schrittnummern exakt im 1-er Raster aufsteigend sortiert, daß Du auf die Idee kommst daß man mit Schrittnummern rechnen könnte? ("stepnr := stepnr + 1;" oder "IF stepnr > 12 AND stepnr < 20 THEN ..." und ähnlicher Mist)

Ein "automatisiertes" (eigentlich: für den Programmierer vermeintlich Tipparbeit sparendes) Weiterschalten in den nächsten Schritt macht das Programm unverständlicher. Und es spart auch nicht wirklich Arbeit und macht das Programm auch nicht effizienter. Und im Programmablauf umherhopsen mit GOTO braucht man in SCL nicht.
V15: In SCL GOTO-Befehl verwenden?

Harald
 
Ab V14 (Sp1?) könnte man doch anstatt Schritt:= Schritt +1;

Schritt:= +1: oder so (nennt sich glaubs sprachinovation oder so) .......

Gesendet von meinem BLN-L21 mit Tapatalk
 
Sauberes SCL:

Voraussetzung:
Lokale Temp- oder Static-Variable
next : INT

Alle Schritte als Konstanten definiert
STEP_FIRST_LAMP : INT := 100;
STEP_SECOND_LAMP : INT := 200;
STEP_THIRD_LAMP : INT := 300;
STEP_FOURTH_LAMP : INT := 400;
STEP_CLEAR_LAMPS : INT := 500;

Code:
#next := "GlobalDB".stepnr;

CASE "GlobalDB".stepnr OF
    STEP_FIRST_LAMP:
        "Lampe80.0" := TRUE;
        IF "SchalterE80.0" THEN
            #next := STEP_SECOND_LAMP;
        END_IF

    STEP_SECOND_LAMP:
        "Lampe80.1" := TRUE;
        IF "SchalterE80.1" THEN
            #next := STEP_THIRD_LAMP;
        END_IF

    STEP_THIRD_LAMP:
        "Lampe80.2" := TRUE;
        IF "SchalterE80.2" THEN
            #next := STEP_FOURTH_LAMP;
        END_IF

    STEP_FOURTH_LAMP:
        "Lampe80.3" := TRUE;
        IF "SchalterE80.3" THEN
            #next := STEP_CLEAR_LAMPS;
        END_IF

    STEP_CLEAR_LAMPS:
        "Lampe80.0" := FALSE;
        "Lampe80.1" := FALSE;
        "Lampe80.2" := FALSE;
        "Lampe80.3" := FALSE;
        IF "Schalter80.4" THEN
            #next := STEP_FIRST_LAMP;
        END_IF;

    ELSE
        ;
END_CASE;

"GlobalDB".stepnr := #next;

Die Zeit der step := step + 1; Anweisungen usw. sollte imho eigentlich lange vorbei sein.
Ich sehe es immer wieder, wenn man solche Ketten klassisch nach dem +1 Prinzip (oder SPL in S7-300) macht, und dann mal was einfügen muss, dass alles mögliche dabei schief geht. Ich selber halte mich stur an das obige Prinzip und hatte, seit ich TIA und S7-1500 einsetze, nie Probleme in der Art.
 
Zuletzt bearbeitet:
Sauberes SCL:

Voraussetzung:
Lokale Temp- oder Static-Variable
next : INT

Alle Schritte als Konstanten definiert
STEP_FIRST_LAMP : INT := 100;
STEP_SECOND_LAMP : INT := 200;
STEP_THIRD_LAMP : INT := 300;
STEP_FOURTH_LAMP : INT := 400;
STEP_CLEAR_LAMPS : INT := 500;

Code:
#next := "GlobalDB".stepnr;

CASE "GlobalDB".stepnr OF
    STEP_FIRST_LAMP:
        "Lampe80.0" := TRUE;
        IF "SchalterE80.0" THEN
            #next := STEP_SECOND_LAMP;
        END_IF

    STEP_SECOND_LAMP:
        "Lampe80.1" := TRUE;
        IF "SchalterE80.1" THEN
            #next := STEP_THIRD_LAMP;
        END_IF

    STEP_THIRD_LAMP:
        "Lampe80.2" := TRUE;
        IF "SchalterE80.2" THEN
            #next := STEP_FOURTH_LAMP;
        END_IF

    STEP_FOURTH_LAMP:
        "Lampe80.3" := TRUE;
        IF "SchalterE80.3" THEN
            #next := STEP_CLEAR_LAMPS;
        END_IF

    STEP_CLEAR_LAMPS:
        "Lampe80.0" := FALSE;
        "Lampe80.1" := FALSE;
        "Lampe80.2" := FALSE;
        "Lampe80.3" := FALSE;
        IF "Schalter80.4" THEN
            #next := STEP_FIRST_LAMP;
        END_IF;

    ELSE
        ;
END_CASE;

"GlobalDB".stepnr := #next;

Die Zeit der step := step + 1; Anweisungen usw. sollte imho eigentlich lange vorbei sein.
Ich sehe es immer wieder, wenn man solche Ketten klassisch nach dem +1 Prinzip (oder SPL in S7-300) macht, und dann mal was einfügen muss, dass alles mögliche dabei schief geht. Ich selber halte mich stur an das obige Prinzip und hatte, seit ich TIA und S7-1500 einsetze, nie Probleme in der Art.

Ah ok. Danke für dein Tipp. Ich habe meistens Schrittketten die ca 10 bis 15 Schritte lang sind. Daher hatte ich mir dem +1 System noch nicht so grosse Probleme. Man muss halt darauf achten, dass man immer in der Schrittfolge bleibt. Ich sehe denn Vorteil, denn dein System hat, weil es eindeutig ist und man sich an dem Namen des Befehls orientieren kann. Ach einen Schritt einfügen ist dann einfacher. In dem System, kann man einen neuen Schritt einfach 101 nennen und darauf verweisen. Dann muss man die anderen Schritte nicht alle umbenennen.

Könnte man das ganze so bauen, dass ich auf dem Interface der Schrittkette denn Namen des aktuellen Schrittes angezeigt bekomme? Im Int seht die Zahl. Aber kann ich auch einen Datentyp verwenden, der mit das in Schrift anzeigt? Dann müsste ich nicht immer Schrittkette öffnen sondern kann direkt am Interface schauen.

Hier in AWL:
Code:
CALL  "test", "test_DB"
         I_Freigabe_x   :=#freigabe_test
         I_Reset_x      :="Abl".Test.Reset_x
         StepNr_b       :="GlobalDB".stepnr
         IQ_Busy_x      :="Abl".Test.Busy_x
         IQ_Start_x     :="Abl".Test.Start_x
         NextStep(test) :="Schalter80.5"
 
Zuletzt bearbeitet:
Was wäre denn deine Empfehlung? Ich würde mir gerne die Option offen halten, Verzweigungen zu nutzen. Aber ich bin mir nicht sicher, wie ich das aufbauen muss. Verstehe ich es richtig, dass du mir empfiehlst, nicht meine Befehl "next" zu verwenden, sondern immer direkt zu schreiben, jetzt zu Case "4"?
 
Sauberes SCL:

Voraussetzung:
Lokale Temp- oder Static-Variable
next : INT

Alle Schritte als Konstanten definiert
STEP_FIRST_LAMP : INT := 100;
STEP_SECOND_LAMP : INT := 200;
STEP_THIRD_LAMP : INT := 300;
STEP_FOURTH_LAMP : INT := 400;
STEP_CLEAR_LAMPS : INT := 500;

Code:
#next := "GlobalDB".stepnr;

CASE "GlobalDB".stepnr OF
    STEP_FIRST_LAMP:
        "Lampe80.0" := TRUE;
        IF "SchalterE80.0" THEN
            #next := STEP_SECOND_LAMP;
        END_IF

    STEP_SECOND_LAMP:
        "Lampe80.1" := TRUE;
        IF "SchalterE80.1" THEN
            #next := STEP_THIRD_LAMP;
        END_IF

    STEP_THIRD_LAMP:
        "Lampe80.2" := TRUE;
        IF "SchalterE80.2" THEN
            #next := STEP_FOURTH_LAMP;
        END_IF

    STEP_FOURTH_LAMP:
        "Lampe80.3" := TRUE;
        IF "SchalterE80.3" THEN
            #next := STEP_CLEAR_LAMPS;
        END_IF

    STEP_CLEAR_LAMPS:
        "Lampe80.0" := FALSE;
        "Lampe80.1" := FALSE;
        "Lampe80.2" := FALSE;
        "Lampe80.3" := FALSE;
        IF "Schalter80.4" THEN
            #next := STEP_FIRST_LAMP;
        END_IF;

    ELSE
        ;
END_CASE;

"GlobalDB".stepnr := #next;

Die Zeit der step := step + 1; Anweisungen usw. sollte imho eigentlich lange vorbei sein.
Ich sehe es immer wieder, wenn man solche Ketten klassisch nach dem +1 Prinzip (oder SPL in S7-300) macht, und dann mal was einfügen muss, dass alles mögliche dabei schief geht. Ich selber halte mich stur an das obige Prinzip und hatte, seit ich TIA und S7-1500 einsetze, nie Probleme in der Art.


Hallo Max,

funktioniert dieses "symbolische Case" auch in Step7 V5.5 schon? Ich habe es gerade einmal versucht aber der Compiler schluckt es nicht.
" Die Werteliste der CASE-Anweisung ist nicht korrekt". Ich probiere es heute Abend mal unter V13.
 
funktioniert dieses "symbolische Case" auch in Step7 V5.5 schon? Ich habe es gerade einmal versucht aber der Compiler schluckt es nicht.
" Die Werteliste der CASE-Anweisung ist nicht korrekt".
Das geht auch in Step7 V5.5, allerdings kann man da den symbolischen Konstanten noch keinen Datentyp geben und muß die Konstanten-Symbole so deklarieren:
Code:
CONST
  STEP_FIRST_LAMP  := 100;
  STEP_SECOND_LAMP := 200;
  STEP_THIRD_LAMP  := 300;
  STEP_FOURTH_LAMP := 400;
  STEP_CLEAR_LAMPS := 500;
END_CONST

Harald
 
Das geht auch in Step7 V5.5, allerdings kann man da den symbolischen Konstanten noch keinen Datentyp geben und muß die Konstanten-Symbole so deklarieren:
Code:
CONST
  STEP_FIRST_LAMP  := 100;
  STEP_SECOND_LAMP := 200;
  STEP_THIRD_LAMP  := 300;
  STEP_FOURTH_LAMP := 400;
  STEP_CLEAR_LAMPS := 500;
END_CONST

Harald

Ha, tatsächlich. Es geht. Danke für den Tipp!
 
Sauberes SCL:

Voraussetzung:
Lokale Temp- oder Static-Variable
next : INT

Alle Schritte als Konstanten definiert
STEP_FIRST_LAMP : INT := 100;
STEP_SECOND_LAMP : INT := 200;
STEP_THIRD_LAMP : INT := 300;
STEP_FOURTH_LAMP : INT := 400;
STEP_CLEAR_LAMPS : INT := 500;

Sich komplett von den Schrittnummern zu lösen, also nicht

Z100 : INT := 100;

zu schreiben ist zwar ungewöhnlich, aber hat den Vorteil, das man den benannten Zustand als Sprungmarke verwendet
und keine Zahl, wo man dann erst wieder in den Kommentar schauen muss was der Schritt bedeutet.
 
Schittketten in SCL ... Für mich ist das Suppe mit Stäbchen zu essen ;)

Nimm einfach S7-Graph
Ich glaube wenn man dazu vier Programmierer befragt hat man fünf Meinungen. Ich habe es oft mit einer Schrittkette zu tun mit bestimmt ~750 Schritten (Produktion, CIP, SIP in einem) da ist SCL bzw. ST das mittel der Wahl vom Anlagenbauer gewesen. Dort wird die Kette über eine Case..of realisiert, man kann im manuellen Modus in jeden fast Schritt springen und wieder zum Ursprung zurück.
Also Pauschal würde ich sagen wenn jemand die Suppe mit den Stäbchen ist könnte der auch fertig werden ;)
 
Sich komplett von den Schrittnummern zu lösen, also nicht

Z100 : INT := 100;

zu schreiben ist zwar ungewöhnlich, aber hat den Vorteil, das man den benannten Zustand als Sprungmarke verwendet
und keine Zahl, wo man dann erst wieder in den Kommentar schauen muss was der Schritt bedeutet.
Der Thread ist 6 Jahre alt....

Ja, die Konstante hat zudem den Vorteil dass sie querverweisfähig ist
 
Zurück
Oben