TIA Parallele Ablaufsteuerung in SCL

arren

Level-2
Beiträge
66
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

ich habe die folgende Ablaufkette in SCL programmiert:
grafcet.png

Code:
IF "Startimpuls" THEN
    "Schritt_0" := 1;
END_IF;

IF "Schritt_0" THEN
    "BWG_U" := 0;
    IF "Freigabe" THEN
        "Schritt_0" := 0;
        "Schritt_1" := 1;
        "Schritt_3" := 1;
    END_IF;
    
ELSIF "Schritt_1" AND "Schritt_3" THEN
    "BWG_R" := 1;
    "BWG_O" := 1;
    IF "rechte Endlage" THEN
        "Schritt_1" := 0;
        "Schritt_2" := 1;
        "BWG_R" := 0;
    ELSIF
        "obere Endlage" THEN
        "Schritt_3" := 0;
        "Schritt_4" := 1;
        "BWG_O" := 0;
    END_IF;
    
ELSIF "Schritt_1" OR "Schritt_3" THEN
    IF "rechte Endlage" THEN
        "Schritt_1" := 0;
        "Schritt_2" := 1;
        "BWG_R" := 0;
    ELSIF
        "obere Endlage" THEN
        "Schritt_3" := 0;
        "Schritt_4" := 1;
        "BWG_O" := 0;
    END_IF;
    
ELSIF "Schritt_2" AND "Schritt_4" THEN
    IF "Punkt erreicht" THEN
        "Schritt_2" := 0;
        "Schritt_4" := 0;
        "Schritt_5" := 1;
    END_IF;
    
ELSIF "Schritt_5" THEN
    "BWG_U" := 1;
    IF "abwärts" THEN
        "Schritt_5" := 0;
        "Schritt_0" := 1;
    END_IF;
END_IF;

Bei linearen Ablaufketten verwende ich eine CASE-Anweisung, sodass ich nur eine Schrittvariable habe, und nicht wie hier bei der Parallelen Ablaufkette für jeden Schritt einen (Schritt_1, Schritt_2, usw.)

Da bei der parallelen Ablaufsteuerung zwei Abarbeitungen gleichzeitig stattifnden, ist es meines Erachtens nicht möglich an dieser Stelle mit einer Variablen zu arbeiten. Gäbe es denn hier generell irgend welche Vereinfachungen, die ich vornehmen könnte? Ich komme da auf keinen grünen Zweig....
 
Eine Vereinfachung könnte sein, die ELSIF Abfragen weglässt und nur die If Abfragen benutzt.

Code:
IF "Startimpuls" THEN
    "Start" := TRUE;
    "Schritt" := 0;
    "Startimpuls" := False;
END_IF;
If "Stopimpuls" then
    "Start" := False;
End_IF;

IF "Schritt" =0 AND Start THEN
    "BWG_U" := 0;
    IF "Freigabe" THEN
        "Schritt" := 1;
    END_IF;
End_IF;    
IF "Schritt" = 1 AND Start THEN
    "BWG_R" := 1;
    "BWG_O" := 1;
    IF "rechte Endlage" THEN
        "BWG_R" := 0;[COLOR=#ff0000]
  [/COLOR]  End_IF;
    IF "obere Endlage" THEN
        "BWG_O" := 0;
    END_IF;
    If Obere Endlage AND Rechte Endlage then
         Schritt := 2;
    End_IF;
End_IF;
    
IF "Schitt"=2 AND "Punkt erreicht" AND Start THEN
    "Schritt" := 3;
END_IF;
    
If "Schritt" = 3 AND Start THEN
    "BWG_U" := 1;
    IF "abwärts" THEN
        "Schritt" := 0;
    END_IF;
END_IF;

Solange Start anliegt, wiederholt er die Kette andauernd.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Man könnte ja eine zweite Case-Anweisung machen, die von der ersten Case-Anweisung aus gestartet wird. Und bei der zusammenführung wartet die erste Case-Anweisung wieder auf die zweite.

Gruss blimaa
 
Wenn du mit dem If-Konstrukt arbeiten willst dann solltest du das auch so machen, wie es dein Bild vorgibt :
Code:
IF "Schritt_0" THEN
    "BWG_U" := 0;
    IF "Freigabe" THEN
        "Schritt_0" := 0;
        "Schritt_1A" := 1;
        "Schritt_1B" := 1;
    END_IF;
    
ELSIF "Schritt_1A" THEN
    "BWG_R" := 1;
    IF "rechte Endlage" THEN
        "Schritt_1A" := 0;
        "Schritt_2A" := 1;
        "BWG_R" := 0;
    END_IF;
    
ELSIF "Schritt_1B" THEN
    "BWG_O" := 1;
    IF "obere Endlage" THEN
        "Schritt_1B" := 0;
        "Schritt_2B" := 1;
        "BWG_O" := 0;
    END_IF;
    
ELSIF "Schritt_2A" AND "Schritt_2B" THEN
        "Schritt_5" := 1;
    
ELSIF "Schritt_5" THEN
    "BWG_U" := 1;
    IF "abwärts" THEN
        "Schritt_5" := 0;
        "Schritt_0" := 1;
    END_IF;
END_IF;

Ich hoffe. ich habe den Code so richtig korrigiert.

Wenn du mit SELECT wie gewohnt arbeiten willst dann würde ich für simultane Zweige eigene Unterschrittketten machen, die du gleichzeitig startest und von beiden deren Abarbeitung abfragst. Das lohnt sich natürlich nicht so sehr wenn es nur 2 Schritte sind - aber übersichtlicher wäre es schon ...

Gruß
Larry
 
Hallo zusammen:)
Ich befürchte die Idee von Lary wird so nicht funktionieren, da die weiteren Elsif Bedingungen nur dann abgefragt werden wenn alle davor nicht erfüllt sind.
Bedeutet er würde erst nachdem Schritt_1A abgearbeitet und die rechte Endlage erreicht ist mit schritt 1B beginnen.
und da in diesem beispiel Schritt_2A und 2B nie zurück gesetzt werden wird der Schritt 5 nie ausgeführt da die Bedingung davor immer noch wahr ist.

