LabVIEWForum.de
Lastprofile interpolieren - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Lastprofile interpolieren (/Thread-Lastprofile-interpolieren)



Lastprofile interpolieren - David_Lab - 03.01.2014 18:09

Hallo Zusammen,

ich werde jetzt mal hier als Nutzer Aktiv. Ich konnte mir in eurem Forum schon viele Anregungen und Hilfestellungen aneignen, dafür danke ich schon mal.
Jetzt zu meinem Problem. Ich schreibe an meiner Abschlussarbeit und soll u.a. ein SUBVI schreiben welches die zwei eingegebenen Lastprofile auf deren Zeitabstand bzw. gemessene Werte pro Stunde untersucht und falls diese nicht identisch skaliert sind, diese aufeinander angleicht. Dies soll durch eine Interpolation erfolgen. Das Lastprofil mit der Zeitlich höheren Auflösung soll als Referenz dienen, sprich es wird wenn z.B. ein Lastprofil mit 6 Werten pro Stunde und ein Lastprofil mit 4 Werten pro Stunde vorliegt, das Lastprofil mit 4 Werten auf ein Lastprofil mit 6 Werten "erweitert" werden soll. Das ganze klappt prinzipiell auch nur ist mein Problem, dass das ganze viel zu langsam ist.

Vielleicht habt ihr ja eine Idee woran das ganze liegen könnten?

Ich hänge noch ein Beispielhaftes Bild mit an wo die Interpolation dargestellt ist. Die Angehängten Dateien sind das Haupt SUBVI "Lastprofile interpolieren" und die SubVis welche den Zeitlichen Abstand ermittelt und ob alle Lastprofile gleich skaliert sind und das Lastprofil für die eigentliche interpolation. Zudem hänge ich noch ein Lastprofil für die PV Einspeisung und den Verbrauch mit an, welche unterschiedlich skaliert sind.

Ich danke schon mal im Voraus und wünsche ein angenehmes Wochenende
Gruß David

Hier noch das Verbrauchs Lastprofil


RE: Lastprofile interpolieren - jg - 03.01.2014 21:03

Offtopic2
Dies hier
[attachment=47895]
habe ich dir doch schon hier rausprogrammiert. Wieso ist es wieder drinnen?
Und dein Vergleichs-VI ist auch ein wenig arg umständlich:
[attachment=47896]
Gruß, Jens


RE: Lastprofile interpolieren - jg - 03.01.2014 22:58

(03.01.2014 18:09 )David_Lab schrieb:  ich werde jetzt mal hier als Nutzer Aktiv.
Bist du das nicht schon? s. http://www.labviewforum.de/Thread-Zeitachse-erstellen-bzw-Formatieren , hier hast du schon mal die "extrem langsam" Frage gestellt.

Ein wenig weitere allgemeine Kritik:
Wieso liest du in jedem Schleifendurchlauf die Files ein?
Wieso immer die Berechnug der "Werte Pro Stunde"?
Es ist IMHO extrem ungünstig, Profil-Verläufe mit unterschiedlichen Zeitbereichen aufeinander anzupassen (PV-Profil geht von 03/2010-02/2011, das Last Profil von 01/2011-12/2011).
Deine Überprüfung auf "Werte pro Stunde" ist extrem statisch, sie geht davon aus, dass du immer Tabellen hast, die Werte für 1 Jahr enthalten. Offenbar hast du dann noch mühsam Anpassungen vorgenommen für den Fall, dass ab und an Werte fehlen, wie bei deinem Last-Profil Upload. Da fehlen 4 Werte. Verwende doch die vorhandenen Zeitstempel zur Berechnung des vorhandenen Delta-T.

Es gibt fertige Funktionen zum Interpolieren, z.B. Interpolate 1D. Bei korrekter Anwendung dieses VI bist du quasi schon fertig.

Gruß, Jens


RE: Lastprofile interpolieren - David_Lab - 04.01.2014 13:46

