# symbolische Adressierung / Variablenbenennung / Norm



## TenRob (8 März 2022)

Hallo zusammen.

Ich bin Anfänger in der SPS Programmierung und neu in diesem Forum und habe leider in der Suche nicht die passenden Dinge gefunden.

Ich setze gerade ein komplett neues Projekt auf und möchten gerne einmal von euch "erfahrenen Hasen" wissen, wie ihr es mit dem Aufbau des z.B. Variablennamens oder des Funktionsbausteins haltet.
Leider habe ich nur sehr viele Programmierrichtlinien und Hilfen gefunden, die aber alle ihre eigene (teils widersprüchliche) Theorie verfolgen und somit scheint es wohl keinen direkten Erfahrungsschatz zu geben.
Auch ist es mir klar, dass jeder Programmierer seine eigene Philosophie hat, doch habe ich trotz meiner kurzen Zeit schon zu viel "Elend" gesehen.

Wir diskutieren gerade über einige Punkte. Hier ein paar Auszüge:

1) Funktionsbausteinnamen immer mit Großbuchstaben schreiben (z.B. ROBOT_AXIS) und zur Unterscheidung logischer Wortteile mit "_" trennen.

2) Globale Variablen mit Präfix „g_“ vor dem Variablenpräfix versehen. (Bsp.: g_stAxis) / ist dies überhaupt sinnvoll?

3) Logische Bereiche durch Groß-/Klein-Schreibung trennen (Bsp.: fbBreakCtrl)

Mich interessieren eure Erfahrungswerte und Theorien. 

Wie "baut" ihr eure symbolischen Namen zusammen? Wie kürzt ihr alles zusammen oder beschreibt ihr mit dem Variablennamen so ausführlich wie möglich (das eigentlich der Kommentar überflüssig wäre)?

Danke für eure Hilfe


----------



## Larry Laffer (8 März 2022)

Hallo,
bei mir würde es so aussehen :
Bausteinname :  FB_RobotAxis
Variable : b_meineBoolVar, i_meineIntVar usw.
logische Bereiche ??? Was verstehst du darunter ? Ganz generell, falls es so gemeint ist, würde ich hier mit Strukturen arbeiten.
Variablen-Namen so "sprechend" wie möglich - Dank IntelliSense muss man dann ja nicht alles ausschreiben. Im Kommentar ständen dann ggf. noch zusätzliche Informationen ...

Gruß
Larry


----------



## JesperMP (8 März 2022)

TenRob schrieb:


> 1) Funktionsbausteinnamen immer mit Großbuchstaben schreiben (z.B. ROBOT_AXIS) und zur Unterscheidung logischer Wortteile mit "_" trennen.


Ist nicht so wichtig. Kannst du machen. Ich bin gewöhnt dass nur reservierte Namen mit Grossbuchstaben geschrieben werden.
Besonders in SCL finde ich dass es verdeutlicht die Unterschied zwischen Code und Variabeln.



TenRob schrieb:


> 2) Globale Variablen mit Präfix „g_“ vor dem Variablenpräfix versehen. (Bsp.: g_stAxis) / ist dies überhaupt sinnvoll?


Globale Variabeln sind sowiso mit die dazuhörige Global-DB in "" gekennzeichnet. Wie "MyVars".b_MyBool



TenRob schrieb:


> 3) Logische Bereiche durch Groß-/Klein-Schreibung trennen (Bsp.: fbBreakCtrl)


Bereiche kann man in Strukturen organizieren wenn es Sinn macht.
Etwa wie #Break.Control. Das "fb" muss weck.

Wichtig finde ich, bitte keine Leerzeichen innerhalb von ein Variabelname !!


----------



## TenRob (8 März 2022)

Larry Laffer schrieb:


> logische Bereiche ??? Was verstehst du darunter ? Ganz generell, falls es so gemeint ist, würde ich hier mit Strukturen arbeiten.


