Summe bilden aus einer Strukturvariablen

gergomeier

Level-2
Beiträge
17
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

gibt es eine Möglichkeit eine Summe einer REAL-Variablen aus einer Struktur zu addieren?

Bsp:
Ich habe mehrere Stromverbraucher die ihren Istverbrauch in der Variable "r_Momentanleistung" liefern. Die Geräte sind in einer Datenstruktur hinterlegt.
Code:
TYPE Stromverbrauch_Verbraucher :
    STRUCT
        Schreibtisch                : Stromverbrauch_Geraete;
        Balkonkraftwerk                : Stromverbrauch_Geraete;
        Waschmaschine                : Stromverbrauch_Geraete;
        Trockner                    : Stromverbrauch_Geraete;
        Spuehlmaschine                : Stromverbrauch_Geraete;
        Pool                        : Stromverbrauch_Geraete;
        Waermepumpe                    : Stromverbrauch_Geraete;
        Fernseher_Wohnzimmer        : Stromverbrauch_Geraete;
        Klimaanlage                    : Stromverbrauch_Geraete;
    END_STRUCT
END_TYPE


Die offensichtliche Variante die Summe zu bilden wäre
Summe := Schreibtisch.r_Momentanleistung + Balkonkraftwerk.r_Momentanleistung +....

Seht ihr eine einfachere Variante?

Gruß
Andreas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verwende ein STRUCT meist wenn ich mir Wiederholungen plane. Einfacher wäre vielleicht über eine GVL zu arbeiten, aber dann wäre eine Wiederverwendbarkeit komplizierter.
So sehe ich das als durchaus gängige Variante die nicht wirklich zu vereinfachen geht.
 
ok, dachte man könnte es ggf. über Adressen lösen, da die Struktur hintereinander im Speicher liegen müsste. Dann sollte die gleiche Variable immer den selben Offset haben und somit ließe sich das über eine For-Schleife aufsummieren...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ok, dachte man könnte es ggf. über Adressen lösen, da die Struktur hintereinander im Speicher liegen müsste. Dann sollte die gleiche Variable immer den selben Offset haben und somit ließe sich das über eine For-Schleife aufsummieren...
Wenn du ein Array daraus machst geht das auch so.


Code:
Stromverbraucher    Array[0..n] OF DUT_Stromverbraucher


Stromverbraucher[0]    // Reserve/Nicht verwendet
Stromverbraucher[1] // Schreibtisch
Stromverbraucher[2] // WasAuchImmer
...

FOR
Hier dann einfach addieren
END_FOR
 
Und du meinst, das wäre "einfacher"? Was verstehst du unter "einfacher"?
Deswegen frage ich hier, weil es mich interessiert. Ich versuche meinen Code auf wenige Zeilen zu reduzieren. Mit 10 Summanden aus der gleichen Struktur erhoffte ich, dass es irgendwie einfacher ginge.
So wie es @DCDCDC vorgeschlagen hat, habe ich es mir auch gedacht. Nur verliere ich dadurch den "lesbaren" Textbezug innerhalb des Codes.
Ein Enum immerhalb der eckigen Klammer [] wäre die Lösung wenn es sinnvoll möglich wäre
--> Stromverbraucher[Schreibtisch].r_Momentanleistung

Dann war ich zumindest nicht ganz so falsch. Vielen Dank euch!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Deswegen frage ich hier, weil es mich interessiert. Ich versuche meinen Code auf wenige Zeilen zu reduzieren. Mit 10 Summanden aus der gleichen Struktur erhoffte ich, dass es irgendwie einfacher ginge.
So wie es @DCDCDC vorgeschlagen hat, habe ich es mir auch gedacht. Nur verliere ich dadurch den "lesbaren" Textbezug innerhalb des Codes.
Ein Enum immerhalb der eckigen Klammer [] wäre die Lösung wenn es sinnvoll möglich wäre
--> Stromverbraucher[Schreibtisch].r_Momentanleistung

