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

Funktionsweise Data Store /read/write/memory

 

Tweaked
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2017, 20:55     Titel: Funktionsweise Data Store /read/write/memory
  Antworten mit Zitat      
Hallo,

kann mir Jemand die Funktionsweise der Data Store Blöcke erklären?

ich möchte jede Sekunde den Wert 5 einspeisen, sodass z.B. nach 10 Sekunden im Data Store read der Wert 50 erscheint.

Wie ist das möglich?

Was muss ich vor den Write Block schalten, damit er immer eine Summe bildet?

Natürlich soll dies begrenzt sein. Mit dem Memory Block geht es leider nicht.

Ich möchte Werte hinzufügen und auch auch wieder entfernen, wie in einem Akku.

Viele Grüße

Tweaked
Private Nachricht senden Benutzer-Profile anzeigen


Tweaked
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 11:56     Titel: Puuuh
  Antworten mit Zitat      
Noch nie Jemand mit gearbeitet?
Private Nachricht senden Benutzer-Profile anzeigen
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 11:59     Titel:
  Antworten mit Zitat      
Hallo,

um zu wissen, was der Block macht, lohnt sich immer ein Blick in die Doku: Data Store.

Demnach kann man diesen Speicher einfach an unterschiedlichen Stellen beschreiben und auslesen. Wenn du also den Wert 5 speichern willst, muss am Eingang von "Data Store Write" eine 5 anliegen. Das selbe gilt für den Wert 50 und andere Werte. D.h. du brauchst davor ein anderes System, das die 5 zur 50 anwachsen lässt. Dafür eignen sich am besten Integratoren, die das was am Eingang liegt integrieren (aufsummieren).

Nimm also einen Constant Block mit dem Wert 5 als Eingang für den Integrator, dann hast du nach 10 Sekunden den Wert 50 am Ausgang.

"Leeren" kannst du den Integrator, wenn du eine negative Zahl an den Eingang legst. Du kannst den Integrator auch durch ein externes Signal wieder auf den Ausgangswert (z.B. 0) zurücksetzen.

Gruß Tom
 
Tweaked
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 12:11     Titel: Werds gleich probieren
  Antworten mit Zitat      
Ah danke dir für deine Antwort!

Ich werde es nachher mal ausprobieren Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweaked
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 14:31     Titel: Hat geklappt, aber...
  Antworten mit Zitat      
Okay hat schonmal funktioniert.

Ich möchte damit eine einfache Batterie basteln.

Ich habe mit If-Bedingungen aufgestellt, dass wenn die die Batterie leer ist, sie geladen werden soll und wenn sie voll ist, kann sie entladen werden usw..

Ich habe jetzt nun das Problem:

Der maximale Wert soll 300 nicht überschreiten, da dieser im Grunde die Kapazität der Batterie darstellt. Jetzt ist im Data Store z.B. ein Wert von 298 abgespeichert, dann kommt jetzt noch der Wert 5 dazu und ergibt aber dann insgesamt 303. Somit wäre der Wert über den 300 aber leider nicht genau auf den 300. Er wechselt zwar die Bedingung, aber dann ist die Batterie mit 303 geladen und nicht mit 300.

Gibt es die Möglichkeit, dass man den letzten Wert aufsplittet? Z.B. 298 + 5 wären ja normalerweise 303. Da ich aber Punktgenau die 300 erreichen möchte, könnte man nicht die 5 aufsplitten z.B. 298 + 2 = 300 und Rest 3 die dann woanders durchfließen?

Kann mir Jemand helfen?

Viele Grüße

Tweaked
Private Nachricht senden Benutzer-Profile anzeigen
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 14:52     Titel:
  Antworten mit Zitat      
Hallo,

du kannst direkt im Integrator Block den Haken "Limit Output" setzen und bei "Upper saturation limit" anstelle von "Inf" (was für unendlich steht) dein gewünschter Wert 300 eintragen. Dann integriert er nur bis 300 und geht nicht drüber hinaus.

Gruß Tom
 
Tweaked
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 15:13     Titel:
  Antworten mit Zitat      
Ok danke,

was macht er aber mit den restlichen 3?

Werden die dann vernichtet? Dieser Überschuss an Strom sollte dann eingespeist werden. Also der Wert darf nicht verloren gehen.

Oder stoppt der Integrator bei 300. Die Regelung sieht ah 300 sind erreicht, dann nimmt er die übergebliebenen 3 und schiebt die dann woanders lang?

Viele Grüße

Tweaked
Private Nachricht senden Benutzer-Profile anzeigen
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 16:03     Titel:
  Antworten mit Zitat      
Hallo,

also aus Simulink-Sicht existieren die restlichen 3 garnicht. Simulinkt integriert "y=5" am Eingang so lange, bis der Wert 300 erreicht ist und hört dann auf.
Es entsteht also eine kontinuierliche Gerade "Y=5x".

So sollte es doch auch sein, also das die Baterrie kontinuierlich und nicht sprungförmig aufgeladen wird, oder?

Gruß Tom
 
Tweaked
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 16:57     Titel: ...
  Antworten mit Zitat      
Ich habe im Grunde Messwerte für jede Sekunde.

In der 1 Sekunde kommt z.B. ein Wert 5, dann ein Wert von 8, dann ein Wert von 12 und wieder ein Wert von 7. Nach 4 Sekunden ergibt das 5 + 8+ 12 + 7 = 32

