WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Gekoppelte Energiespeicher simulieren

 

Osterwma
Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2015, 19:44     Titel: Gekoppelte Energiespeicher simulieren
  Antworten mit Zitat      
Hallo Zusammen,

ich habe zwei Energiespeicher, welche durch entsprechende Produzenten geladen werden und durch einen entsprechenden Verbraucher entladen werden können. Die Speicher sind dabei durch einen maximalen bzw. minimalen Ladestand begrenzt.
Mein Modell sieht dazu bisher so aus:
Code:

Produzent1 = randi([0, 30],1,100);
Produzent2 = randi([0, 30],1,100);
Verbraucher1 = randi([0, 30],1,100);
Verbraucher2 = randi([0, 30],1,100);
 


Code:
Bat_max = 58000; % Storage Maximum
Bat_min = 0;     % Storage Minimum
Akt_Bat_0 = 58000;   % Starting Load


Stromspeicher
Code:
for I = 2:numel(W_el)
obj.Akt_Bat(I)= obj.Akt_Bat(I-1)+Produzent1(I)-Verbraucher1(I);
obj.Akt_Bat(I) = min(obj.Akt_Bat(I), Bat_max);
obj.Akt_Bat(I) = max(obj.Akt_Bat(I), Bat_min);
end
 


Code:
HeadStor_max = 100000; % Storage Maximum
HeadStor_min = 0;     % Storage Minimum
HeadStor_0 = 100000;  % Starting Load


Warmwasserspeicher
Code:
for J = 2:numel(W_Col)
obj.Akt_HeadStor(J)= obj.Akt_HeadStor(J-1)+Produzent2(J)-Verbraucher2(J);
obj.Akt_HeadStor(J) = min(obj.Akt_HeadStor(J), HeadStor_max);
obj.Akt_HeadStor(J) = max(obj.Akt_HeadStor(J), HeadStor_min);
end



Jetzt möchte ich hier folgende Erweiterung implementieren:

Wenn der Stromspeicher 100% geladen ist (in dem Fall 58000), soll der produzierte Strom, welcher bisher einfach im Nichts verschwindet, dem Warmwasserspeicher zugeführt werden.

Ich stehe da gerade komplett auf dem Schlauch, wie ich eine entsprechende If Bedingung hier einbauen könnte...

Könnt ihr mir hierbei weiterhelfen?

Vielen Dank im Voraus.

Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 15.03.2015, 00:16     Titel:
  Antworten mit Zitat      
Hallo Martin,

Kannst du Testdaten angeben? Ich kann ohne schwer nachvollziehen was genau geschieht.

Von Indizes in Variablenbezeichnern ist abzuraten. Stattdessen besser "richtige" Indizes verwenden:
Code:
Produzent(1,:) = randi([0, 30],1,100);
Produzent(2,:) = randi([0, 30],1,100);
Verbraucher(1,:) = randi([0, 30],1,100);
Verbraucher(2,:) = randi([0, 30],1,100);

% ...

for I = 2:numel(W_el)
    obj.Akt_Bat(I)= Produzent(1,I)-Verbraucher(1,I);
    % ...
end
 

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Osterwma
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.03.2015, 13:36     Titel:
  Antworten mit Zitat      
Hi Seban,

danke für die erste Rückmeldung. Deinen Vorschlag werde ich bei mir einbeziehen. Dadurch, dass es mit etwas mehr Implementierungsaufwand verbunden ist, hab ich im Folgenden nochmal nach alter Verfahrensweise den Code belassen:

Der folgende Code ist soweit lauffähig und du musst nur die Main_Speicherkopplung laufen lassen, um die Speicherstände zu berechnen.

Code:
clear;
%Main_Speicherkopplung

Produzent1 = randi([0, 300],1,100);
Produzent2 = randi([0, 300],1,100);
Verbraucher1 = randi([0, 300],1,100);
Verbraucher2 = randi([0, 300],1,100);

stor = Testdatei_Speicherkopplung;
% Elektrischer Speicher
%Input
Bat_max = 10000; % Storage Maximum
Bat_min = 0;     % Storage Minimum
Akt_Bat_0 = 5000;   % Starting Load

stor.cAkt_Bat(Akt_Bat_0, Produzent1, Verbraucher1, Bat_max, Bat_min)
Akt_Bat = [stor.Akt_Bat];


