# NOP 0 im strukturierten Text



## Fork1910 (8 August 2011)

Hallo liebe Freunde der SPS,

kann mir einer weiter helfen, ich habe in SCL einen Sprung zum Bausteinende prorammiert, nach dem allerdings nicht mehr folgen sollte. 
Sprungmarke ohne nachfolgenden Befehl geht nicht!
Gibt es einen "NOP 0"-befehl auch für SCL?
(habe bis jetzt dort stehehn: "A:=A;" , nur damit er nicht rummeckert...sieht aber nicht sehr professionell aus..)


----------



## Paule (8 August 2011)

Fork1910 schrieb:


> Hallo liebe Freunde der SPS,
> 
> kann mir einer weiter helfen, ich habe in SCL einen Sprung zum Bausteinende prorammiert, nach dem allerdings nicht mehr folgen sollte.
> Sprungmarke ohne nachfolgenden Befehl geht nicht!
> ...


Also Sprungbefehle in SCL sind nicht so der Hit und sollten deshalb lieber vermieden werden.


----------



## Larry Laffer (8 August 2011)

... bei SCL würde es reichen, wenn du hinter dem Label einfach ein Semikolon setzt ...

Gruß
Larry


----------



## MrLeeh (8 August 2011)

Paule schrieb:


> Also Sprungbefehle in SCL sind nicht so der Hit und sollten deshalb lieber vermieden werden.



Da kann ich nur zustimmen. Sprungbefehle gehen in höheren Programmiersprachen gar nicht. Hauptsächlich, weil dadurch ein nachvollziehbarer strukturierter Programmablauf nicht mehr gegeben ist.

Aber es gibt eine ganz einfache Lösung für dein Problem: Schau dir mal "If Then" an.

mfg
MrLeeh


----------



## vierlagig (8 August 2011)

MrLeeh schrieb:


> Da kann ich nur zustimmen. Sprungbefehle gehen in höheren Programmiersprachen gar nicht. Hauptsächlich, weil dadurch ein nachvollziehbarer strukturierter Programmablauf nicht mehr gegeben ist.
> 
> Aber es gibt eine ganz einfache Lösung für dein Problem: Schau dir mal "If Then" an.
> 
> ...



und ich zitiere immer wieder gern aus wikipedia, weil da die quellen auch gleich genannt werden:



> In der Praxis hat sich jedoch gezeigt, dass der Verzicht auf GOTO zwar möglich ist, jedoch in einigen Fällen zu sehr aufwändigen Konstrukten führt.[3] Besonders in zeitkritischen Programmteilen ist ein goto deutlich effizienter als am Ende von mehreren geschachtelten Schleifen jeweils eine Abbruchprüfung durchzuführen.
> Von einigen Entwicklern wurde auf der Linux-Kernel-Mailing-Liste die häufige Verwendung von GOTO im Quellcode von Linux diskutiert. Linus Torvalds sagte dabei, dass die Verwendung von GOTO die Lesbarkeit des Quellcodes in vielen Fällen sogar deutlich erhöhen könne.[4]



aus: http://de.wikipedia.org/wiki/Sprunganweisung


----------



## MrLeeh (8 August 2011)

vierlagig schrieb:


> "jedoch in einigen Fällen zu sehr aufwändigen Konstrukten führt."



Ja, "in einigen Fällen" stimmt das vielleicht. Aber du hast sicher auch den folgenden Satz aus dem gleichen Artikel gelesen:



			
				Wikipedia schrieb:
			
		

> In frühen Varianten älterer Programmiersprachen wie Fortran oder BASIC  stellten GOTO-Befehle noch die wichtigste, wenn nicht die einzige  Möglichkeit zur Programmierung von Verzweigungen dar; diese wurden  deshalb auch zur Realisierung von Schleifen und Wenn-Dann-Bedingungen  verwendet. Dies führte zu unübersichtlichem „Spaghetticode“.



mfg
MrLeeh


----------



## vierlagig (8 August 2011)