Dann war ich zumindest nicht ganz so falsch. Vielen Dank euch!
Ein Enum gibt es zwar nicht, aber du kannst dir einfach globale Konstanten für die Indizes anlegen.
Dann kannst du die Konstante in den eckigen Klammern verwenden.
 
Verbraucht „negative“ Leistung… :cool:
Das ist korrekt. In der Struktur gibt es natürlich nicht nur den Momentanverbrauch sondern auch sowas wie Tagesleistung, Jahresleistung etc.
Für die Energiemessung des Balkonkraftwerks verwende ich das gleiche Messgerät wie für alle anderen Steckdosen (z.B. Waschmaschine) mit Verbrauchsmessung

Ein Enum gibt es zwar nicht, aber du kannst dir einfach globale Konstanten für die Indizes anlegen.
Dann kannst du die Konstante in den eckigen Klammern verwenden.
Der Tipp erscheint mir die von mir gesuchte Lösung zu sein! Danke dir!
 
Ich versuche meinen Code auf wenige Zeilen zu reduzieren. Mit 10 Summanden aus der gleichen Struktur erhoffte ich, dass es irgendwie einfacher ginge.
So wie es @DCDCDC vorgeschlagen hat, habe ich es mir auch gedacht.
Einen Einzeiler mit 10 Summanden durch eine mehrzeilige aufwendige unleserliche FOR-Schleife ersetzen, kann man schwerlich "einfacher" nennen.
Durch die Schleife wird der Code aufgebläht/größer und langsamer und schwerer verständlich. Und vielleicht sollen aus dem Array ein/zwei Geräte nicht mit summiert werden - dann wird es ganz unübersichtlich. Aber vielleicht hat der Programmierer einmalig eine Minute Arbeitszeit gespart und die Kollegen oder Familie gucken staunend, was man doch für tollen komplizierten Code schreiben kann ...
 