Mit Elsif kann man Schrittketten Programmieren da würde ich aber immer empfehlen diese von hinten nach vorne zu programmieren. Da muss man weniger verriegelungen machen da zB die letzte elsif bedingung ruhig wahr sein kann ( bsp Schritt1 ) aber trotzdem nicht ausgeführt wird da die bedingung davor (Schritt 2) auch schon wahr ist.

Mit verschachtelten Case-Schleifen würde eine Parallelverzweigung so aussehen:

Code:
CASE Hauptschrittkette OF
    0:
        //Aktion
        "BWG_U" := 0;
        //bedingung für nächsten schritt
        IF "Freigabe" THEN
            "Hauptschrittkette" := 1;
            
            "Parallelschrittkette_A" := 1;
            "Parallelschrittkette_B" := 1;
        END_IF;
    1:
        // Aktion
        CASE Parallelschrittkette_A OF
            1:
                //Aktion
                "BWG_R" := 1;
                // Bedingung für nächsten schritt
                IF "rechte Endlage" THEN
                    "Parallelschrittkette_A" := 2;
                    "BWG_R" := 0;
                END_IF;
            2:
                ;
        END_CASE;
        
        CASE Parallelschrittkette_B OF
            1:
                //Aktion
                "BWG_O" := 1;
                // Bedingung für nächsten schritt
                IF "obere Endlage" THEN
                    "Parallelschrittkette_A" := 2;
                    "BWG_O" := 0;
                END_IF;
            2:
                ;
        END_CASE;
        
        //bedingung für nächsten schritt
        IF Parallelschrittkette_A = 2 AND Parallelschrittkette_B = 2 THEN
            Hauptschrittkette := 5;
        END_IF;
        
    5:
        //Aktion
        "BWG_U" := 1;
        // Bedingung für nächsten schritt
        IF "abwärts" THEN
            Hauptschrittkette := 0;
        END_IF;
END_CASE;

Für eine normale abzweigung würde man bei der "IF freigabe then" einfach für jede abzweigung eine weitere elsif bedingung hintendran hängen.


In deinem Fall würde ich aber auf die Parallelschrittketten verzichten da sie bei nur einer Anweisung nicht nötig sind:

Code:
CASE Hauptschrittkette OF
    0:
        //Aktion
        "BWG_U" := 0;
        //bedingung für nächsten schritt
        IF "Freigabe" THEN
            "Hauptschrittkette" := 1;
            
        END_IF;
    1:
        // Aktion
        "BWG_R" := NOT "rechte Endlage";
        "BWG_O" := NOT "obere Endlage";
                


        
        //bedingung für nächsten schritt
        IF "rechte Endlage"  AND "obere Endlage" THEN
            Hauptschrittkette := 3;
        END_IF;
        
    3:
        //Aktion
        "BWG_U" := NOT "abwärts";
        // Bedingung für nächsten schritt
        IF "abwärts" THEN
            Hauptschrittkette := 0;
        END_IF;
END_CASE;

Ich hoffe ich konnte weiterhelfen

