Zyklus-Verständnisproblem in SCL

anne

Level-1
Beiträge
347
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr,

ich hänge grad an einer SCL-Programmierung - muss da was ändern...


Beispielsweise ist folgender (vereinfachte) Code programmiert:

Code:
CASE Status_2 OF      

0:  IF ("Eingang_1" = true) THEN
        Status_2 := 2;  
    END_IF;


2:  IF ("Eingang_2" = true) THEN
        Status_2 := 3;  
    END_IF;                                                 


3:  IF ("Eingang_3" = true) THEN
        Status_2 := 4;  
    END_IF;
      
END_CASE ;
Soweit ich es verstehe handelt es sich um eine Art Schrittkette.


1) Beim ersten Zyklusdurchlauf werden ja alle Schritte durchlaufen; also von oben nach unten erst Schritt 0, dann Schritt2 und dann Schritt3, oder?

2) Nehmen wir jetzt mal an, es seien beim ersten Zyklusdurchlauf alle drei Bedingungen erfüllt gewesen, so sind dem Status_2 ja nacheinander die Werte 2, 3 und 4 zugewiesen worden.

Jetzt kommt der 2. Zyklusdurchlauf:

Was passiert nun? Wird nun zu jedem Schritt gesprungen, da im ersten Zyklus ja jeder Wert zugewiesen wurde, oder wird jetzt nur zu Schritt4 (in obigen Code nicht mehr aufgeführt) gesprungen, da der Wert 4 die letzte Zuweisung im ersten Zyklus war?


:confused: Ist echt verwirrend für mich...

Lieben Dank für eure Hilfe!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, letzte Zuweisung gilt! :D

Vielen Dank Paule!

Also würde im 2. Zyklus nur zu Schritt 4 gesprungen werden, richtig?

Aber was passiert dann mit den Anweisungen in Schritt 0, 2 und 3? Die waren ja (im ersten Zyklus) auch alle erfüllt und werden jetzt (im zweiten Zyklus) einfach übersprungen... d.h. wenn dort z.B. Ausgänge geschaltet werden, passiert im zweiten Zyklusdurchlauf gar nichts!
 
Vielen Dank Paule!

Also würde im 2. Zyklus nur zu Schritt 4 gesprungen werden, richtig?

Aber was passiert dann mit den Anweisungen in Schritt 0, 2 und 3? Die waren ja (im ersten Zyklus) auch alle erfüllt und werden jetzt (im zweiten Zyklus) einfach übersprungen... d.h. wenn dort z.B. Ausgänge geschaltet werden, passiert im zweiten Zyklusdurchlauf gar nichts!

Die CASE-Anweisung wird nach dem ersten erfolgreichen Vergleichs verlassen. Die nachfolgenden Anweisungen werden dann nicht mehr ausgeführt.

In einem Programm wären die Werte der Variable "Status_2" in den Zyklen folgendermaßen:

Zyklus 0 (Start): 0
nach 1. Zyklus: 2
nach 2. Zyklus: 3
nach 3. Zyklus: 4

Danach wird im CASE keine Anweisung ausgeführt, da keine Übereinstimmung gegeben ist und kein ELSE-Zweig vorhanden ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Paule: Kein Problem, dafür gibt es ja dieses super Forum... sonst sind deine Antworten aber immer TOP! ;)

@Thomas: Danke, denke das habe ich dann verstanden.

Kann man es auch so ausdrücken:

1) Im allerersten Zyklus wird sogleich an die Stelle "0:" gesprungen, da ja zu Beginn der Wert 0 in der Variable "Status_2" steht.

2) Bei Übereinstimmung wird jetzt der Wert 2 in die Variable "Status_2" geschrieben, so dass im zweiten Zyklus sofort an die Stelle "2:" gesprungen wird.

Wenn dem so ist, dann handelt es sich ja eher um Sprunganweisungen als um eine Schrittkette, oder?
 
Wenn dem so ist, dann handelt es sich ja eher um Sprunganweisungen als um eine Schrittkette, oder?

Ich würde es als Fallunterscheidung bezeichnen. Genau wie IF..THEN..ELSE quasi eine Fallunterscheidung für boolsche Ausdrücke ist, ist CASE..OF eine Fallunterscheidung für numerische Ausdrücke.
 