Hallo,
erstmals vielen Dank für deine Antwort.
Der Verlinkte Beitrag ist von einem Kommilitonen der eine ähnliche Abschlussarbeit schreibt und wir haben noch nicht über die besagt Verbesserung gesprochen, die ich jetzt dankend übernehmen werden.
Zu der Weiteren Kritik. Ehrlich gesagt sehe ich das nicht, dass ich in jedem Schleifendurchlauf die Files einlesen, bzw. ich wüsste nicht wie ich es anders machen sollte.
Was meinst du mit wieso immer die Berechnung der „Werte Pro Stunde“ ?
Die gegebenen Profile waren jetzt nur Beispiele und es sollen nur Profile verwendet werden die zu mindestens zum gleichen Zeitpunkt beginnen.
Die Überprüfung auf „Werte pro Stunde“ versuche ich jetzt mal zu ändern, dass Problem was ich dabei habe ist nur das ich den String der Zeitachse nicht in eine Zahl umwandeln kann um ein Delta-T zu ermitteln.
Mit der gegebenen Funktion zum Interpolieren komm ich nicht ganz klar, bzw. diese bezieht sich nur auf eine lineare Interpolation? In meinen gegebenen Lastprofilen sind ja Energien gegeben entsprechend angehängter Zeichnung. Kann ich die Funktion den dafür einsetzen?

Gruß David


RE: Lastprofile interpolieren - GerdW - 04.01.2014 18:49

Hallo David,

welches Ergebnis erwartest du bei boolschen Ausdrücken wie diesem:
Code:
y := (a=2) AND (a=3)
???
Diese verwendest du mehrfach in "SUBVI Interpolieren" - und jedesmal wohl falsch...

Weitere Dinge:
- Wenn man ein einzelnes Element eines (1D-)Arrays haben will, nimmt man nicht ArraySubSet mit Länge=1, sondern IndexArray...
- Es gibt Funktionen wie "+1"...
- Wenn man wissen will, wie oft eine FOR-Loop durchläuft, muss man nicht erst ein Array am Ausgang aufbauen und dessen Element zählen lassen: man könnte auch einfach das "N" der Schleife abfragen...
- Konstante Operationen kann man vor der Schleife durchführen und nicht innerhalb...

Ich habe mal nur die innerste Case-Struktur überarbeitet, siehe Anhang...

In "Überprüft den Lastprofil Zeitabstand" hast du einen Tippfehler, oder ist das hier:
Code:
if(Groesse >= 105020 && Groesse >= 105220)
wirklich gewollt? Hmm
Außerdem ist die Verwendung von Kommata im Formelknoten sehr "fragwürdig", wie z.B. hier:
Code:
ska =2,4;
Was sagt die Hilfe (zum Formelknoten) zu diesem Thema? Mal schauen:
Zitat:Bei Formelknoten ist als Dezimalzeichen nur ein Punkt (.) zulässig. Das Komma wird von der Funktion nicht erkannt.
Immer wieder schön, wenn LabVIEW-Anfänger mit der Hilfe arbeiten... Big Grin
Und noch schöner, wenn selbst einfachste Funktionsüberprüfungen anscheinend unterlassen wurden... Hmm

Auch wenn man schon die Lust verliert, noch ein VI anschauen: "Lastprofile_interpoliern".
- Wozu die FOR-Loop um die Multiplikation der Array-Elemente mit 1000/Summe(Array)? Das geht auch ohne Loop dank Polymorphismus...
- Wozu die FOR-Loop direkt danach? Wenn man die erste Spalte eines 2D-Arrays haben will, nimmt man IndexArray und schreibt eine Null an den Eingang für die Spalte...
- Warum ReadSpreadsheetFile in der String-Variante und nicht gleich in der Double-Variante? Du musst nur den passenden Formatcode ("%.;%f") vorgeben...
- Der Rest wurde schon gesagt: Konstante Operationen immer vor einer Schleife ausführen - wie diese ReadFile-Operationen...

Tipp:
Wenn man mehrere VIs anhängen will, bietet sich ein ZIP-Archiv an...


RE: Lastprofile interpolieren - jg - 04.01.2014 21:15

