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

Page 1 of 4 123 ... LastLast
Results 1 to 10 of 35

Thread: V15: In SCL GOTO-Befehl verwenden?

  1. #1
    Join Date
    11.09.2014
    Posts
    115
    Danke
    17
    Erhielt 2 Danke für 2 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen

    Ein Teamkollege von mir verwendete GOTO-Befehle in SCL in einer CASE-"Zustandsmaschine" um gewisse Befehle/Abläufe "Zeitkürzer" im OB1 (Zyklischer OB) abzuwickeln. Auch desshalb weil in den einzelnen CASE-Schritten Sub-CASE-Zustände programmiert wurden. Und da für jeden CASE-Zustandswechsel ein Zyklus benötigt wird, verwendete er GOTO's.

    Als Beispiel: Wenn der OB1 Zykluszeit 15ms betrug, wurde je nachdem ein Befehl erst nach Bsp.weise 6x15ms=90ms Abgearbeitet.
    Und mit Verwendung von der GOTO's in 15ms (+ etwas mehr durch die GOTO-Sprünge).


    Mir wurde immer gesagt von den Sprungfunktionen sollte man immer die Finger lassen... auch Wikipedia ist der Meinung:

    Zitat Wikipedia zum Thema Strukturierte Programmierung:
    Die bekannteste Konsequenz dieses Prinzips ist die Vermeidung oder – abhängig von der Programmiersprache – der eingeschränkte und standardisierte Einsatz der Sprunganweisung, des GOTO. Das Ergebnis der häufigen Verwendung dieser Anweisungen wird häufig abfällig als Spaghetticode bezeichnet.

    Kann mir einer von euch sagen wieso man auch hier die GOTO's Meiden sollte? Gibt es hier nachteile beim Software-Warten oder Debuggen? (Debuggin in V15 möglich).

    Danke im Vorraus!

    Gruss
    Du hast schlecht angefangen doch gegen Ende stark nachgelassen,
    aber auch ein blindes Huhn kann die Zeit nicht zurück drehen,
    denn Schweizerische Wissenschaftler haben herausgefunden
    nachdem man ihnen den Ausgang zeigte.
    Reply With Quote Reply With Quote V15: In SCL GOTO-Befehl verwenden?  

  2. #2
    Join Date
    08.04.2016
    Location
    4040 Linz, Österreich
    Posts
    418
    Danke
    36
    Erhielt 141 Danke für 112 Beiträge

    Default

    Quote Originally Posted by Automatinator View Post
    Hallo zusammen

    Ein Teamkollege von mir verwendete GOTO-Befehle in SCL in einer CASE-"Zustandsmaschine" um gewisse Befehle/Abläufe "Zeitkürzer" im OB1 (Zyklischer OB) abzuwickeln. Auch desshalb weil in den einzelnen CASE-Schritten Sub-CASE-Zustände programmiert wurden. Und da für jeden CASE-Zustandswechsel ein Zyklus benötigt wird, verwendete er GOTO's.

    Als Beispiel: Wenn der OB1 Zykluszeit 15ms betrug, wurde je nachdem ein Befehl erst nach Bsp.weise 6x15ms=90ms Abgearbeitet.
    Und mit Verwendung von der GOTO's in 15ms (+ etwas mehr durch die GOTO-Sprünge).


    Mir wurde immer gesagt von den Sprungfunktionen sollte man immer die Finger lassen... auch Wikipedia ist der Meinung:

    Zitat Wikipedia zum Thema Strukturierte Programmierung:



    Kann mir einer von euch sagen wieso man auch hier die GOTO's Meiden sollte? Gibt es hier nachteile beim Software-Warten oder Debuggen? (Debuggin in V15 möglich).

    Danke im Vorraus!

    Gruss
    Egal, wo man programmieren lernt:
    Eines der ersten Dinge die man lernt lautet
    Hände weg vom GOTO
    und wenn es keine Möglichkeit gibt, das ähnlich elegant zu lösen, dann gilt die Regel:
    Hände weg vom GOTO

    Wenn sich die Laufzeitoptimierung beim CASE nur durch GOTO-Befehle erkaufen lässt, sollte man sich die Frage stellen, ob CASE die geeignete Lösung für die Zustandsmaschine ist, oder ob nicht die Verwendung einer einfachen IF-Liste die bessere Lösung ist.

    lg

  3. #3
    Join Date
    19.08.2010
    Posts
    370
    Danke
    12
    Erhielt 77 Danke für 72 Beiträge

    Default

    Einfach weil es von der Lesbarkeit/Wartbarkeit nicht schön ist die Funktion kann durch GOTO natürlich durchaus evektiver werden. Z.B. eine Case-Anweisung braucht für jeden Case einen Zyklus mit GOTO könnte man mehrere Cases in einem Zyklus machen aber ist das Notwendig?

    Sonnst das was Max sagt.
    Last edited by blackpeat; 09.01.2018 at 17:40.
    Gruß

    blackpeat

  4. #4
    Join Date
    08.04.2016
    Location
    4040 Linz, Österreich
    Posts
    418
    Danke
    36
    Erhielt 141 Danke für 112 Beiträge

    Default

    Quote Originally Posted by blackpeat View Post
    Einfach weil es von der Lesbarkeit/Wartbarkeit nicht schön ist die Funktion kann durch GOTO natürlich durchaus evektiver werden. Z.B. eine Case-Anweisung braucht für jeden Case einen Zyklus mit GOTO könnte man mehrere Cases in einem Zyklus machen aber ist das Notwendig?
    Deine Antwort stand eigentlich schon in der Fragestellung drinnen......

  5. #5
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    2,525
    Danke
    262
    Erhielt 477 Danke für 392 Beiträge

    Default

    Quote Originally Posted by Automatinator View Post
    Kann mir einer von euch sagen wieso man auch hier die GOTO's meiden sollte?
    Weil die "HochsprachenProgrammierer" damit nicht klar kommen. Andererseits, ich glaube mich richtig zu erinnern, in Fortran IV waren doch bei jeder If-Abfrage 3 Sprungziele anzugeben - eins für kleiner, eins für gleich und eins für grösser. Und da gab es sogar einen Befehl namens "Continue", mit dem man dem Compiler helfen musste, den "roten Faden" wieder zu finden.
    In jeder ProgrammierSprache kann man unübersichtlichen Code produzieren. Das gilt für Sprachen, die zur Bildung von Selektionen und Iterationen nichts anderes zu bieten haben, als "Goto" bzw. "Then", direkt gefolgt von der SprungZielAngabe. Das gilt genauso für Sprachen, die absolut kein "Goto" kennen - damit hatte ich mal in einer Cobol-Version zu kämpfen, in der nur knappe 48KB für's Programm zur Verfügung standen - wie sehr habe ich mich damals nach einer Möglichkeit gesehnt, SpaghettiCode produzieren zu können.
    Fazit: man kann Goto nicht grundsätzlich verdammen, aber es ermöglicht bzw. verleitet dazu, SpaghettiCode zu produzieren.
    Den von Dir aufgezeigten Zusammenhang zwischen Case und Zyklus kann ich nicht wirklich nachvollziehen. Wenn es tatsächlich so sein sollte, dann könnte man evtl. ein Case-Konglomerat in mehrere aufteilen, um "FortSchritte" etwas zügiger zu erreichen? Aber wahrscheinlich geht es um SchrittKetten, von denen man gar nicht will, dass sie schneller "durchrauschen", als man gucken kann?
    Ich würde versuchen, das Problem mit Case (ohne Goto) zu lösen, aber vorher zu klären, was denn wirklich zum DurchNudeln der EhrenZyklen führt. Ich werde das Gefühl nicht los, dass das bisherige Konzept irgendwie nicht zu den Anforderungen passt.
    Gruss, Heinileini
    PS: Case kann man doch auch durch if gefolgt von (vielen) ElseIf ersetzen ... aber der eigentliche Haken dürfte ohnehin woanders zu suchen sein.
    <-- <=2m --> . . . . . . . . vs . . . . . . . . <---------------- >2m ---------------->

  6. #6
    Join Date
    17.07.2009
    Location
    Am Rande der Ostalb
    Posts
    7,231
    Danke
    1,440
    Erhielt 1,710 Danke für 1,315 Beiträge

    Default

    Die selbe Diskussion gab es vor einigen Jahren beim Linux-Kernel.
    http://koblents.com/Ches/Links/Month...x-Kernel-Code/

    Persönlich sehe ich es auch wie Linus Torvalds. In manchen Fällen kann ein Goto den Code übersichtlicher machen als zigfach verschachtelte IF-THEN-ELSIF-ELSE-ENDIF Orgien.

    Gruß
    Blockmove

  7. #7
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    15,182
    Danke
    1,243
    Erhielt 4,469 Danke für 3,603 Beiträge

    Default

    Wenn es nur um die sofortige Schrittweiterschaltung geht - das läßt sich prima übersichtlich ohne GOTO programmieren:
    Code:
    REPEAT //eine Schleife für den Rückwärtssprung zur sofortigen Schrittweiterschaltung
    
      CASE Schrittnummer OF
        1: TuWas1();
           Schrittnummer := 2; //mit Schrittnummer 2 im nächsten Zyklus fortsetzen
                               //springe hinter END_CASE und finde da das EXIT aus der REPEAT-Schleife
    
        2: TuWas2();
           Schrittnummer := 3; //mit Schrittnummer 3 fortsetzen sofort
           CONTINUE;           //springe zu UNTIL und wiederhole ab REPEAT (weil 0=1 niemals erfüllt)
    
        3: ...
    
      END_CASE;
    
      EXIT; //CASEs ohne das CONTINUE verlassen die REPEAT-Schleife (Sprung zu "//weiter" hinter UNTIL)
    
    UNTIL 0=1 END_REPEAT;      //Rückwärtssprung (zurück zu REPEAT) weil 0=1 niemals erfüllt
    
    //weiter...
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Reply With Quote Reply With Quote sofortige Schrittweiterschaltung ohne GOTO  

  8. Folgende 5 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    Heinileini (09.01.2018),Howard (10.01.2018),maxder2te (09.01.2018),puehri (24.10.2018),vollmi (10.01.2018)

  9. #8
    Join Date
    03.04.2008
    Posts
    6,464
    Danke
    238
    Erhielt 825 Danke für 698 Beiträge

    Default

    Ich sehe nichts schlechtes, wenn bei einer Sprungleiste zu verschiedenen Marken / Programmteilen gesprungen wird. Deshalb wurde ja SCL erfunden
    Wo ist das Problem?
    Wenn die Abarbeitung des OB1 verzögert wird, na und? Der macht doch alles zyklisch bzw richtig, wenn er richtig programmiert wurde.
    Wenn es zeitkritisch ist ein festes Zeitraster gebraucht wird, dann eben in die entsprechenden AlarmOBs damit.

    bike
    "Any fool can write code that a computer can understand.
    Good programmers write code that humans can understand."
    --Martin Fowler

  10. #9
    Join Date
    06.10.2003
    Posts
    4,381
    Danke
    605
    Erhielt 750 Danke für 589 Beiträge

    Default

    Quote Originally Posted by PN/DP View Post
    Wenn es nur um die sofortige Schrittweiterschaltung geht - das läßt sich prima übersichtlich ohne GOTO programmieren..
    Harald, das ist kein Spagetticode, das ist eingedickte Buchstabensuppe.
    Nieder mit GOTO, hoch lebe CONTINUE und EXIT !
    Last edited by Onkel Dagobert; 09.01.2018 at 21:41. Reason: Zitat reduziert
    Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
    John Ruskin

  11. #10
    Join Date
    29.03.2004
    Posts
    7,077
    Danke
    164
    Erhielt 2,136 Danke für 1,524 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    In dem Beispiel vom PN/DP wäre meiner Meinung nach sogar ein GOTO-Sprung vor das CASE der gezeigten Konstruktion vorzuziehen.
    Ein Sprunglabel und ein GOTO was sehr übersichtlich ist, vs. unnützes REPEAT + CONTINUE + EXIT.

  12. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Blockmove (10.01.2018),Captain Future (13.04.2018)

Similar Threads

  1. TIA SCL Fill Befehl
    By s7Opa in forum Simatic
    Replies: 3
    Last Post: 12.05.2017, 13:46
  2. goto SCL
    By Amzaun in forum Programmierstrategien
    Replies: 36
    Last Post: 15.02.2013, 09:43
  3. Move Befehl in SCL
    By Felse in forum Simatic
    Replies: 11
    Last Post: 03.03.2009, 09:19
  4. PCS7 SCL Befehl
    By Praktikant08 in forum Programmierstrategien
    Replies: 3
    Last Post: 31.10.2008, 15:18
  5. Befehl SAVE für ENO unter SCL
    By Kniffo in forum Programmierstrategien
    Replies: 2
    Last Post: 11.09.2007, 15:44

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •