Lesen dieses SCL Programmteils

azza

Level-1
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe 1-2 Fragen:

Wie lese ich das untenstehende Programm?
Deute ich das richtig wenn ich sage:

U za.pospal41=1
UN esteine41
U epalbe41

L za.pakofo41
T za.abbe41
usw
usw
usw


ODER:

O za.pospal41=1
ON esteine41
O epalbe41

L za.pakofo41
T za.abbe41
usw
usw
usw

Mein Problem ist es das ich nicht genau weiß ob ich die aufeinanderfolgenden IF-Anweisungen als ODER bzw UND Verknüpfung betrachten kann.
Oder kann man das so Pauschal gar nicht sagen ?

Frage 2:

Ist das richtig:
Wenn die erste IF Anweisung nicht erfüllt wird, dann ist EndIf.
Wenn die erste erfüllt wird aber die zweite nicht, dann ist EndIf.
wird die erste und die zweite erfüllt aber die dritte nicht, dann (aber auch nur dann) ist ELSE und der Teil nach ELSE wird ausgeführt?
werden alle 3 Ifs erfüllt werden die Befehle nach dem dritten IF ausgeführt.

ist das korrekt?

Danke schon mal!

pal41:
IF sm(p:=za.pospal41 ,s:=za.stom41) = 1 THEN //wenn Linie B Abgabepos. Steine ist frei(DB1.DBW640) dann
IF aba (p:=esteine41 ,s:=za.stom41) = aus THEN //wenn E16.0(esteine41) ist 0 dann
IF abe (p:=epalbe41 , s:=za.stom41) = ein THEN //wenn E16.2(epalbe41) ist 1 dann
za.abbe41:=za.pakfo41; //setze Linie B Abgabe(DB1.DBW652)= Kette B Palette vorfahren Linie B(DB1.DBW650)
za.start41:=1; //setze Kette B Startsignal an Paketierung(DB1.DBW644)auf 1
za.frei41:=0; //setze Freigabe von Paketierung(DB1.DBW642)auf 0
mstart_lb := aus; //setze M122.3 Linie B Start Fremdförderer MSK auf 0
GOTO inf41; //nächster Schritt
ELSE //ansonsten
za.abbe41:=za.pakfo41; //setze Linie B Abgabe(DB1.DBW652)= Kette B Palette vorfahren Linie B(DB1.DBW650)
za.pakfo41:=0 ; //setze Kette B Palette vorfahren Linie B(DB1.DBW650)auf 0
za.frei41:=0; //setze Freigabe von Paketierung(DB1.DBW642)auf 0
GOTO inf41; //nächster Schritt
END_IF;
END_IF;
END_IF;
 
Code:
IF sm(p:=za.pospal41 ,s:=za.stom41) = 1 THEN            //wenn Linie B Abgabepos. Steine ist frei(DB1.DBW640) dann
        IF aba (p:=esteine41 ,s:=za.stom41) = aus THEN      //wenn E16.0(esteine41) ist 0 dann
            IF abe (p:=epalbe41 , s:=za.stom41) = ein THEN  //wenn E16.2(epalbe41) ist 1 dann
                za.abbe41:=za.pakfo41;                      //setze  Linie B Abgabe(DB1.DBW652)= Kette B Palette vorfahren Linie  B(DB1.DBW650)
                za.start41:=1;             //setze Kette B Startsignal an Paketierung(DB1.DBW644)auf 1
                za.frei41:=0;              //setze Freigabe von Paketierung(DB1.DBW642)auf 0
                mstart_lb := aus;          //setze M122.3 Linie B Start Fremdförderer MSK auf 0
                GOTO inf41;                //nächster Schritt
        ELSE                               //ansonsten
                za.abbe41:=za.pakfo41;     //setze Linie B Abgabe(DB1.DBW652)= Kette B Palette vorfahren Linie B(DB1.DBW650)
                za.pakfo41:=0 ;            //setze Kette B Palette vorfahren Linie B(DB1.DBW650)auf 0
                za.frei41:=0;              //setze Freigabe von Paketierung(DB1.DBW642)auf 0
                GOTO inf41;                //nächster Schritt
            END_IF;
        END_IF;
    END_IF;