MrLeeh schrieb:


> Ja, "in einigen Fällen" stimmt das vielleicht. Aber du hast sicher auch den folgenden Satz aus dem gleichen Artikel gelesen:
> 
> 
> 
> ...



natürlich habe ich das gelesen und mich an meine basic zeiten erinnert


----------



## Paule (8 August 2011)

vierlagig schrieb:


> und ich zitiere immer wieder gern aus wikipedia, weil da die quellen auch gleich genannt werden:


Dann zitiere ich mal was Siemens zu der GOTO-Anweisung schreibt:
Quelle: Private Unterlagen


> GOTO-Anweisungen sollten nur in Sonderfällen, z.B. bei einer
> Fehlerbearbeitung eingesetzt werden.
> *Nach den Regeln der strukturierten Programmierung sollte die*
> *GOTO-Anweisung nicht verwendet werden.*


----------



## vierlagig (8 August 2011)

Paule schrieb:


> Dann zitiere ich mal was Siemens zu der GOTO-Anweisung schreibt:
> Quelle: Private Unterlagen



was interessieren mich deine privaten unterlagen, GOTO hat berechtigung PUNKT und das bleibt auch so! ein ; reicht, wenn larry einmal mehr recht hat.

natürlich benutzt der erfahrene programmierer nicht GOTO um aus allem und jedem entfliehen zu können, aber gerade wenn er in der zwölften if hängt wird er sich nach einem GOTO sehnen und genau das ist das ding und genau das ist das, was ich zitiert habe.

ich selber habe damals, 7 jährig, auf einem XE130 von atari das laufen gelernt und da war GOTO noch standard. das ich dies nicht merh als standard sehe ist kein werk dieses forums sondern dessen, was man sich selber aneignet und diesem grat der entscheidung zu gehen soll bitte schön jedem selbst überlassen sein!


----------



## Paule (8 August 2011)

vierlagig schrieb:


> ich selber habe damals, 7 jährig, auf einem XE130 von atari das laufen gelernt


Wow, ein Naturtalent. *ROFL*
Kommen da jetzt noch mehr Kindergeschichten? Gähn!

Also das interessiert mich jetzt auch kein bisschen.


----------



## Nadia (8 August 2011)

*Beitrag*

Hi alle,
ich wollte frage ob es normal dass ich beiträge nicht schreiben kann , ich habe mich vor 20 minuten registriert..
danke


----------



## 190B (8 August 2011)

Hallo Nadia,

Du hast doch einen Beitrag geschrieben.

Oder meinst Du ein neues Thema eröffnen?


----------



## Nadia (9 August 2011)

Hallo 190B,

ich wollte neu Thema erstellen, kannst du mir bitte helfen wie mache ich das?

danke


----------



## 190B (9 August 2011)

Hallo Nadia,

Du gehst in eines der Foren, z.B.

SPS-Forum > Automatisierung > Programmierstrategien

und klickst dort auf den Button "Neues Thema".


----------



## Nadia (9 August 2011)

*neues thema*

danke nett von dir ..
N


----------



## bike (9 August 2011)

Zurück zu den Sprüngen:

Es geht ohne GOTO; aber macht es Sinn so lange drumrum zu schreiben bis es ohne GOTO programmiert ist?

Der Kernel von Linux ist in C programmiert und ist gut und funktioniert nahezu fehlerfrei.
In diesem Code war, bei der Kernel Version 2.4, mehr als 16000 Goto und oder andere Sprünge.

Es ist doch Blödsinn zu schreiben ein sinnvolles und gutes Programm kommt ohne Sprünge aus.

Nix für ungut


bike


----------



## Boxy (9 August 2011)

bike schrieb:


> Es ist doch Blödsinn zu schreiben ein sinnvolles und gutes Programm kommt ohne Sprünge aus.
> 
> Nix für ungut
> 
> ...



Na ja sagen wir es so, ein guter Programmierer versucht ohne auszukommen  ...
Gerade wenn man diese als Not-Sprünge aus Schleifen programmiert *ROFL*