(04.01.2014 13:46 )David_Lab schrieb:  Hallo,
erstmals vielen Dank für deine Antwort.
Der Verlinkte Beitrag ist von einem Kommilitonen der eine ähnliche Abschlussarbeit schreibt und wir haben noch nicht über die besagt Verbesserung gesprochen, die ich jetzt dankend übernehmen werden.
Zu der Weiteren Kritik. Ehrlich gesagt sehe ich das nicht, dass ich in jedem Schleifendurchlauf die Files einlesen, bzw. ich wüsste nicht wie ich es anders machen sollte.
Was meinst du mit wieso immer die Berechnung der „Werte Pro Stunde“ ?
Du hast um deinen gesamten Sourcecode eine While-Schleife. Der liest erst die Profile ein, macht dann deine "Werte-Pro-Stunde" Berechnung, und versucht dann, schrittweise (nämlich immer 1/2-h Weise) dein PV-Profil neu zu berechnen (was aber schief geht, da fehlerhaft programmiert). Abbruch dieser Schleife sollte wohl sein, wenn du mit der Berechnung fertig bist (funzt aber net mit deinem VI). Dann liest du wieder ein, berechnest neu, und probierst die nächsten Zeilen neu zu "interpolieren".
(04.01.2014 13:46 )David_Lab schrieb:  Die gegebenen Profile waren jetzt nur Beispiele und es sollen nur Profile verwendet werden die zu mindestens zum gleichen Zeitpunkt beginnen.
Die Überprüfung auf „Werte pro Stunde“ versuche ich jetzt mal zu ändern, dass Problem was ich dabei habe ist nur das ich den String der Zeitachse nicht in eine Zahl umwandeln kann um ein Delta-T zu ermitteln.
s. der nette Parallel-Thread deines Kommilitonen. Da wird gezeigt, wie du Strings in Timestamps wandeln kannst. Und mit Timestamps kann man rechen, z.B. kann man 2 Timestamps voneinander subtrahieren. Da kommt dann eine Double-Zahl in Sekunden heraus.
(04.01.2014 13:46 )David_Lab schrieb:  Mit der gegebenen Funktion zum Interpolieren komm ich nicht ganz klar, bzw. diese bezieht sich nur auf eine lineare Interpolation? In meinen gegebenen Lastprofilen sind ja Energien gegeben entsprechend angehängter Zeichnung. Kann ich die Funktion den dafür einsetzen?
Es ist jetzt das allererste Mal die Rede davon, dass deine Profile in der 2. Spalte "Energien pro Zeiteinheit" enthalten, also z.B. den Verbrauch in den letzten 10 bzw. 15 Minuten. Das hättest du gleich mal erwähnen können, und von Interpolation kann man dann eigentlich IMHO auch nicht reden, vielmehr von einer Neuberechnung.

(04.01.2014 18:49 )GerdW schrieb:  welches Ergebnis erwartest du bei boolschen Ausdrücken wie diesem:
Code:
y := (a=2) AND (a=3)
???
Diese verwendest du mehrfach in "SUBVI Interpolieren" - und jedesmal wohl falsch...
@Gerd: schau noch mal genau hin, der Vergleich ist a=2 UND b=3.

So, und jetzt noch eine Korrektur deiner VIs für den Fall 6 & 4 Werte pro Stunde. Die anderen Cases habe ich mir gespart und noch nicht angerührt. Da darfst du erstmal die Verbesserungsvorschläge von Gerd einarbeiten.
Prinzipiell musst du dir dafür ein allgemeineres Konzept überlegen, es kann nicht sein, dass du jeden Fall einen eigenen Case programmierst.

Gruß, Jens


RE: Lastprofile interpolieren - GerdW - 04.01.2014 22:13

Hallo,

danke an Jens für die Korrektur...

Noch ein Nachtrag zu meinem Upload: man kann IndexArray natürlich noch aufziehen, dann braucht man nicht mehrere dieser Funktionen in einem Case.


RE: Lastprofile interpolieren - David_Lab - 10.01.2014 19:50

Guten Abend zusammen,