Erst einmal herzlichen Dank für deine Lösung.

Wie erkläre ich es jetzt am besten:
Als Beispiel, am Roboter ist am TCP eine Ventildüse und die ist boolsch betrachtet ein oder aus. 
Andere Düsen befinden sich an anderen Anlagenteilen. 
Um dieser Düse nun aber nicht nur eine Nummer zu geben, sondern ihren "logischen (oder besser logistischen) Ort" zu beschreiben, könnte ich auch schreiben "RoboterAchse6Düse1". Dies ist mir aber ehrlich gesagt zu lang und zu umständlich.

Genau so ergibt sich die Frage bei Übergabe der Variablen über die Bausteinschnittstelle, also bei einer gewissen Aufruftiefe in den Bausteinebenen. Welche Gedankenstützen oder Strukturen habt ihr euch da in der Variablennamevergabe erschaffen, wenn ihr eigentlich die gleiche Variable über die Schnittstelle, eine Ebene tiefer leitet?


Die beiden folgenden Arten habe ich ganz oft in den "Richtlinien" gelesen:


Larry Laffer schrieb:


> Bausteinname : FB_RobotAxis


In wieweit hilft es dir, in dem Namen des Bausteins auch noch die Bausteinart vorweg zu schreiben? 




Larry Laffer schrieb:


> Variable : b_meineBoolVar, i_meineIntVar usw.


Gleiche Frage hier: Welchen Vorteil hat es den Variablentyp mit in den Namen hineinzunehmen?


----------



## TenRob (8 März 2022)

Auch hier einen herzlichen Dank.



JesperMP schrieb:


> Globale Variabeln sind sowiso mit die dazuhörige Global-DB in "" gekennzeichnet. Wie "MyVars".b_MyBool


So habe ich auch gedacht, nur bin ich sehr oft darüber "gestolpert" dass trotzdem empfohlen wird, das "g_" voranzustellen.



JesperMP schrieb:


> Etwa wie #Break.Control. Das "fb" muss weck.


Da haben wir genau den Punkt den ich hier von euch viel erfahreneren Programmierern lernen will. Einen sachlichen Austausch über eure Erfahrungen und die Gedanken, warum ihr etwas genau so macht. 

@Larry Laffer schreibt "FB_..." und @JesperMP sagt "fb muss weck"

Nach all dem gibt es für mich hier kein falsch und kein richtig, sondern alles ist individuell vom Programmierer abhängig. Da ich nun für mich eine sinnvolle Lösung suche, finde ich den Austausch so wichtig um zu lernen, was ihr euch dabei gedacht habt es genau so zu machen.


----------



## Mrtain (8 März 2022)

TenRob schrieb:


> In wieweit hilft es dir, in dem Namen des Bausteins auch noch die Bausteinart vorweg zu schreiben


 
Zum Beispiel wenn man mit Intellisense arbeitet. Man tippt FB_ und intellisense gibt dir eine Liste von möglichen FBs.


----------



## Mrtain (8 März 2022)

TenRob schrieb:


> Nach all dem gibt es für mich hier kein falsch und kein richtig, sondern alles ist individuell vom Programmierer abhängig. Da ich nun für mich eine sinnvolle Lösung suche, finde ich den Austausch so wichtig um zu lernen, was ihr euch dabei gedacht habt es genau so zu machen.



Richtig. Wichtig ist, das ihr für euch eine Notation findet, die für alle praktikabel ist, aber gleichzeitig auch nicht zu dogmatisch gehandhabt wird.


----------



## JesperMP (8 März 2022)

TenRob schrieb:


> @Larry Laffer schreibt "FB_..." und @JesperMP sagt "fb muss weck"


Meine Begründung ist:
Innerhalb von ein FB, erkennt man die deklarierte Intstanzvariabeln durch "#". Etwa wie #Break.control.
Sind die Daten nicht Teil von die deklarierte Variabeln, sondern sind in ein Global-DB, dann 'gehören' sie nicht zu die FB, das "fb_" ist irreführend.