----------



## Paule (10 August 2011)

bike schrieb:


> Es geht ohne GOTO; aber macht es Sinn so lange drumrum zu schreiben bis es ohne GOTO programmiert ist?


Ja, es macht immer Sinn ein Programm so zu optimieren bis es leserlich ist.


bike schrieb:


> Der Kernel von Linux ist in C programmiert und ist gut und funktioniert nahezu fehlerfrei.
> In diesem Code war, bei der Kernel Version 2.4, mehr als 16000 Goto und oder andere Sprünge.


Jo, das habe ich auch schon gelesen und ich behaupte jetzt mal dass du noch keine einzige Zeile von dem Code gesehen hast. 
Und hättest du den Code vor dir würdest du ihn nicht lesen können, da er total unleserlich wäre, bei 16000 Sprüngen. 

Und wie schon öfters, geht es hier wiedermal um eine Grundsatz-Philosophiefrage.


----------



## bike (10 August 2011)

Paule schrieb:


> Ja, es macht immer Sinn ein Programm so zu optimieren bis es leserlich ist.



Und ohne GOTO ist ein Programm besser zulesen als mit? 



Paule schrieb:


> Jo, das habe ich auch schon gelesen und ich behaupte jetzt mal dass du noch keine einzige Zeile von dem Code gesehen hast.
> Und hättest du den Code vor dir würdest du ihn nicht lesen können, da er total unleserlich wäre, bei 16000 Sprüngen.



Verloren, ich habe einen Teil des Codes gelesen und ob du glaubst oder nicht,  ich habe schon Module dafür geschrieben.
Den Ehrgeiz alles zu verstehen was geschrieben ist habe ich nicht, doch auch bei GOTO findet man den Zielpunkt und versteht das Programm.


bike


----------



## StructuredTrash (10 August 2011)

Ich denke, man muss da schon ein wenig differenzieren. Mit GOTO hinter das Ende einer Schleife zu springen, um sie einfach und elegant zu verlassen, ist sicher keine Sünde. Wenn das Ganze dagegen in wildes Herumgehopse ausartet, sieht das schon anders aus.


----------



## Windoze (11 August 2011)

Was der Threadersteller möchte lässt sich, meiner Meinung nach, in SCL am einfachsten mit "RETURN" erreichen. Der Baustein wird direkt beendet (wie "BEA" in AWL), und man benötigt keinen Sprung.

Grüße
Dominik


----------



## Boxy (11 August 2011)

StructuredTrash schrieb:


> Mit GOTO hinter das Ende einer Schleife zu springen, um sie einfach und elegant zu verlassen, ist sicher keine Sünde.



Doch da es schon einmal aussagt, das man sich über den Abbruch und deren Kriterien keine Gedanken gemacht hat. 
Eine Schleif über GOTO (in C, Pascal usw.) zu verlassen stellt ein Sünde dar  (schreibt glaube ich Petzold in all seinen Büchern *ROFL*)

Alleine die Bedingung um das GOTO auszuführen oder dort hin zu kommen, ist schon mal ein Kritterium was man für den Schleifen Abbruch ansetzen kann!

Somit macht es das ganze leserlicher


----------



## Dummy (12 August 2011)

Boxy schrieb:


> Doch da es schon einmal aussagt, das man sich über den Abbruch und deren Kriterien keine Gedanken gemacht hat.
> Eine Schleif über GOTO (in C, Pascal usw.) zu verlassen stellt ein Sünde dar  (schreibt glaube ich Petzold in all seinen Büchern *ROFL*)
> 
> Alleine die Bedingung um das GOTO auszuführen oder dort hin zu kommen, ist schon mal ein Kritterium was man für den Schleifen Abbruch ansetzen kann!
> ...


 
Sicherlich sollte man auf Sprünge innerhalb einer Schleife möglichst verzichten. Aber die Leserlichkeit des Codes ist ja nicht immer das einzige Kriterium für eine Anwendung. Manchmal kommt es auch auf die Performance an und dann kann es durchaus sinnvoll sein aus einer Schleife zuspringen.