Code bitte immer mit dem #-Symbol einfügen.

Zu Frage 1: Zuerst 2x UND, dann ODER. So wie Du es in Frage 2 schilderst

Zu Frage 2: Das ist so richtig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So sieht das mit Einrückung aus
Code:
IF sm(p:=za.pospal41 ,s:=za.stom41) = 1 THEN //wenn Linie B Abgabepos. Steine ist frei(DB1.DBW640) dann
   IF aba (p:=esteine41 ,s:=za.stom41) = aus THEN //wenn E16.0(esteine41) ist 0 dann
      IF abe (p:=epalbe41 , s:=za.stom41) = ein THEN //wenn E16.2(epalbe41) ist 1 dann
[COLOR=#ff0000]         za.abbe41:=za.pakfo41; //setze Linie B Abgabe(DB1.DBW652)= Kette B Palette vorfahren Linie B(DB1.DBW650)
         za.start41:=1; //setze Kette B Startsignal an Paketierung(DB1.DBW644)auf 1
         za.frei41:=0; //setze Freigabe von Paketierung(DB1.DBW642)auf 0
         mstart_lb := aus; //setze M122.3 Linie B Start Fremdförderer MSK auf 0
         GOTO inf41; //nächster Schritt[/COLOR]
      ELSE //ansonsten
 [COLOR=#0000ff]        za.abbe41:=za.pakfo41; //setze Linie B Abgabe(DB1.DBW652)= Kette B Palette vorfahren Linie B(DB1.DBW650)
         za.pakfo41:=0 ; //setze Kette B Palette vorfahren Linie B(DB1.DBW650)auf 0
         za.frei41:=0; //setze Freigabe von Paketierung(DB1.DBW642)auf 0
         GOTO inf41; //nächster Schritt[/COLOR]
      END_IF;
   END_IF;
END_IF;

Daraus kann man dann viel besser sehen, dass

1. alle 3 IF-Abfragen erfüllt sein müssen (alle UND), damit der rote Teil abgearbeitet wird.

2. die ersten 2 If-Abfragen erfüllt sein müssen und die 3. nicht erfüllt sein darf, damit der blaue Teilabgearbeitet wird.

Zusammengenommen:

IF1 UND IF2 UND IF3 --> roter Teil
IF1 UND IF UND NICHT IF3 --> blauer Teil

PS. GOTO zu verwenden ist m.E. kein guter Programmierstil.
 
Zuletzt bearbeitet:
Verschachtelte IF-Amweisungen entsprechen Und-Verknupfungen.
Insofern bist du mit deiner 1. Variante wohl richtig.
Du musst dir aber auch noch die Funktionen "sm" "aba" und "abe" anschauen.
Denn das Ergebnis dieser Funktionen besatimmt eigentlich das Ergebnis der IF-Abfragen.

Deine Aussagen zu Frage 2 stimmen

Aber ehrlich gesagt, ist der Code ein richtig gutes Beispiel wie SCL nicht aussehen soll!
Üblich sind eigentlich Einrückungen im Code

Code:
pal41:
  IF sm(p:=za.pospal41 ,s:=za.stom41) = 1 THEN            //wenn Linie B Abgabepos. Steine ist frei(DB1.DBW640) dann
    IF aba (p:=esteine41 ,s:=za.stom41) = aus THEN      //wenn E16.0(esteine41) ist 0 dann
      IF abe (p:=epalbe41 , s:=za.stom41) = ein THEN  //wenn E16.2(epalbe41) ist 1 dann
        za.abbe41:=za.pakfo41;                      //setze  Linie B Abgabe(DB1.DBW652)= Kette B Palette vorfahren Linie  B(DB1.DBW650)
        za.start41:=1;             //setze Kette B Startsignal an Paketierung(DB1.DBW644)auf 1
        za.frei41:=0;              //setze Freigabe von Paketierung(DB1.DBW642)auf 0
        mstart_lb := aus;          //setze M122.3 Linie B Start Fremdförderer MSK auf 0
        GOTO inf41;                //nächster Schritt
      ELSE                               //ansonsten
        za.abbe41:=za.pakfo41;     //setze Linie B Abgabe(DB1.DBW652)= Kette B Palette vorfahren Linie B(DB1.DBW650)
        za.pakfo41:=0 ;            //setze Kette B Palette vorfahren Linie B(DB1.DBW650)auf 0
        za.frei41:=0;              //setze Freigabe von Paketierung(DB1.DBW642)auf 0
        GOTO inf41;                //nächster Schritt
      END_IF;
    END_IF;
  END_IF;

Dann wird die Sache übersichtlicher
Gruß
Dieter
 
Zuletzt bearbeitet:
Hallo,

eine Vergleich einer IF-Anweisung mit UND und ODER ist meines erachtens nicht pauschal möglich. Eine einzelne IF-Anweisung kann ja schon ein ODER und ein UND enhalten.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

eine Vergleich einer IF-Anweisung mit UND und ODER ist meines erachtens nicht pauschal möglich. Eine einzelne IF-Anweisung kann ja schon ein ODER und ein UND enhalten.

Gruß

Doch natürlich ist das möglich. Du musst halt die komplette IF-Anweisung betrachen.
Der Compiler macht auch nix anderes. Schau dir mal den AWL-Code eines SCL-Bausteins an.

Gruß
Dieter
 
Hallo,

erstmal danke für eure Hilfe!

Zu meiner Verteidigung wegen des Programms und dessen Struktur, Ausdrücke Art und Weise sei folgendes gesagt.

Meine Aufgabe besteht darin es in FUP umzuschreiben da SCL nicht wirklich bei uns verwendet wird AUSSER in dieser Anlage. Diese Anlage wurde vor ca 7 Jahren geliefert so wie Ihr es hier seht (kleiner Teil). Ich denke wenn ich euch andere SCL Bausteine in kompletter Pracht zeige dann schlackert ihr mit den Ohren....falls einer es sehen will dann bitte anmailen ;). Das gesamte Programm ist meiner Meinung nach so was von kompliziert und undurchsichtig (eine Mischung aus SCL-AWL-FUP und KOP Bausteinen) geschrieben das eine Fehlersuche immer damit endet das man im SCL Baustein nicht mehr weiter weiß! Zumal wir alle keine SCL Cracks sind. Ich hatte mal son kleinen Siemens Crashkurs aber das richtige lesen bzw verstehen und lernen erfolgt halt jetzt erst.
Für mich heißt das Step by Step einen kleinen Teil umzuschreiben, schauen was passiert und somit zu "wachsen" bis die dicken Brocken kommen, hehe8)