grüße Balu
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es eigentlich einen Grund, Schrittketten in SCL zu machen, wenn es dafür GRAPH gibt ?
Es ist ja kaum noch analysefähig, bei mehr als 10-15 Schritten und gerade auch noch wenn Parallelzweige drin sind
 
Gibt es eigentlich einen Grund, Schrittketten in SCL zu machen, wenn es dafür GRAPH gibt ?
Es ist ja kaum noch analysefähig, bei mehr als 10-15 Schritten und gerade auch noch wenn Parallelzweige drin sind

viele Kunden wollen aus Kostengründen lieber ne 1200 anstatt ne 1500 und die kann kein Graph.
und wenn ich Funktionen programmiere will ich die möglichst mit einem Baustein programmieren. Zu einer eventuell nötigen kleinen Schrittkette kommt dann meist noch ein wenig Berechnung dazu und das wird in Graph schon wieder umständlich.

Aber bei größeren Schrittketten würde ich auch immer Graph benutzen.
 
Gibt es eigentlich einen Grund, Schrittketten in SCL zu machen, wenn es dafür GRAPH gibt ?
Es ist ja kaum noch analysefähig, bei mehr als 10-15 Schritten und gerade auch noch wenn Parallelzweige drin sind

Bei der Verwendung von CASE in SCL gibt es keine Schrittkette, die für mich umfangreich mit komplexen Aufgaben ausstattbar ist und gleichzeitig sehr analysefähig bleibt. Es bleibt für mich die beste Art Schrittketten zu schreiben. Aber jeder soll es am Besten so machen, dass er am effektivsten arbeiten kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, so rum kann ich das schon nachvollziehen.
Ich habe mal einen ähnlichen Fall auf 1500er, aber noch wesentlich komplexer und und undurchsichtiger, und da fragt man sich, ob der Programmierer einfach ein Hochsprachenfreak ist.
 
Wenn du mit dem If-Konstrukt arbeiten willst dann solltest du das auch so machen, wie es dein Bild vorgibt :
Code:
IF "Schritt_0" THEN
    "BWG_U" := 0;
    IF "Freigabe" THEN
        "Schritt_0" := 0;
        "Schritt_1A" := 1;
        "Schritt_1B" := 1;
    END_IF;
    
ELSIF "Schritt_1A" THEN
    "BWG_R" := 1;
    IF "rechte Endlage" THEN
        "Schritt_1A" := 0;
        "Schritt_2A" := 1;
        "BWG_R" := 0;
    END_IF;
    
ELSIF "Schritt_1B" THEN
    "BWG_O" := 1;
    IF "obere Endlage" THEN
        "Schritt_1B" := 0;
        "Schritt_2B" := 1;
        "BWG_O" := 0;
    END_IF;
    
ELSIF "Schritt_2A" AND "Schritt_2B" THEN
        "Schritt_5" := 1;
    
ELSIF "Schritt_5" THEN
    "BWG_U" := 1;
    IF "abwärts" THEN
        "Schritt_5" := 0;
        "Schritt_0" := 1;
    END_IF;
END_IF;

Ich hoffe. ich habe den Code so richtig korrigiert.

Wenn du mit SELECT wie gewohnt arbeiten willst dann würde ich für simultane Zweige eigene Unterschrittketten machen, die du gleichzeitig startest und von beiden deren Abarbeitung abfragst. Das lohnt sich natürlich nicht so sehr wenn es nur 2 Schritte sind - aber übersichtlicher wäre es schon ...

Gruß
Larry

Hi Larry,

dein vorschlag sieht im ersten Augenblick gut aus und ist auch kürzer als mein Ansatz, jedoch wird es so nicht funktionieren. Für eine verzweigte Ablaufsteuerung schon, jeodch nicht für eine Parallele.

Code:
ELSIF "Schritt_1A" THEN
    "BWG_R" := 1;
    IF "rechte Endlage" THEN
        "Schritt_1A" := 0;
        "Schritt_2A" := 1;
        "BWG_R" := 0;
    END_IF;
    
ELSIF "Schritt_1B" THEN
    "BWG_O" := 1;
    IF "obere Endlage" THEN
        "Schritt_1B" := 0;
        "Schritt_2B" := 1;
        "BWG_O" := 0;
    END_IF;

Hier entscheidet sich die CPU für eines der Zweige und nicht für beide, daher wird nur eines der Schritte initialisiert. entweder 1A ODER 1B.
 
Das hatte Balu im Beitrag #5 auch schon angemerkt.
Das könntest du jetzt entsprechend dieses Vorschlages machen ... oder du machst es mit IF's statt ELSIF's bei jedem der Schritte - dann würde die simultane Abarbeitung auch wieder funktionieren ...

Gruß
Larry
 
Zurück
Oben