würdet ist das auch so machen? ist das so üblich

Grimsey

Level-2
Beiträge
560
Reaktionspunkte
33
Hallo zusammen,

ich habe in einem Programm von einem unserer Lieferanten folgende Passage gefunden:
Code:
    "gb".cmd_ack                :=
    "gb".FU_FaAntr.ctrl.b.rst   :=        
    "gb".FU_LW.ctrl.b.rst       :=  
    "gb".FU_QS_Mat.ctrl.b.rst   :=  
    "gb".FU_LS.ctrl.b.rst       :=  
    "gb".FU_RSW_1.ctrl.b.rst    := 
    "gb".FU_RSW_2.ctrl.b.rst    := 
    "gb".FU_RSW_3.ctrl.b.rst    := 
            #HtP_cmd_ack_TP.Q
        OR  #Quitt_TP.Q
        OR  #rst_Not_Aus_TP.Q
        OR  #Ini_I_on_RT.Q
        OR  #RM_HS_RT.Q;

Um ehrlich zu sein musste ich mir das gerade in einem Testprojekt mal nachbauen um zu prüfen was genau da passiert.
Soweit habe ich das verstanden aber ich finde es recht unübersichtlich.

Ich hätte mir eher ein Signal aus der ODER-Verknüpfung gebaut und dieses dann den einzelnen Signalen zugewiesen.
Fände ich deutlich besser lesbar.

Da mir diese Schreibweise ehrlich gesagt neu war, wollte ich mal fragen ob das eine verbreitet Schreibweise ist und Ihr das eventuell auch so macht.
Reines Interesse.
 
Nein ... das würde ich auch so nicht machen und ... das habe ich auch noch nicht gesehen ... 8)
Ich würde hier auch die Verknüpfung in einer Variablen bilden und diese dann den anderen Variablen, die den gleichen Inhalt haben sollen, zuweisen.

Wenn man das weiterspinnt dann lassen sich wahrscheinlich noch ganz andere Konstrukte erschaffen, durch die man dann wirklich nicht mehr auf Anhieb durchblickt - also währet den Anfängen ...

Gruß
Larry
 
"A := B := C := ausdruck;" würde ich allerhöchstens in einem Anlaufbaustein zur Initialisierung von gleichen Anfangswerten machen oder tolerieren.

Das werden vermutlich nicht die einzigen Wertzuweisungen an A, B und C sein, und dieser Programmierstil führt oft zu höchst schwer verfolgbaren mehrfachen bedingten Zuweisungen an die selbe Variable verstreut in mehreren Programmbausteinen (und zu sogenannten Angst-Reset-Orgien an vielen Stellen), anstatt übersichtlich in nur einem Netzwerk oder einer Bildschirmseite die Wertzuweisung(en) komplett abzuhandeln.

Bei mehreren Kunden (auch bei uns) sind solche verstreuten mehrfachen Zuweisungen für Zuliefer-Programme nicht erlaubt.

Harald
 
Haben die Variablen denn in einem Zyklus überhaupt den gleichen Wert? Oder brauch der da 8 Zyklen?

Ich wusste nichtmal das man es in SCL so schreiben kann.
 
"A := B := C := ausdruck;" würde ich allerhöchstens in einem Anlaufbaustein zur Initialisierung von gleichen Anfangswerten machen oder tolerieren.

Das werden vermutlich nicht die einzigen Wertzuweisungen an A, B und C sein, und dieser Programmierstil führt oft zu höchst schwer verfolgbaren mehrfachen bedingten Zuweisungen an die selbe Variable verstreut in mehreren Programmbausteinen (und zu sogenannten Angst-Reset-Orgien an vielen Stellen), anstatt übersichtlich in nur einem Netzwerk oder einer Bildschirmseite die Wertzuweisung(en) komplett abzuhandeln.

Bei mehreren Kunden (auch bei uns) sind solche verstreuten mehrfachen Zuweisungen für Zuliefer-Programme nicht erlaubt.

Harald

Da gebe ich Dir und Euch vollkommen recht!
Dieser "Stil" zieht sich durch das gesamte Programm. Es ist es schwer nachzuvollziehen. Die Maschine an sich ist nichts sooo kompliziertes.
Mich stört schon diese Abkürzungsorgie...ich habe von dem Programmierer ein 4-seitiges Dokument mit der Auflistung der Abkürzungen bekommen(!!).
Leider war ich zur Auftragsvergabe und Ausschreibung noch nicht im Unternehmen, sonst hätte ich dem ein Riegel vorgeschoben.