DANKE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was meintet ihr mit Code #?

Wenn du einen neuen Beitrag mit Programmcode erstellst, kannst du im erweiterten Editor oben in der Zeile das Pragma # auswählen. Vorher den Programmiercode im Editor markieren, dann wird der Code im Forum richtig lesbar dargestellt.
 
Ob SCL jetzt bei dem Codeschnippsel das Mittel der Wahl ist, sei mal dahingestellt ...

Aber das dein Programm lesbarer oder noch wichtiger nachvollziehbarer wird, nur weil du die SCL Konstruckte einzeln und händsich auf FUP übersetzt,
kann ich mir irgendwie nicht vorstellen.
Die Bedingung der 3 Ifs sind ja scheinbar auch noch Bausteinaufrufe, von "sm, aba, abe", düften wohl FC-Aufrufe sein, deren RET_VAL Wert damit ausgewertet wird ...

Mfg
Manuel
 
Hallo,

@blockmove, klar du hast vollkommen Recht. Ich wollte mit meinem Kommentar nur andeuten, das hinter einer SCL-Zeile etwas mehr steht. Blöd für mich, das dein Posting schneller war.

Mir ist vollkommen klar, das alles mögliche in den aufgerufenen Funktionen stehen kann. Darauf wollte ich hinweisen. Die Rückgabeparameter der Funktionen sind ja per Posting nicht erkänntlich. Das kann alles mögliche sein. Es wird auf 0 oder 1 verglichen, beim nächsten auf ein und aus. Für mich sieht das als wollte der Ersteller richtig Verwirrung stiften.