% Warmwasserspeicher Speicher
%Input
HeadStor_max = 10000; % Storage Maximum
HeadStor_min = 0;     % Storage Minimum
HeadStor_0 = 5000;  % Starting Load


stor.cAkt_HeadStor(Produzent2, Verbraucher2, HeadStor_0, HeadStor_max, HeadStor_min)
Akt_HeadStor = [stor.Akt_HeadStor];



Code:
classdef Testdatei_Speicherkopplung < handle
    %UNTITLED Summary of this class goes here
    %   Detailed explanation goes here
   
    properties
        Produzent1;     % Eingehende Produktion
        Verbraucher1;   % Elektrische Nachfrage
        Stor_Vol;       % Batteriekapazität
        Akt_Bat;        % Aktuelle Batterieladung
        Akt_Bat_0;      % Startkapaziät
       
        Produzent2;     % Eingehende Produktion
        Verrbaucher2;   % Nachfrage
        Stor_Vol_Head;  % Speicherkapazität
        Akt_HeadStor;   % Aktuelle Warmwasserspeicherladung
        HeadStor_0;     % Startkapazität
       
       
       
   
    end
   
    methods
        function obj = e(Produzent1, Produzent2, Verbraucher1, Verbraucher2, Akt_Bat, Akt_Bat_0, Bat_max, Bat_min, Akt_HeadStor, HeadStor_0, HeadStor_max, HeadStor_min)
        obj.Produzent1 = Produzent1;
        obj.Verbraucher1 = Verbraucher1;
        obj.Akt_Bat = Akt_Bat;
        obj.Akt_Bat_0 = Akt_Bat_0;
        obj.Bat_max = Bat_max;
        obj.Bat_min = Bat_min;
        obj.Produzent2 = Produzent2;
        obj.Verbraucher2 = Verbraucher2;
        obj.Akt_HeadStor = Akt_HeadStor;
        obj.HeadStor_0 = HeadStor_0;
        obj.HeadStor_max = HeadStor_max;
        obj.HeadStor_min = HeadStor_min;
        obj.HeadStor_perf = HeadStor_perf;
       
        end
        % Batteriespeicher
        function obj = cAkt_Bat(obj, Akt_Bat_0, Produzent1, Verbraucher2, Bat_max, Bat_min)
            obj.Akt_Bat = [Akt_Bat_0, zeros(1, numel(Produzent1)-1)];
for I = 2:numel(Produzent1)
obj.Akt_Bat(I)= obj.Akt_Bat(I-1)+Produzent1(I)-Verbraucher2(I);
obj.Akt_Bat(I) = min(obj.Akt_Bat(I), Bat_max);
obj.Akt_Bat(I) = max(obj.Akt_Bat(I), Bat_min);
end  
        end
       
        % Warmwasserspeicher
        function obj = cAkt_HeadStor(obj, Produzent2, Verbraucher2, HeadStor_0, HeadStor_max, HeadStor_min)
            obj.Akt_HeadStor = [HeadStor_0, zeros(1, numel(Produzent2)-1)];
for J = 2:numel(Produzent2)
obj.Akt_HeadStor(J)= obj.Akt_HeadStor(J-1)+Produzent2(J)-Verbraucher2(J);
obj.Akt_HeadStor(J) = min(obj.Akt_HeadStor(J), HeadStor_max);
obj.Akt_HeadStor(J) = max(obj.Akt_HeadStor(J), HeadStor_min);
end  
        end            
    end
end

 



Vielen Dank nochmal.

Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 16.03.2015, 15:51     Titel:
  Antworten mit Zitat      
Hallo Martin,

Meine Idee wäre es, der Klasse eine Property Bat2Head hinzu zu fügen, die speichert wie viel Energie von der Batterie zum Warmwasserspeicher überführt wird.

In der Klassenfunktion des Batteriespeichers
Code:
obj.Akt_Bat(I) = min(obj.Akt_Bat(I), Bat_max);
durch
Code:
if obj.Akt_Bat(I) > Bat_max
    obj.Bat2Head(I) = obj.Akt_Bat(I) - Bat_max;
    obj.Akt_Bat(I) = Bat_max;
end
ersetzen.