----------



## Larry Laffer (8 März 2022)

TenRob schrieb:


> So habe ich auch gedacht, nur bin ich sehr oft darüber "gestolpert" dass trotzdem empfohlen wird, das "g_" voranzustellen.


Wie auch Jesper schon geschrieben hat - eine Struktur macht hier "eigentlich" mehr Sinn ...



TenRob schrieb:


> @Larry Laffer schreibt "FB_..." und @JesperMP sagt "fb muss weck"


weil ich hier etwas anderes mit FB_... gemeint habe als du ...
Für mich ist FB nicht wirklich ein Präfix und dient dem Zweck, wie auch schon von MrTain genannt ...



TenRob schrieb:


> Nach all dem gibt es für mich hier kein falsch und kein richtig, sondern alles ist individuell vom Programmierer abhängig. Da ich nun für mich eine sinnvolle Lösung suche, finde ich den Austausch so wichtig um zu lernen, was ihr euch dabei gedacht habt es genau so zu machen.


Genau so ...
Du / ihr müßt hier euren Weg für euch finden - es gibt trotz Allem so eine Art "best Practise" ...


----------



## leo (8 März 2022)

Also ich schreibe mittlerweile alles konsequent klein. Wir arbeiten viel mit WinCC (Scada) und VB Script. Hab mir schon öfter einen Wolf gesucht, z.B. Variable hieß "x_Kg_x" im Script stand "x_kg_x". In VB sind das unterschiedliche Namen.


----------



## JesperMP (8 März 2022)

Mrtain schrieb:


> Zum Beispiel wenn man mit Intellisense arbeitet. Man tippt FB_ und intellisense gibt dir eine Liste von möglichen FBs.


Da ist ein Unterschied zu die Baustein-Namen und die Variabel-Namen.
Wenn man absolut die Instanz-DB eine Name geben der mit die FB verknüpft ist dann mache es etwas in diesen Stil:
"FB_motor_starter" : Standard FB für ein Motorstarter.
"IDB_motor_starter_A3" : Der Instanz A3 abgeleitet von die "FB_motor_starter".

edit: Für ein Global-DB verwende ich nie "DB_..". Wenn man ein Variabel in "" sieht, dann erkennt man implicit das es ein Global-DB ist.
Und wenn man in sein Code Global-DBs adressiert, dann wird man schnell müde von lange Namen, wie "DB_Global_schmiermerker" o.Ä


----------



## C_wie_Cäsar (8 März 2022)

Die Bezeichnung der Variablen und Bausteine muss meiner Meinung nach mit dem Stromlaufplan bzw. dem Kennzeichnungssystem der Anlage zusammenpassen bzw. angelehnt sein. Zudem muss ein Rückschluss auf die jeweilige Funktion möglich sein. Wir haben in der Firma zusätzlich eine festgelegte Ordnerstruktur in der wir im TIA Projekt die Bereiche strukturieren (z.B. Fördertechnik 0m, 4m, 8m, …).

Nehmen wir als Beispiel eine Fördertechnik Anlage (FA) die mehrere Längsförderer (LF) und Hubstationen (HS) mit integrierten Längsförderern hat. Es gibt eine UDT für die Längsförderer und für die Hubstationen. Somit wäre die Positionssensoren (PS) der auf einem Längsförderer auf einer Hubstation (im Beispiel HS1) sitzt bezeichnet als: "HS1.LF.PS1". HS1 ist der Funktionsbaustein, LF die Funktion und PS1 der Bauteilname. Gibt es nun einen Zwischenmerker für die Fahrweise würde dieser bspw. HS1.LF.ZM heißen. HS ist wieder der Funktionsbaustein, LF die Funktion und ZM der Zwischenmerker.


----------