Hi ihr,
also es handelt sich um ein Programm für eine Paket-Auslieferungsstation. In den einzelnen Schritten stehen natürlich noch Anweisungen für die Ausgänge der Zylinder und Schleusen entlang dem Fließband...

Wird nur Status_2 verwendet, so ist mir die Funktionalität nun soweit klar!


Aber im realen Programm gibt es ja auch noch Status_3, usw.

Beispiel:

Code:
CASE Status_2 OF      

0:  IF ("Eingang_1" = true) THEN
        Status_2 := 2;  
    END_IF;


2:  IF ("Eingang_2" = true) THEN
        Status_2 := 3;  
    END_IF;                                                 


3:  IF ("Eingang_3" = true) THEN
        Status_2 := 4;  
    END_IF;
      
END_CASE ;



CASE Status_3 OF 

0:  IF ("Eingang_7" = true) THEN
        Status_3 := 3;  
    END_IF;


3:  IF ("Eingang_5" = true) THEN
        Status_3 := 5;  
    END_IF;                                                 


5:  IF ("Eingang_6" = true) THEN
        Status_3 := 0;  
    END_IF;
      
END_CASE ;
Frage:

Angenommen es sind "Eingang_1" = true und "Eingang_7" = true, so würde ja im ersten Zyklus Status_2 der Wert 2 und Status_3 der Wert 3 zugewiesen werden.

Was passiert nun aber im nächsten Zyklus?

Springt das Programm jetzt zuerst zu Schritt 2 (in Status_2) und anschließend zu Schritt 3 (in Status_3)?

Vielen Dank!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
die beiden "CASEs" sind getrennt voneinander zu betrachten, da der eine mit Status_2 der andere mit Status_3 arbeitet.
Für mich sieht das nach 2 Schrittketten aus die parallel abgearbeitet werden.
Wenn die Eingänge von Status_2 nacheinander kommen, dann wird die Schrittkette abgearbeitet. Gleichzeitig kann die 2.Schrittkette einfach "stehen" weil z.B. der Eingang_7 nicht kommt.
 
Wie Günni schon sagte, jede CASE Anweisung ist da separat zu betrachten. Es wird in jedem Zyklus der Wert der Variable geprüft (in deinem Fall Status_2 für die erste CASE-Anweisung und nachdem diese komplett abgearbeitet wurde Status_3 für die zweite CASE-Anweisung). Je nach dem welchen Wert die Variable hat, wird der entsprechende Programmzweig abgearbeitet. Dieser Programmzweig wird nach der Abarbeitung verlassen (es werden in diesem Zyklus keine anderen Programmzweige dieser CASE Anweisung ausgeführt) und die CASE-Anweisung im nächsten Zyklus erneut aufgerufen.

In deinem Beispiel bedeutet das (angenommen Status_2 und Status_3 sind beim Programmstart wirklich Null und nicht mit einem Startwert definiert):
In der ersten CASE-Anweisung wird der Programmzweig für Status_2 = 0
Code:
IF ("Eingang_1" = true) THEN
    Status_2 := 2;  
END_IF;
so lange jeden Zyklus ausgeführt, bis Eingang_1 TRUE wird und dadurch Status_2 auf 2 gesetzt wird. Wenn dieser Fall eingetreten ist, wird im nächsten SPS Zyklus der Programmzweig für Status_2 = 2 abgearbeitet, also:
Code:
IF ("Eingang_2" = true) THEN
    Status_2 := 3;  
END_IF;
Dieser wird wieder so lange abgearbeitet, bis irgendwann Eingang_2 TRUE wird. Usw.. In der zweiten CASE-Anweisung ist das natürlich analog

Zurück zur Frage
Was passiert nun aber im nächsten Zyklus?
In der ersten CASE Anweisung wird der Programmzweig für Status_2 = 2 und in der zweiten CASE Anweisung der Programmzweig für Status_3 = 3 abgearbeitet..
 
Für mich sieht das nach 2 Schrittketten aus die parallel abgearbeitet werden...
Vielen Dank für eure Mühe mit mir... ;)