Der Themenersteller tut mir Leid aus diesem Zeug etwas machen zu müssen. Ich würde mich nicht wundern wenn die Funktionen in AWL geschrieben sind und der SCL-Schnipsel eine Frustreaktion des Erstellers ist, etwas in SCL programmieren zu müssen. Das bisschen riecht ja nach GOTO-Kram.

Gruß, Voxe
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Themenersteller tut mir Leid aus diesem Zeug etwas machen zu müssen. Ich würde mich nicht wundern wenn die Funktionen in AWL geschrieben sind und der SCL-Schnipsel eine Frustreaktion des Erstellers ist, etwas in SCL zu programmieren. Das bisschen riecht ja nach GOTO-Kram.

Abgesehen von den fehlenden Einrückungen, sieht das unter Umständen vielleicht nicht mal so schlecht aus.
Ich tipp mal auf eine Schrittkette und mit den Goto's geht es weiter zum nächsten Schritt.
Das Sprung-Label ganz am Anfang deutet auch auf sowas hin.

Klar kann man es anders machen, aber so ganz planlos sieht es für mich nicht aus.

Gruß
Dieter
 
Hehe,

denke auch das es eine Schrittkette sein soll.

Aber, wenn ich SCL, sorry nenne es mal Strukturierten Text, bin halt nicht der S7-Kenner, mache. dann nutze ich eine Case-Anweisung.

Ich zweifele auch über die Kommentare an, das da jemand wusste was getan wird. In den Funktionen scheinen nur Vergleiche zu sein. Die kann man in SCL auch in einer Zeile machen.

Gruß
 
Ob SCL jetzt bei dem Codeschnippsel das Mittel der Wahl ist, sei mal dahingestellt ...

Aber das dein Programm lesbarer oder noch wichtiger nachvollziehbarer wird, nur weil du die SCL Konstruckte einzeln und händsich auf FUP übersetzt,
kann ich mir irgendwie nicht vorstellen.
Die Bedingung der 3 Ifs sind ja scheinbar auch noch Bausteinaufrufe, von "sm, aba, abe", düften wohl FC-Aufrufe sein, deren RET_VAL Wert damit ausgewertet wird ...

Mfg
Manuel


das es nicht unbedingt einfacher wird oder übersichtlicher ist durchaus denkbar .Der wichtigste Punkt ist das meine Kollegen es besser verstehen,lesen oder besser gesagt überhaupt lesen können wenn ich es in FUP scchreibe. Darum geht es........
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo @ all

die Vermutungen einer Schrittkette sind korrekt. Wenn pallette vorhanden dann setze Steine drauf, wenn steine druff fahre palette weg...wenn Palette weg und Bahn frei rücke nächste Palette nach usw....
 
das es nicht unbedingt einfacher wird oder übersichtlicher ist durchaus denkbar .Der wichtigste Punkt ist das meine Kollegen es besser verstehen,lesen oder besser gesagt überhaupt lesen können wenn ich es in FUP scchreibe. Darum geht es........

Also wenn schon Schrittkette, dann nimm doch Graph.
Übersichtlicher geht es kaum

Gruß
Dieter
 
Zurück
Oben