erst mal möchte ich mich Herzlichen Bedanken für die Tipps und Ratschläge, die mir sehr weiter geholfen haben!
Ich habe es mittlerweile hinbekommen für das Interpolieren eine Allgemeine Lösung zu finden, welche die doch recht statische Lösung, die sich nur auf eine Hand voll Lastprofile beschränkt hat, ablöst.
Dabei ist mir aber aufgefallen, dass die Lastprofile sehr oft Fehler enthalten bzw. Datensätze fehlen und deshalb habe ich ein SubVI geschrieben welches diese Fehler erkennt und verbessert. Zudem möchte ich wenn die Sommerzeit in Profilen vorhanden ist diese durch die Winterzeit ersetzen. Dafür habe ich mir überlegt eine Referenz Zeitachse zu erstellen und jeden einzelnen Wert in meinem Lastprofil auf seine Richtigkeit zu untersuchen. Ich denke das ganze würde auch funktionieren, nur und jetzt kommt meine eigentliche Frage: Labview erstellt automatisch das Referenz Zeitprofil auch mit Sommer und Winterzeit und deshalb klappt das Ganze leider doch noch nicht so richtig. Wenn z.B. Zeitwerte im Profil fehlen soll die zugehörige Einspeisung 0 sein.

Könnt ihr mir einen Tipp geben wie ich in das Referenz Zeitarray nur Winterzeit rein bekomme?
Ich habe schon so einiges ausprobiert mit Weltzeit etc. aber irgendwie klappt das Ganze nicht.
Evtl. gibt es ja auch noch eine einfachere Lösung ein Lastprofil auf Fehler zu untersuchen und Lücken zu schließen?
Für die einzelnen Lastprofile Verbrauch, PV und Wind kann das angehängte Lastprofil genutzt werden, in dem sich auch noch einige Lücken befinden.

Grüße und einen schönen Abend noch!
David


RE: Lastprofile interpolieren - GerdW - 10.01.2014 20:53

Hallo David,

zum subVI: was soll das hier bewirken?
[attachment=47992]
Erstens benötigst du keine FOR-Loop, wenn dich nur das Ergebnis der letzten Iteration interessiert.
Zweitens greifst du bei der letzten Iteration auf ein ungültiges Arrayelement zu...

Zitat:Könnt ihr mir einen Tipp geben wie ich in das Referenz Zeitarray nur Winterzeit rein bekomme?
Ich habe schon so einiges ausprobiert mit Weltzeit etc. aber irgendwie klappt das Ganze nicht.
Weltzeit/UTC kennt keine Sommerzeit, ist also das, was du haben willst. Wie kommst du darauf, dass dort trotzdem Sommerzeit verwendet wurde?
Bevor entsprechende Nachfragen kommen: Du solltest beachten, dass LabVIEW in Anzeigen automatisch die lokale Zeitzone nutzt! Selbst wenn du intern mit UTC arbeitest, wird die Anzeige trotzdem deine lokale Zeitzone beachten - und damit wiederum Sommerzeit einrechnen...


RE: Lastprofile interpolieren - David_Lab - 11.01.2014 13:17

Hallo Gerd,
sorry ich habe ausversehen irgendwie eine alte Version von meinem SubVi angehängt daraus folgte auch die Komische Schleife.
Anbei nochmal das richtige.
Mit der Weltzeit das verstehe ich irgendwie immer noch nicht richtig scheinbar mache ich etwas falsch. Wenn ich die Zeitzone auch an meinem Computer auf UTC stelle wird mir nur ein Fehler an Index 18 (bitte neues Lastprofil benutzen) gemeldet, da dort eine Uhrzeit fehlt. Zudem sind auch wie du schon erwähnt hast alle Anzeigeelemente richtig. Wenn ich allerdings die Zeitzone wieder normal auf UTC+1 stelle, stimmt die Anzeige, obwohl ich die Zeitachse alle mit UTC belegt haben(glaube ich zumindest Big Grin) nicht mehr sprich es wird Sommer und Winterzeit (Winter auf Sommer Index 8166 in Zeitreferenz; Sommer auf Winter Index 28995 in Zeitreferenz) angezeigt, was jetzt ja nicht so schlimm wäre, allerdings rechnet Labview intern auch damit, sodass ich sehr viele Fehlermeldungen(„Fehlerarray Indexangabe“) bekomme. Was ich auch nicht verstehe, warum Labview das Lastprofil mit Sommer und Winterzeit anzeigt, obwohl im hinterlegten Lastprofil diese gar nicht berücksichtig werden.
Es muss doch möglich sein auch ohne die Zeitzone am PC auf UTC zu stellen, dass Labview intern mit UTC arbeitet?
Gruß David