In der Klassenfunktion des Warmwasserspeichers
Code:
obj.Akt_HeadStor(J)= obj.Akt_HeadStor(J-1)+Produzent2(J)-Verbraucher2(J) + obj.Bat2Head(J);
statt
Code:
obj.Akt_HeadStor(J)= obj.Akt_HeadStor(J-1)+Produzent2(J)-Verbraucher2(J);


Bat2Head muss dann noch mit Nullen vorbelegt und an die Funktionen übergeben werden.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Osterwma
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2015, 13:17     Titel:
  Antworten mit Zitat      
Hi Seban,

vielen Dank für die schnelle Antwort.

Funktioniert super!

Viele Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Osterwma
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2015, 15:22     Titel:
  Antworten mit Zitat      
Eine Sache ist mir jetzt doch nochmal eingefallen.

Wie könnte ich den jetzt rausbekommen, was tatsächlich von dem einen Speicher in den anderen übertragen wurde?

Da Bat2Head ja nur die maximal mögliche Menge angibt.

Vielen Dank nochmal.

Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 18.03.2015, 01:47     Titel:
  Antworten mit Zitat      
Hallo Martin,

In die Klassenfunktion des WWS ebenfalls eine if-Abfrage einfügen, die prüft, ob der WWS voll ist und in der in einer Variable gespeichert wird wie viel Energie aus der Batterie in den WWS überführt wurde.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Apocalypto
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 25.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2015, 15:18     Titel:
  Antworten mit Zitat      
Hallo Zusammen,

ich bin gerade an einer ähnlichen Problemstellung, in der ich einen Energiespeicher am Regelenergiemarkt betrachte.

Was ich in meinem Programm machen möchte ist folgendes:


Aktuell läuft mein Programm mit einem Speicher so ähnlich wie es in dem Thread auch ist. Ich habe einige Benutzereingaben zur Batteriegröße, Wirkungsgrad der Batterie etc.

Diese Inputs werden an eine Klassendatei übergeben wo die eigentlichen Bedingungen und Berechnungen stattfinden. Das läuft bisher auch alles einwandfrei!

Ich möchte das Programm jetzt erweitern und anhand einer Benutzereingabe am Anfang des Programmes abfragen wie viele Energiespeicher vorhanden sein sollen und für jeden Speicher dann eine eigene Funktion erstellen. Die Speicher sollen in diesem Fall alle parallel Betrieben werden. D.h. also das was bisher mit einem Speicher simuliert wurde, soll jetzt auf mehrere kleine aufgeteilt werden um im nächsten Schritt verschiedene Anfangsbedingungen für jeden einzelnen Speicher festzulegen.

Ist sowas übernhaupt umsetzbar, und wenn ja, wie wäre der Ansatz dafür?

Oder wäre es besser z.B. in der Klassenfunktion des Batteriespeichers mehrere Speicher parallel zu berechnen? Wenn ja, wie könnte das umgesetzt werden?

Vielen Dank schonmal!

Gruß

Apo
Private Nachricht senden Benutzer-Profile anzeigen
 
Apocalypto
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 25.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2015, 23:11     Titel:
  Antworten mit Zitat      
Habs jetzt so gelöst, dass ich um die Klassenfunktion eine for Schleife gelegt habe. Die Schleifendurchläufe entsprechen der Anzahl der Energiespeicher. Die Berechnung wird anhand von Benutzereingaben so oft wiederholt, wie Speicher vorhanden sind und schreibt die neuen Werte in eine neue Spalte Smile

Nach folgendem Schema:

Code:
function obj = cAkt_Bat(obj, Akt_Bat_0, Produzent1, Verbraucher2, Bat_max, Bat_min)
obj.Akt_Bat = [Akt_Bat_0, zeros(1,numel(Produzent1)-1)];
for J = 1:Speicheranzahl    
for I = 2:numel(Produzent1)
obj.Akt_Bat(I,J)= obj.Akt_Bat(I-1,J)+Produzent1(I,J)-Verbraucher2(I,J);
obj.Akt_Bat(I,J) = min(obj.Akt_Bat(I,J), Bat_max);
obj.Akt_Bat(I,J) = max(obj.Akt_Bat(I,J), Bat_min);
end  
end
end


[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke]
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.