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

Zuviel Werbung?
-> Hier kostenlos registrieren
Ich finde die Art des Konstruktes irgendwie unübersichtlich, wenn man es schon benutzen
möchte, hätte man ja die Verknüpfung trennen können. Als Beispiel:
Code:
tmpBool :=  #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;




    "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    :=  tmpBool;        

[HR][/HR]
meine bevorzugte Variante hätte so ausgesehen:

    "gb".cmd_ack                :=  tmpBool; 
    "gb".FU_FaAntr.ctrl.b.rst   :=  tmpBool;         
    "gb".FU_LW.ctrl.b.rst       :=  tmpBool;   
    "gb".FU_QS_Mat.ctrl.b.rst   :=  tmpBool;   
    "gb".FU_LS.ctrl.b.rst       :=  tmpBool;  
    "gb".FU_RSW_1.ctrl.b.rst    :=  tmpBool; 
    "gb".FU_RSW_2.ctrl.b.rst    :=  tmpBool; 
    "gb".FU_RSW_3.ctrl.b.rst    :=  tmpBool;
 
Was daran ist schwer zu lesen, außer, dass man es irgendwann zum ersten Mal sieht?
Ich hab das auch in einigen Programmen gesehen, spart zumindest eine weitere Temp-Var und wenn es nicht inflationär in jedem 2.NW steht, finde ich es nicht schlimm.
Über Mehrfachzuweisungen müssen wir ohnehin nicht reden, die sind nicht schön, in SCL aber inzwischen auch wesentlich mehr verbreitet, als in KOP/FUP. Das liegt sicher im System, ist bei SCL kaum wirlich zu vermeiden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In C/C++ hat eine Zuweisung einen Wert/Rückgabewert (den Wert des Zugewiesenen) und kann deshalb auch als Ausdruck verwendet werden, . . .
Was mir daran gefallen hat: dass man damit das Inkrementieren eines SchleifenZählers und die Abfrage des SchleifenZählers zu einer Anweisung zusammenfassen kann.
Ist natürlich auch Geschmackssache.
 
Zuletzt bearbeitet:
Ich spar mir ein weitere variable auf diese Weise.
Variablen sind bei Siemens bekanntlich ja sooo teuer. ;)

Siemens-Beispielprogramme nach Programmierstyleguide zeigen wie es gemacht werden soll :cool: und speichern nach fast jeder einzelnen Operation jedes noch so unwichtige Zwischenergebnis auf Variablen :rolleyes: z.B. der FB LGF_Integration:
Code:
	// Calculate time difference between last and actual time
	#tempDeltaTimeT := #statSysTime - #statLastTime;
	
	// Convert times difference to REAL
	#tempDeltaTimeDInt := TIME_TO_DINT(#tempDeltaTimeT);
	#tempDeltaTimeReal := DINT_TO_REAL(#tempDeltaTimeDInt);
	
	// Convert in seconds
	#tempDeltaTimeReal := #tempDeltaTimeReal / 1000.0;


Was mir daran gefallen hat: dass man damit das Inkrementieren eines SchleifenZählers und die Abfrage des SchleifenZählers zu einer Anweisung zusammenfassen kann.
Noch besser: einen Null-terminierten String kopieren:
Code:
while (*d++ = *s++);

Harald
 
Was daran ist schwer zu lesen, außer, dass man es irgendwann zum ersten Mal sieht?
Ich hab das auch in einigen Programmen gesehen, spart zumindest eine weitere Temp-Var und wenn es nicht inflationär in jedem 2.NW steht, finde ich es nicht schlimm.
Über Mehrfachzuweisungen müssen wir ohnehin nicht reden, die sind nicht schön, in SCL aber inzwischen auch wesentlich mehr verbreitet, als in KOP/FUP. Das liegt sicher im System, ist bei SCL kaum wirlich zu vermeiden.

Grunsätzlich ist es schwer zu lesen ob die Verknüpfung erfüllt ist und warum Sie erfüllt ist.
Schöner wird es wenn noch zu den "OR" ein paar "AND" kommen, damit kann man sogar sich
selber zur Verzweifelung bringen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Grunsätzlich ist es schwer zu lesen ob die Verknüpfung erfüllt ist und warum Sie erfüllt ist.
Schöner wird es wenn noch zu den "OR" ein paar "AND" kommen, damit kann man sogar sich
selber zur Verzweifelung bringen.
da hast du leider recht, aber das liegt ja eher an der misslungenen Online-Ansicht von SCL und betrifft jede größere Verknüpfung. Den Onlinewert direkt an der Variable zu sehen wäre da hilfreicher. In solchen fällen kann ich nur die viel zitierte "gelbe Pest" empfehlen:
OnlineBeaobachten.jpg
so kann man sich langsam von Variable zu Variable durchhangeln :rolleyes:
 