Es ist auch ganz so wie Harald sagt: die Variablen werden quasi über das gesamte Programm verstreut zugewiesen und man sucht schon eine Weile. Das betrifft auch Ansteuersignale für FUs und Motoren...das hätte ich so nie gemacht. Einen Baustein für den Antrieb, der wird an einer Stelle aufgerufen und die notwendigen Signale werden an einer Stelle im Programm zugewiesen bzw. logisch verschaltet.

Aber gut zu wissen, dass ich nicht der Einzige bin der sich mit diesem "Stil" schwer tut.
 
Haben die Variablen denn in einem Zyklus überhaupt den gleichen Wert? Oder brauch der da 8 Zyklen?
Das sind einfach 8 Zuweisungen des selben Wertes nacheinander in der tippfaulen Variante. :cool:
Normalerweise sollte der Compiler selber erkennen, daß er "A := 1; B := 1; C := 1;" oder "A := 1; B := A; C := A;" zu "A := B := C := 1;" umformen kann.

Harald
 
Moin,
ich hoffe ihr macht dann aber konsequenterweise auch in FUP das:
Mehrfachzuweisung2.JPG
und nicht das:
Mehrfachzuweisung.JPG
;)

Ich sehe bei der Mehrfachzuweisung keine Probleme. Nur das ODER hätte ich zunächst auf eine temp geführt und dann zur Mehrfachzuweisung verwendet, um nochmal eine abweichende Meinung beizutragen.
 
Ich mag FUP ja nicht so sehr und schreibe neben SCL auch viel in KOP, aber ja ich würde es genauso machen.

Ist halt eine Frage der Lesbarkeit und weniger der Funktionalität, dass ist mir klar.
Gut lesbarer Code ist halt auch besser zu warten aber davon brauch ich hier ja nicht anfangen. Das wir alle alle ganz gut.
 
Ich wollte auch nur dem unbekannten Kollegen der das bei dir abliefert hat zur Seite springen. In meinen beiden FUP-Lösungen würde wohl keiner auf die Idee kommen eine der beiden Varianten als komisch oder unüblich zu empfinden. In SCL ist diese Funktion halt erst nachträglich mit V14 (glaub ich) hinzugekommen und schon irritiert einen das, obwohl es absolut das Selbe ist :p
 
Ich sehe bei der Mehrfachzuweisung keine Probleme.
Ich würde solche Zuweisungsketten nicht verwenden, weil man da nicht sicher sein kann, daß der schlecht dokumentierte SCL-Compiler das korrekt übersetzt. Es ist ja nicht das erste Mal daß die Siemens TIA-Compiler Entwickler etwas undurchdacht Optimierungen einbauen, die zu falschem Verhalten führen können.

Die SCL-Formulierung:
Code:
#a := #b := #c := #x OR #y OR #z;
entspricht in KOP programmiert folgendem:
Code:
  #x         #c
--| |--+--+--( )
       |  |
  #y   |  |  #b
--| |--+  +--( )
       |  |
  #z   |  |  #a
--| |--+  +--( )
Falsch wäre, wenn es so übersetzt wird (oder wenn man selber so programmiert, weil es bequemer zusammengeklickt ist):
Code:
  #x      #c     #b     #a
--| |--+--( )----( )----( )
       |
  #y   |
--| |--+
       |
  #z   |
--| |--+

Harald
 
Mal unabhängig davon kommt dann vielleicht irgendwann auch noch so etwas :
Code:
a := b := C := x1 and x2 := (Z>= 0) ;
Und was der Dinge mehr sind.
Sicher kann man das alles irgendwie so machen (egal ob KOP, FUP oder AWL) - das hat für mich aber nichts mehr mit "schreibfaul" zu tun . Irgendwann bleibt da dann auch mal die Lesbarkeit auf der Strecke. Da kommt dann am Ende dabei heraus, dass man sich das Programm erstmal Online ansehen muss damit man beurteilen kann ob eine Verknüfung und/oder Zuweisung überhaupt wie erwartet funktioniert ...

@Grimsey:
Da die Lieferanten mittlerweile sehr erfinderisch sind empfehle ich dir dringend ein Pflichtenheft zu erstellen, dass hier(für dich) sinnvolle Vorgaben macht.