Parallel heißt aber trotzdem, dass im ersten Zyklus zunächst

1) in der ersten CASE-Anweisung der Programmzweig für Status_2 = 0

Code:
0:  IF ("Eingang_1" = true) THEN
        Status_2 := 2;  
    END_IF;
ausgeführt wird und dann gleich danach

2) in der zweiten CASE-Anweisung der Programmzweig für Status_3 = 0

Code:
0:  IF ("Eingang_7" = true) THEN
        Status_3 := 3;  
    END_IF;
ausgeführt wird, oder?

Das geht dann auch in den nächsten Zyklen so weiter, bis entweder Eingang_1 TRUE UND/ODER Eingang_2 TRUE wird...

In den darauffolgenden Zyklen wird dann, entsprechend dem Ergebnis der beiden Eingänge, zu den entsprechenden Schritten (erst immer im Case für Status_2 und dann im Case für Status_3) "gesprungen"...

Stimmt das so?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Parallel heißt aber trotzdem, dass im ersten Zyklus zunächst

1) in der ersten CASE-Anweisung der Programmzweig für Status_2 = 0
ausgeführt wird und dann gleich danach

2) in der zweiten CASE-Anweisung der Programmzweig für Status_3 = 0
ausgeführt wird, oder?
Ja, genau so ist es.
Das geht dann auch in den nächsten Zyklen so weiter, bis entweder Eingang_1 TRUE UND/ODER Eingang_2 TRUE wird...
Falls du Eingang_1 und/oder Eingang_7 meinst: Ja. Denn dann werden die Variablen Status_2 bzw. Status_3 geändert die für die jeweiligen CASE-Sprünge verantwortlich sind.
In den darauffolgenden Zyklen wird dann, entsprechend dem Ergebnis der beiden Eingänge, zu den entsprechenden Schritten (erst immer im Case für Status_2 und dann im Case für Status_3) "gesprungen"...
Stimmt das so?
Jein, es wird nicht in Abhängigkeit der Eingänge "gesprungen" sondern in Abhängigkeit des aktuellen Wertes der Variablen Status_2 bzw. Status_3
 
Vielen Dank für deine Unterstützung "mainzelmann"!

Falls du Eingang_1 und/oder Eingang_7 meinst: Ja. Denn dann werden die Variablen Status_2 bzw. Status_3 geändert die für die jeweiligen CASE-Sprünge verantwortlich sind.
Ja genau, meinte Eingang_1 und/oder Eingang_7.

Jein, es wird nicht in Abhängigkeit der Eingänge "gesprungen" sondern in Abhängigkeit des aktuellen Wertes der Variablen Status_2 bzw. Status_3

Ja, stimmt - aber ich wollte damit eigentlich ausdrücken, dass zyklusbedingt (von oben nach unten) immer erst
Case Status_2 und erst danach Case Status_3 "abgescannt" wird; und zwar unabhängig von den aktuellen Werten der Variablen Status_2 bzw. Status_3.


Stimmt doch, oder? :p
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, ich glaub jetzt hast du es :-D

Na bei dem Lehrer... ;)


Aber eine Frage ist mir doch noch eingefallen:

Es wird ja zyklusbedingt zuerst der Wert der Variable für Status_2 und anschließend für Status_3 überprüft und gespeichert. Diese Werte stehen ja dann im nächsten Zyklus wieder zur Verfügung...

Werden diese Werte im Prozessabbild gespeichert oder sonst wo?

Lieben Dank!
 
naja ... eher da, wo die beiden Variablen landen.

Hast du hier einen FB, dann sind die sehr wahrscheinlich im STAT-Bereich desselben deklariert und werden somit in dem Instanz-DB zu dem FB gesichert.
Hast du einen FC so müßten es Variablen der IN_OUT-Schnittstelle sein, die dann wieder in globalen Variablen (z.B. in einem DB) landen.

Gruß
Larry
 
Hi LL,

das Programm ist in einem FB mit Instanz-DB angelegt.

Wir "reden" aber schon über die einzelnen Werte, die in jedem Zyklus Status_2, bzw. Status_3 zugewiesen und gespeichert werden, oder?
 
Zurück
Oben