Ein generellen Verzicht halte ich für schwachsinn.


----------



## StructuredTrash (12 August 2011)

Boxy schrieb:


> Doch da es schon einmal aussagt, das man sich über den Abbruch und deren Kriterien keine Gedanken gemacht hat.


Ich mache mir schon Gedanken, bevor ich springe, denn ich versuche, das möglichst zu vermeiden.



Boxy schrieb:


> Eine Schleif über GOTO (in C, Pascal usw.) zu verlassen stellt ein Sünde dar  (schreibt glaube ich Petzold in all seinen Büchern *ROFL*)


Wer ist Petzold? Ein religiöser Fanatiker?



Boxy schrieb:


> Alleine die Bedingung um das GOTO auszuführen oder dort hin zu kommen, ist schon mal ein Kritterium was man für den Schleifen Abbruch ansetzen kann!


Es geht ja nicht darum, einen Schleifenabbruch vorwegzunehmen, der genausogut bei der normalen Überprüfung der Schleifenbedingung am Anfang bzw. Ende der Schleife stattfinden kann. Sondern darum, dass eine Abbruchbedingung wahr wird und gleichzeitig die weitere Bearbeitung des Schleifencodes verbietet. Da kann man sich, je nachdem wie komplex der Schleifencode ohnehin schon ist, überlegen, ob man ein weiteres IF THEN einfügt oder lieber springt.


----------



## bike (12 August 2011)

Wir sind doch alle kleine Sünderlein, war immer so, war immer so... 

Wenn jemand schreibt es geht ohne Sprung beim Programmieren, dann hat er vermutlich noch nicht echt programmiert.
Viel schlimmer und oft tödlicher für die Lesbarkeit und Funktion des Programmes sind in meinen Augen sogenannte "Sprungleisten".
Aber das ist ein anderes Thema, denke ich 


bike


----------



## RobiHerb (12 August 2011)

*Maschinencode*



Dummy schrieb:


> Aber die Leserlichkeit des Codes ist ja nicht immer das einzige Kriterium für eine Anwendung. Manchmal kommt es auch auf die Performance an und dann kann es durchaus sinnvoll sein aus einer Schleife zuspringen.
> 
> Ein generellen Verzicht halte ich für schwachsinn.



Was die Performance betrifft, da irrt der Schreiber. Wenn ich in ST "well bahaved" programmiere, wird es nicht schlechter von der Performance!

Aus dem gut strukturierten Programm macht der Compiler optimierten Maschinen Code und der ist in der Regel ausgefuchster als alles, was der Anwendungs Programmierer so zuwege bringt.


----------



## bike (12 August 2011)

RobiHerb schrieb:


> Aus dem gut strukturierten Programm macht der Compiler optimierten Maschinen Code und der ist in der Regel ausgefuchster als alles, was der Anwendungs Programmierer so zuwege bringt.



Was zu beweisen wäre.
Solch einen hyperintelligenten Compiler gibt es nicht.

Noch ist der Programmierer für das Programm und der Performance verantwortlich.


bike


----------



## Cassandra (12 August 2011)

bike schrieb:


> ... Wenn jemand schreibt es geht ohne Sprung beim Programmieren, dann hat er vermutlich noch nicht echt programmiert.
> Viel schlimmer und oft tödlicher für die Lesbarkeit und Funktion des Programmes sind in meinen Augen sogenannte "Sprungleisten".
> Aber das ist ein anderes Thema, denke ich
> bike



[FONT=Arial, sans-serif]Hallo Bike,[/FONT]

 [FONT=Arial, sans-serif]Die „sogenannte Sprungleiste“ ist eine Möglichkeit in AWL etwas ähnliches wie eine CASE- Anweisung umzusetzen. Ich bin auch immer verunsichert, wenn mir ein Befehl unbekannt ist...[/FONT] 