Wenn die Batterie jetzt nur maximal 30 aufnehmen kann, käme in der 3 Sekunde der Wert 25 raus. In der vierten Sekunde kommt dann aber die 7 dazu, also 25 + 7 =32. Die 30 ist überschritten, wobei ich aber möchte, dass er die 7 nimmt, aufsplittet, sodass genau die 30 erreicht werden. Der Rest wäre in diesem Beispiel dann 2, da 32 - 30 = 2 sind. Der Restwert 2 soll aber dann z.B. ins Netz eingespeist werden, da die Energie nicht mehr von der Batterie aufgenommen werden kann. Die Energie geht ja nicht verloren. Der Restwert soll dann nicht in die Batterie gehen, sondern dann einfach woanders hin, sodass aber die Gesamtbilanz wieder stimmt.


Sonst kommt nachher insgesamt weniger raus, als reingesteckt wurde.

Viele GRüße

Tweaked
Private Nachricht senden Benutzer-Profile anzeigen
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.03.2017, 08:52     Titel:
  Antworten mit Zitat      
Hallo,

ich versteh schon was du meinst. Ist es aber nicht so, dass wenn dein Netz beispielweise 5A zur Verfügung hat und deine Batterie nurnoch 3A benötigt, dass dann der Rest automatisch im Netz bleibt, weil die restlichen 2A einfach nicht benötigt werden?
Oder möchtest du deine Batterie treppenförmig aufladen? Also wenn du den Wert 5 hast, dass dieser Wert dann direkt in der Batterie gespeichert ist?

Wenn du das so möchtest, müsstest du eher den Block "Sum" verwenden, wobei der erste Eingang der Wert ist, den du abspeichern möchtest und der zweite Eingang wird mit dem dem Ausgang verbunden, wobei dazwischen z.B. ein Memory Block hin sollte, denn sonst entsteht eine algebraische Schleife.
Um zu detektieren, wann oder ob der Speicher voll ist, kannst du beispielsweise den "Compare to Constant" Block oder "Relational Operator" Block verwenden.

Gruß Tom
 
Tweaked
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.03.2017, 10:19     Titel:
  Antworten mit Zitat      
Hallo,

danke für deine Hilfe Tom. Ich bin dir sehr dankbar.

Ich habe im Grunde eine Regelung erstellt.

Ich bekomme Strom über PV-Anlage. Benötige ich etwas im Haushalt, so wird dieser teilweise dann auch benutzt. Wenn ein Überschuss vorhanden ist, soll die Batterie zusätzlich geladen werden. Ist die Batterie aber voll, wird automatisch auf die Einspeisung ins Netz umgeschaltet.

Diese Regelung ( IF-Bedingungen) habe ich realisiert.

Da steht z.b. drin "Wenn Batteriekapazität <= Batterieladezustand, dann stoppe die Ladung für die Batterie. Solange der Batterieladezustand aber kleiner ist lädt er. Ist alles kein Problem.

Wenn der Batterieladestand aber die Batteriekapazität übersteigt z.B. die Batteriekapazität hat maximal 30 und der Batterieladestand hat 28 und jetzt kommt aber noch der Wert 5 dazu sind es 33. Und nach der Regelung, wenn man oben in der Regelung schaut, schaltet er im Grunde erst bei 33 um, er steckt also die ganze 5 noch in die Batterie und schaltet erst dann die Batterieladung ab, obwohl aber der Wert 2 in die batterie soll und die 3 müsste eingespeist werden. Es kann sein, dass eine Zahl kommt die genau die 30 trifft, das wäre perfekt. Wenn aber die 30 überschritten wird wegen der Regelung, stört das nachher aber die Gesamtbilanz.

Die Ladekurve soll ja dann auch nur von 0 bis 30 gehen. Momentan schwirrt sie unter 0 (wegen Entladung) und manchmal über 30 ( wegen Ladung) rum. je nachdem wie groß der letzte Wert war.

Kann man nicht etwas vielleicht in der Regelung ändern?

Ja, die Speicherung kannTreppenförmig erfolgen, da es für jede Sekunde festgelegte messwerte sind.

Viele Grüße

Tweaked
Private Nachricht senden Benutzer-Profile anzeigen
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.03.2017, 14:24     Titel:
  Antworten mit Zitat      
Hallo,

möchtest du die Spaltung des Wertes vor dem Einspeisen in die Batterie machen oder dannach? So wie ich es rauslese eher davor, sodass die Baterie wirklich nie voller wird als es überhaupt möglich ist.
Du könntest also bei jedem Zeitschritt überprüfen, ob der aktuelle Wert, der gerade anliegt, noch in die Batterie passt, durch die einfache Überprüfung:
Code:
if (aktuellerWert > maximaleKapazitaet - aktuelleKapazitaet)

Dabei ist "aktuellerWert" der aktuelle Wert, z.B. 5, "maximaleKapazitaet" ist in deinem Fall 30 und "aktuelleKapazitaet" der Ausgang deines Integrators, z.B. 28.
Wenn die Bedigung nicht zutrifft, wird ganz normal geladen. Sollte die Bedinung zutreffen, speist du einfach nicht den aktuellen Wert in den Integrator (also die 5), sondern nur noch so viel wie reinpasst, also:
Code:
maxWert = maximaleKapazitaet - aktuelleKapazitaet

(nach deinem Beispiel: 3 = 5 - 2)
Und das was übrig bleibt ist ja
Code:
uebrigerWert = aktuellerWert - maxWert

(nach deinem Beispiel: 2 = 5 - 3)
und diesen übrigen Wert möchtest du dann ins Netz speisen, wofür du ja einen weiteren Integrator (Speicher) verwenden kannst.

Gruß Tom
 
A.Rossau
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 03.01.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2023, 19:47     Titel:
  Antworten mit Zitat      
Hi würdes du deinen Entwurf teilen sitze gerade am gleichen Problem Smile
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 - 2024 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.