Gruß
Larry
 
Ich würde solche Zuweisungsketten nicht verwenden, weil man da nicht sicher sein kann, daß der schlecht dokumentierte SCL-Compiler das korrekt übersetzt. Es ist ja nicht das erste Mal daß die Siemens TIA-Compiler Entwickler etwas undurchdacht Optimierungen einbauen, die zu falschem Verhalten führen können.
Ach Harald und Larry,
ihr habt ja schon recht, aber ich kann doch nicht auf alle neuen Funktionen vom TIA verzichten, nur weil ich nicht weiß wie gut oder schlecht Siemens das umgesetzt hat. Ich für meinen Teil probiere solche Dinge aus (in der Sim und auf der richtigen CPU), evaluiere sie für mich und verwende sie dann ggf. auch. Ich kann ja auch nicht auf jeden Siemens-Baustein verzichten, nur weil ich dort nicht selber reinschauen kann.
Natürlich sollte der TE ein ordentliches Pflichtenheft erstellen um ein Programm nach seinen Vorgaben und (Zuweisungs-)Vorstellungen zu erhalten. Mir wäre halt wichtiger ein gut dokumentiertes und vernünftig strukturiertes Programm zu bekommen und tausend andere Dinge, die wichtiger sind als die Art der Zuweisung, weil das am Tagesende einfach nur Geschmackssache ist.
 
Zuletzt bearbeitet:
Da mir diese Schreibweise ehrlich gesagt neu war, wollte ich mal fragen ob das eine verbreitet Schreibweise ist und Ihr das eventuell auch so macht.
Diese Schreibweise ist eigentlich uralt, ausser anscheinend in SCL.
Compiler, die nicht mit dem Problem zu kämpfen haben, dass dieselbe Schreibweise für WertZuweisungen und für Vergleiche auf gleich bei der jeweiligen Sprache verwendet werden, können i.A. solche Zuweisungen richtig verarbeiten.
A := B := C = D; ist eindeutig: wenn C gleich D ist, wird den Variablen A und B derselbe Wert True zugeordnet, sonst wird den Variablen A und B der Wert False zugeordnet - und zwar passiert das alles selbstverständlich im selben Zyklus.
Hier muss man allerdings aufpassen, weil sich die Anweisung über mehrere Zeilen erstrecken kann und erst durch das ";" beendet wird.
A = B = C = D (z.B. in VB) ist auch eindeutig, weil hier immer nur das erste "=" von links in einer Zeile die Zuweisung ist und alle folgenden "=" deshalb nur der VergleichsOperator sein können.
Hier muss man aufpassen, weil die Anweisung mit dem ZeilenEnde beendet ist und weitere Zeilen nicht mehr dazu gehören, es sei denn, . . . (StichWort "_") . . . aber das ist schon zu sehr off Topic.

Komischerweise habe ich noch nie gehört, dass sich jemand in AWL über
U Bit1
= Bit2
= Bit3
= Bit4
oder
L 0
T Wort1
T Wort2
T Wort3
den Kopf zerbrochen hätte, was davon in welchem Zyklus ausgeführt wird, wenn überhaupt.
Was daran so verwirrend und unverständlich sein soll, kann ich nicht nachempfinden.
Noch kompakter und klarer und übersichtlicher kann man doch kaum den Sachverhalt darstellen und ich wüsste auch nicht, dass Querverweise dadurch unter den Teppich gekehrt würden.

Für mein Verständnis hat dies auch nichts mit MehrfachZuweisung zu tun.
Für mich ist MehrfachZuweisung, wenn derselben Variablen an verschiedenen Stellen im Programm Werte zugewiesen werden und nicht, wenn mehreren Variablen an "zufällig" derselben Stelle im Programm "zufällig" derselbe Wert zugewiesen wird.

Gruss, Heinileini
 
@Grimsey:
Da die Lieferanten mittlerweile sehr erfinderisch sind empfehle ich dir dringend ein Pflichtenheft zu erstellen, dass hier(für dich) sinnvolle Vorgaben macht.

Das war eine meiner ersten Amtshandlungen.

@Heinileini
in AWL würde ich es auch so machen, wie Du es gezeigt hast.
In dem gezeigten Code geht es auch nicht um Mehrfachzuweisung, denn das ist es defacto ja auch nicht (mal abgesehen davon das es diese trotzdem in dem Programm massenweise gibt...).
Ich hab diese Art halt zum 1.Mal gesehen und finde sie einfach nicht gut lesbar.