anscheinend bei C schaut sich TIA-SCL auch andere 50 Jahre alte Ideen für Neuerungen ab, wie z.B. die kombinierten Zuweisungen +=, -=, ...
Für Schreibweisen wie += u.s.w. gab es mal einen Grund: man konnte damit SpeicherZugriffe und somit Ausführungszeit sparen. Das war noch zu der Zeit, als der Programmierer dem Compiler auf die Sprünge helfen musste, statt sich von einem im Compiler untergebrachten "Besserwisser" Überraschungen durch Optimierungen unterjubeln zu lassen.

Übrigens, die Klammern bei BitVerknüpfungen in AWL ermöglichen auch "Tricks", die für meinen Geschmack alles andere als "gut lesbar" sind. Habe diese Möglichkeiten immer gemieden und dementsprechend leider auch keine Beispiele parat.
 
Moin,
ich hoffe ihr macht dann aber konsequenterweise auch in FUP das:
Anhang anzeigen 45170
und nicht das:
Anhang anzeigen 45171
;)

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.

In Fup würde ich vermutlich eine Variable verwenden und diese mit einm zusätzlichen Pfad pro = anschliessen. Also die = untereinander aber mit einer Linie an nur eine Eingangsvariable angebunden.

Ich denke ausserdem, dass man nicht die FUP/KOP Programmierstile direkt nach SCL portieren sollte.
In Kop sehen Bitverknüpfung in einer Linie Horizontal ja noch gut und übersichtlich aus. Das ist aber in SCL IMHO nicht der fall, da schreibe ich lieber untereinander.
Code:
 "TCHO.UVR.201.35_I8.0" :=
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.NG.Alarm" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_NG1.Alarm" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SPV.Stoe" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.QSK.1070.2070" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.QSK.1072.2072" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.QSK.710" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V_FS1070_2070" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1072_2072" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1076_2076" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1078_2078" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1080_2080" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.WS2552" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.WS2553" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1082_2082" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1084_2084" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1086_2086" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1088_2088" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.VA1560_2560" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1090_2090" OR
 "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.VA1562_25

Am liebsten wäre mir, der Editor würde das automatisch auch so einrücken
Code:
 "TCHO.UVR.201.35_I8.0" :=   "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.NG.Alarm" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_NG1.Alarm" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SPV.Stoe" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.QSK.1070.2070" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.QSK.1072.2072" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.QSK.710" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V_FS1070_2070" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1072_2072" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1076_2076" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1078_2078" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1080_2080" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.WS2552" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.WS2553" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1082_2082" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1084_2084" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1086_2086" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1088_2088" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.VA1560_2560" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.FS1090_2090" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.VA1562_2562" OR
                             "GDB_HW_Datenpunkte"."TCHO.UVR.201.35_SiAut.230V.MS704_706";
 
Und wie machst Du es, wenn Du das Ergebnis der langen Verknüpfung mehrmals verwenden willst, z.B. an 8 verschiedene Variablen zuweisen möchtest?

Dann gehe ich über eine Temp. manchmal überlege ich mir sogar einen sinnvollen Namen für diese Temporäre variable.
Aber oft habe ich genau für sowas eine dummy Temp in der Schnittstelle. Man muss dann halt nur aufpassen das man sie wirklich vor der Abfrage auch mit dem Ergebnis beschreibt das für diese Abfrage zählt.
 
Hallo zusammen,

ich habe wieder was gefunden, was mich stutzig werden lässt:
Code:
 IF "gb".FU_DF.sts.msg_n_0 THEN
          #w_F_DF := - LINT_TO_REAL(1500);
ELSE
          #w_F_DF := - UINT_TO_REAL("gb".DF.w.F_abzi);
 END_IF;

Gibts eine Erklärung warum man bei der 1. Zuweisung von "w_F_DF" der Wert nochmal gewandelt wird??
Man hätte doch auch "w_F_DF := 1500.0;" schreiben können.
 
Zurück
Oben