bike schrieb:


> Noch ist der Programmierer für das Programm und der Performance verantwortlich.


[FONT=Arial, sans-serif]Für das Programm ja, aber welchen Einfluss hast du auf die Performance?[/FONT]
 [FONT=Arial, sans-serif]Mit einer Gurken-CPU bist du gearscht, auch wenn du noch ein paar ms rausleiern kannst. [/FONT] 
 [FONT=Arial, sans-serif]Wenn du ein vernünftiges Gerät zur Verfügung hast, kommt es auf etwas umständlichen oder nicht optimalen Code nicht an. Wichtiger fände ich, dass das Programm übersichtlich und gut zu warten ist.[/FONT]
 [FONT=Arial, sans-serif]Na ja, zum Glück gibt es auch noch hyperintelligente Programmierer. Dann kann nichts mehr schiefgehen...[/FONT] 

 [FONT=Arial, sans-serif]LG Cassandra[/FONT]


----------



## bike (14 August 2011)

Cassandra schrieb:


> [FONT=Arial, sans-serif]Die „sogenannte Sprungleiste“ ist eine Möglichkeit in AWL etwas ähnliches wie eine CASE- Anweisung umzusetzen. Ich bin auch immer verunsichert, wenn mir ein Befehl unbekannt ist...[/FONT]



Bin ich verunsichert?
Nicht wirklich, denn ich weiß was eine Sprungleiste  auch was Case ist und nutze es wenn es sinnvoll ist.
Aber wenn um einen Motor von rechts nach links  mit verschieden Geschwindigkeiten zu fahren zwei verschachtelte Sprungleisten programmiert werden ich krieg ich das kotzen.  



Cassandra schrieb:


> [FONT=Arial, sans-serif]Für das Programm ja, aber welchen Einfluss hast du auf die Performance?[/FONT]
> [FONT=Arial, sans-serif]Mit einer Gurken-CPU bist du gearscht, auch wenn du noch ein paar ms rausleiern kannst. [/FONT]
> [FONT=Arial, sans-serif]Wenn du ein vernünftiges Gerät zur Verfügung hast, kommt es auf etwas umständlichen oder nicht optimalen Code nicht an. Wichtiger fände ich, dass das Programm übersichtlich und gut zu warten ist.[/FONT]



Durch den Programmcode kann man die ms finden, die oftmals den Unterschied in der Perfomance zum Mitbewerber ausmachen.
Was hilft mir ein sauber strukturiertes, gut wartbares Programm, wenn mein Werkzeugwechsler auf einmal 500ms langsamer ist?
Das bringt mir nur Probleme, daher muss ab und an auch die Lesebarkeit hinten anstehen.


bike


----------



## Larry Laffer (14 August 2011)

Hallo,
ich glaube nicht, dass das Herauskitzeln von Mikrosekunden heute noch wirklich etwas bringt. Ich würde da ganz grundsätzlich den lesbararen Code immer über 2 oder 3 Anweisungen weniger stellen.

Und was den Compiler angeht:
Da habe ich schon solche und solche Überraschungen erlebt - hier speziell bei SCL. Der Compiler abeitet aber in jedem Fall nach den Vorgaben dessen, der ihn programmiert hat - er hat keine eigene Intelligenz und auch nicht wirklich die Fähigkeit der Code-Optimierung.

Gruß
Larry


----------



## bike (14 August 2011)

Larry Laffer schrieb:


> Hallo,
> ich glaube nicht, dass das Herauskitzeln von Mikrosekunden heute noch wirklich etwas bringt. Ich würde da ganz grundsätzlich den lesbararen Code immer über 2 oder 3 Anweisungen weniger stellen.



Du hast Recht, wenn es nicht um zeitkritische Anwendungen geht und man nicht die Möglichkeit hat einfach die CPU zu tauschen.

Es ist wie schon geschrieben habe abhängig von der Aufgabe des Programms.


bike


----------