Wie das hier aber schon erwähnt wurde, ist es natürlich auch eine Geschmackssache.
Und mein Geschmack ist es nicht ;)
 
Zuletzt bearbeitet:
@Howard:
Ich bin auch ziemlich offen für alles mögliche - beim Thema Code-Lesbarkeit bin ich aber seeeeeehr konservativ. Ich denke auch mal, dass man nicht jeden Code-Gag schreiben muss, nur weil er machbar ist ...

@Heinileini:
Für mich ist diese Schreibweise für Code-Erstellung nicht uralt. Welche (noch aktuellen) Programmiersprachen verwenden so etwas denn alle so ...?

Gruß
Larry
 
Welche (noch aktuellen) Programmiersprachen verwenden so etwas denn alle so ...?
Kann ich aus dem Ärmel leider gar nicht sagen. Wahrscheinlich liegt das daran, dass die Schreibweise tatsächlich so uralt ist, dass sie in "noch aktuellen" ProgrammierSprachen gar nicht mehr so aktuell ist und ich in Sprachen wie FORTRAN IV & V, ALGOL 60 & 68, COBOL seit > (alias .GT.) 35 Jahren nicht mehr programmiert habe. PASCAL-Routinen habe ich mal in C umgeschrieben - ist aber auch schon wieder ewig her. Diverse BASIC-Dialekte und Assembler-Sprachen kommen wohl nicht in Frage, hp25, hp19/29, hp67/97 und hp41 auch nicht (vergleichbar mit AWL). Bei CL800 weiss ich's nicht mehr.
Sorry, ich krieg's einfach nicht auf die Reihe und muss Dir die Antwort schuldig bleiben. Könnte natürlich anfangen, danach zu guugeln - aber wozu? Wir kennen die Schreibweise, können sie lesen und werden nicht gezwungen sie auch zu schreiben. :grin:

Gruss, Heinileini
 
Welche (noch aktuellen) Programmiersprachen verwenden so etwas denn alle so ...?
Ich kenne solche Zuweisungsketten von C/C++, die gibt es vermutlich auch bei allen C-Nachfolgern wie Java, C#, ...
(anscheinend bei C schaut sich TIA-SCL auch andere 50 Jahre alte Ideen für Neuerungen ab, wie z.B. die kombinierten Zuweisungen +=, -=, ...)

In C/C++ hat eine Zuweisung einen Wert/Rückgabewert (den Wert des Zugewiesenen) und kann deshalb auch als Ausdruck verwendet werden, und damit auch rechts von einer Zuweisung verwendet werden, oder als Teil eines Ausdrucks (!).

Harald
 
Hallo zusammen,

ich habe in einem Programm von einem unserer Lieferanten folgende Passage gefunden:
Code:
    "gb".cmd_ack                :=
    "gb".FU_FaAntr.ctrl.b.rst   :=        
    "gb".FU_LW.ctrl.b.rst       :=  
    "gb".FU_QS_Mat.ctrl.b.rst   :=  
    "gb".FU_LS.ctrl.b.rst       :=  
    "gb".FU_RSW_1.ctrl.b.rst    := 
    "gb".FU_RSW_2.ctrl.b.rst    := 
    "gb".FU_RSW_3.ctrl.b.rst    := 
            #HtP_cmd_ack_TP.Q
        OR  #Quitt_TP.Q
        OR  #rst_Not_Aus_TP.Q
        OR  #Ini_I_on_RT.Q
        OR  #RM_HS_RT.Q;

Um ehrlich zu sein musste ich mir das gerade in einem Testprojekt mal nachbauen um zu prüfen was genau da passiert.
Soweit habe ich das verstanden aber ich finde es recht unübersichtlich.

Ich hätte mir eher ein Signal aus der ODER-Verknüpfung gebaut und dieses dann den einzelnen Signalen zugewiesen.
Fände ich deutlich besser lesbar.

Da mir diese Schreibweise ehrlich gesagt neu war, wollte ich mal fragen ob das eine verbreitet Schreibweise ist und Ihr das eventuell auch so macht.
Reines Interesse.

Ja, Ich nach das genau so. Aber nur im TIA
Seit TIA V14 ist dies möglich.

Ich spar mir ein weitere variable auf diese Weise.

Bram
 
Zurück
Oben