[Programmierstil] Was gehört in die Globale Variablenliste

Code:
IF stHmi.Einstellwert > 0 AND stHmi.Einstellwert < 100 THEN
  Sollwert := 12345 / stHmi.Einstellwert;
END_IF;
Sowas kann in Division durch 0 enden...

Richtig, es dauert vielleicht etwas aber die Chancen steigen je öfter man sowas im Projekt hat.
 
Code:
IF stHmi.Einstellwert > 0 AND stHmi.Einstellwert < 100 THEN
  Sollwert := 12345 / stHmi.Einstellwert;
END_IF;
Sowas kann in Division durch 0 enden...


Zu gutem Programmierstil gehört für mich auch, daß man nicht nur an seine eigene vielleicht eingesparte Arbeitsstunde denkt sondern auch an die Nachfolger-Programmierer, die irgendwann mal an dem Programm was ändern sollen oder auf eine andere CPU migrieren oder das HMI ändern oder austauschen ... Dann vereinfachen klare definierte globale Schnittstellen (z.B. Übergabe-DB) die Arbeit ungemein. Dann ist es auch hilfreich, wenn man sicher ist, daß nur auf wenige hundert dokumentierte Variablen überhaupt von außen zugegriffen werden kann und man nicht zigtausend dummerweise freigegebene Variablen im Verdacht der Änderung von außen hat.

Harald

*ACK*

Darum fasse ich die HMI-Kommunikation immer in der Struktur stHmi zusammen und die Konfiguration in stConfig und die Maschineneinstellungen in stMas. Aber ich verlasse nur ungern die Instanz - außer es geht nicht anders, wie z.B. Reatain-Variablen oder Maschineneinstellungen besser in Global-DB bei Siemens. Bei TwinCAT definiere das dafür als persistent und bleibe im FB.

Jetzt musste ich kurz überlegen, wass Du mit Deinem Code zeigen wolltest.
Hier meine Empfehlung:

Code:
nEinstellwert = stMas.Einstellwert;
IF nEinstellwert > 0 AND nEinstellwert < 100 THEN
  Sollwert := 12345 / nEinstellwert;
END_IF;
 
Zuletzt bearbeitet:
*ACK*

Darum fasse ich die HMI-Kommunikation immer in der Struktur stHmi zusammen und die Konfiguration in stConfig und die Maschineneinstellungen in stMas. Aber ich verlasse nur ungern die Instanz - außer es geht nicht anders, wie z.B. Reatain-Variablen oder Maschineneinstellungen besser in Global-DB bei Siemens. Bei TwinCAT definiere das dafür als persistent und bleibe im FB.

Ok, das verstehe ich, aber ich denke Glob-Vars in der Variabentabelle sind schlecht?
stHMI und stConfig und stMas sind doch aber nichts anderes als Glob-Vars, halt in einer Struktur zusammengefaßt. Das sind dann per se Übergabe-DB in einer Siemens SPS, die ja etwas anders tickt.

Ich finde das reingreifen in Instanzen nicht so prickelnd, hab das aber auch schon gemacht, wenns denn mal "quick and dirty" sein mußte oder ich bei einer schnellen Änderung doch zu faul war. Kommt wohl daher dass man bei Siemens (besonders Classic) immer Probleme hat, alle Varialenzugriffe zu finden. HMI sollte man auf jeden Fall kapseln.

Aber ich hatte auch erst vor zwei Wochen den Fall, dass Buttons ab und zu in einer Fehlfarbe aufblitzten, bis ich mitbekam dass ich diese Farben in einer kurzen Sequenz (5 Farben ja nach Zustand von ein paar Bedingungen) zugewiesen habe, direkt auf die HMI-Variable. Das reichte schon aus, da sah man deutlich dass das HMI eben mitten im Zyklus zugreift.
 
stHMI und stConfig und stMas sind doch aber nichts anderes als Glob-Vars, halt in einer Struktur zusammengefaßt. Das sind dann per se Übergabe-DB in einer Siemens SPS, die ja etwas anders tickt.

Nein, so organisiere ich das nicht. Die genannten Strukturen liegen schon in der Implementierung des FB, und damit sind die innerhalb der Instanzen.

Der Vorteil für mich ist, dass ich im HMI (am Usercontrol, Bildbaustein, etc.) nur noch den Instanzpfad angeben muss, und der Rest erledigt sich von alleine.

Querzugriffe zwischen Instanzen halte ich auch innerhalb der SPS oder innerhalb des HMI für unsauberen Programmierstil. Wenn ich aber innerhalb eines FB einen Datenbereich als Schnittstelle (nicht Datentyp Interface) vorsehe, ist das damit auch gewollt, dass man da von außen zugreifen kann und soll. Neben VAR_Input, VAR_Ouput usw. habe ich sozusagen noch ein VAR_HMI, wenn auch virtuell.

Die Idee, die ich umsetze ist folgende: in der SPS hat der FB exakt die gleiche Schnittstelle, wie das HMI im Usercontrol. Und wenn die SPS Zugriffe mitten im Zyklus zulässt, muss man das Programm halt nach den Regeln für Multitasking aufbauen. Bei TwinCAT muss man das nicht tun. Mit dem globalen DB bei Siemens wird das halt elegant umschifft und der Programmierer muss sich nicht mit Multitasking auskennen. Jedoch muss man, wenn man sehr strukturiert, durch alle Ebenen hindurch bis auf die globale Ebene. Und ich strukturiere sehr stark und dadurch spare ich mir eine Menge Arbeit. Und mit Multitasking kenne ich mich auch noch gut aus. In meinen HMI's z.B. laufen etliche Tasks und damit reagieren meine HMI's auf Benutzereingaben sehr flink, obwohl die auch einen enormen Funktionsumfang im Background haben.
 
Visual Studio

Früher mit dem TIA-Portal bin ich eine ähnliche Struktur gefahren - das hat sich auch als sehr vorteilhaft erwiesen. Aber auf Siemens Steuerungen habe ich keine Lust mehr.
 
Zuletzt bearbeitet:
Zurück
Oben