Einen Einzeiler mit 10 Summanden durch eine mehrzeilige aufwendige unleserliche FOR-Schleife ersetzen, kann man schwerlich "einfacher" nennen.
Durch die Schleife wird der Code aufgebläht/größer und langsamer und schwerer verständlich. Und vielleicht sollen aus dem Array ein/zwei Geräte nicht mit summiert werden - dann wird es ganz unübersichtlich. Aber vielleicht hat der Programmierer einmalig eine Minute Arbeitszeit gespart und die Kollegen oder Familie gucken staunend, was man doch für tollen komplizierten Code schreiben kann ...
Die Wahrheit liegt wohl eher im einfachen.Es wird heute fast ein Sport daraus gemacht, Dinge zu verkomplizieren.
Ich halte das fast für ein generelles Problem heute.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kurze Rückmeldung:
  • Code wurde angepasst.
  • (Globale) Konstanten für jede Verbrauchseinheit wurden definiert. Vorteil: Mehrfachverwendung möglich
  • Bei der Gelegenheit wurde die Struktur erweitert in "Verbraucher" und "Erzeuger" (Stichwort "ngeative Leistung, wie von @Chräshe angemerkt)
  • Die eigentliche Addition der Werte besteht nun aus 4 Zeilen
Code:
(* Summe der Verbraucher bilden *)
Stromverbrauch.r_Summe_Verbraucher := REAL#0;
FOR i_Summe := INT#1 TO INT#20 DO
Stromverbrauch.r_Summe_Verbraucher    := Stromverbrauch.r_Summe_Verbraucher + Stromverbrauch.Verbraucher[i_Summe].r_Momentanleistung;
END_FOR;

--> Somit die perfekte Lösung für mich
 
Summe := Schreibtisch.r_Momentanleistung + Balkonkraftwerk.r_Momentanleistung +....
Wenn du es etwas anders schreibst, kannst Du schnell Teile auskommentieren:

Code:
Summe := 0  // Die 0 dient als Platzhalter, damit die erste "echte" Variable als Einzeiler zum auskommentieren stehen kann.
+ Schreibtisch.r_Momentanleistung
+ Balkonkraftwerk.r_Momentanleistung
+ Waschmaschine.r_Momentanleistung
//+ Spülmaschine.r_Momentanleistung
+ Trockner.r_Momentanleistung
; // Das Semikolon steht in einer separaten Zeile, damit die letzte "echte" Variable einfach auskommentiert werden kann.



Kurze Rückmeldung:
  • Code wurde angepasst.
  • (Globale) Konstanten für jede Verbrauchseinheit wurden definiert. Vorteil: Mehrfachverwendung möglich
  • Bei der Gelegenheit wurde die Struktur erweitert in "Verbraucher" und "Erzeuger" (Stichwort "ngeative Leistung, wie von @Chräshe angemerkt)
  • Die eigentliche Addition der Werte besteht nun aus 4 Zeilen
Code:
(* Summe der Verbraucher bilden *)
Stromverbrauch.r_Summe_Verbraucher := REAL#0;
FOR i_Summe := INT#1 TO INT#20 DO
Stromverbrauch.r_Summe_Verbraucher    := Stromverbrauch.r_Summe_Verbraucher + Stromverbrauch.Verbraucher[i_Summe].r_Momentanleistung;
END_FOR;

--> Somit die perfekte Lösung für mich

Dazu noch eine kleine Optimierung:

Code:
Stromverbrauch.r_Summe_Verbraucher    := Stromverbrauch.r_Summe_Verbraucher + Stromverbrauch.Verbraucher[i_Summe].r_Momentanleistung;

kann auch so geschrieben werden:

Stromverbrauch.r_Summe_Verbraucher    += Stromverbrauch.Verbraucher[i_Summe].r_Momentanleistung;


VG
MFreiberger
 
Kurze Rückmeldung:
  • Code wurde angepasst.
  • (Globale) Konstanten für jede Verbrauchseinheit wurden definiert. Vorteil: Mehrfachverwendung möglich
Die Arbeit hättest du sparen können, wenn du nicht die Struktur auf Array geändert hättest.

  • Bei der Gelegenheit wurde die Struktur erweitert in "Verbraucher" und "Erzeuger" (Stichwort "ngeative Leistung, wie von @Chräshe angemerkt)
Das hättest du auch sparen können, üblicherweise durch vor dem Programmieren einen Plan machen. Damit du mit der unverständlichen Schleife nicht Äpfel und Birnen addierst, musste nun aber aufgeräumt werden.

  • Die eigentliche Addition der Werte besteht nun aus 4 Zeilen
Code:
(* Summe der Verbraucher bilden *)
Stromverbrauch.r_Summe_Verbraucher := REAL#0;
FOR i_Summe := INT#1 TO INT#20 DO
Stromverbrauch.r_Summe_Verbraucher    := Stromverbrauch.r_Summe_Verbraucher + Stromverbrauch.Verbraucher[i_Summe].r_Momentanleistung;
END_FOR;

--> Somit die perfekte Lösung für mich
Wow, endlich Code, den außer dir jeder erst nach 5 Minuten Analyse versteht. Und der sich auch nicht mehr auf die Schnelle ändern/auskommentieren lässt, wenn ein Verbraucher nicht mehr mit addiert werden soll?

Warum eigentlich schreibst du so umständlich "REAL#0" anstatt "0.0"? Und warum "INT#1" und "INT#20" anstatt einfach 1 und 20?
 
Dazu noch eine kleine Optimierung:

Code:
Stromverbrauch.r_Summe_Verbraucher := Stromverbrauch.r_Summe_Verbraucher + Stromverbrauch.Verbraucher[i_Summe].r_Momentanleistung;

kann auch so geschrieben werden:

Stromverbrauch.r_Summe_Verbraucher += Stromverbrauch.Verbraucher[i_Summe].r_Momentanleistung;

Also auch der CS3.5 Compiler sagt nein zu i += 1; aber über eine kürzere Form von i := i + 1; würde ich mich freuen.
 
Zurück
Oben