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

Code für Regelung mit Aufheizung/Abkühlung & Hysterese

 

matlab123
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2012, 23:47     Titel: Code für Regelung mit Aufheizung/Abkühlung & Hysterese
  Antworten mit Zitat      
Hallo,
ich habe eine Frage zu der Umsetzung einer Heizungsregelung in MATLAB-Code, den ich in einen Function-Block in Simulink einbinden will. Da ich nur Hilfe bei dem Code benötige, da dieser dann einfach in den Block gesetzt wird, hoffe ich, dass der Thread an der richtigen Stelle ist.
Also, zum Sachverhalt: Plan ist, eine „typische“ Heizungsregelung zu programmiren, d.h. sie soll unterhalb einer bestimmten Temperatur anspringen und beim Erreichen einer bestimmten Temperatur abschalten. Damit dies nicht permanent um den Sollwert pendelt und die Heizung alle paar Sekunden anspringt, soll eine Hysterese von beispielsweise 5°C vorhanden sein.
Im einfachen Fall ist der Verlauf ja ungefähr wie im folgenden Bild:

Beim Erreichen der Einschalttemperatur (so um die 38°C) springt die Kiste an und heizt auf den Sollwert von etwa 43°C und geht dann wieder aus, bis die Abkühlung wieder auf 38°C ist.

Mein gewünschtes Modell ist dem obigen identisch, nur soll auch der Aufheizvorgang betrachtet werden. Die Temperatur startet bei 0°C, bzw. auf jeden Fall unterhalb dem unteren Sollwert, steigt dann auf den oberen Sollwert, die Heizung geht aus, Temperatur sinkt z.B. um 5°C, Heizung springt wieder an, Aufheizen auf den Sollwert, usw. Ich habe gerade kein passenden Bild, aber es ist ja dem obigen identisch außer das „links“ die Temperaturkurve erst mal von weiter unten kommt.
Meine bisherigen Überlegen lauten ungefähr so:
if (T<=38)
P=17
elseif (T>43)
P=0
else
P=17
Anfangs machte das für mich noch Sinn, da zumindest alle möglichen Fälle abgedeckt sind. Woran es nun aber scheitert, ist das „Nicht-Heizen“ beim Fallen der Temperatur. Ich denke, alle „positiven“ Steigungen sind mit dem Code abgedeckt, oder? Nur fehlt mir der entscheidende Punkt, der das Nicht-Aufheizen zwischen den beiden Temperaturen ergibt.
Ich hoffe, ich konnte mein Problem verständlich erläutern, ansonsten bitte eben melden, dann formuliere ich das Problem anders bzw. mache noch eine Zeichnung oder Ähnliches.
Ansonsten wäre es super, wenn ihr mir helfen könntet, ich habe schon einige Stunden überlegt und rumgesucht, aber nicht wirklich etwas gefunden.
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2012, 10:13     Titel:
  Antworten mit Zitat      
genau für solche Probleme hat man stateflow entwickelt.

Wenn du das nicht nehmen willst:

Code:


if T < 38 & s_in = 0
s_out = 1;
elseif T > 43 & s_in = 1
s_out = 0;
else
s_out = s_in
end

P = 17*s_out;

 


Eingänge des Blockes wären T und s_in. Um den Zustand s zu speichern bräuchtest du noch ein Unit delay Block.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2012, 17:11     Titel:
  Antworten mit Zitat      
Hey Thomas, vielen Dank für deine schnelle Antwort.

Nach Möglichkeit würde ich gerne auf Stateflow verzichten, da mir das Einarbeiten in Matlab und Simulink schon nicht so einfach fällt, und meine Aufgabe glaube ich nicht ganz so aufwendig ist.

So ganz weiss ich leider noch nicht, wie ich deinen geposteten Code anwenden kann. Den Code ansich könnte ich ja einfach in den function-Block packen. T als Eingang ist klar, der würde in meinem Fall einfach aus dem Integratorglied kommen. Aber was genau wäre dann s_in, müsste ich dafür einen Block nehmen oder woher kommt der Wert dafür? Und wie genau müsste ich den Unit delay Block einbinden? In dem Buch das ich habe, hört es sich so an als ob der Unit Delay Block das Eingangssignal, also zB. T verzögert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2012, 10:42     Titel:
  Antworten mit Zitat      
s soll die Zustandsvariable des systems sein

s = 0 bedeudet Heizung ist aus
s = 1 bedeudet Heizung ist an

der Unit delay-Block hat als Eingansvariable s_out und als Ausgangsvariable s_in. Der function-Block hat als Eingangsgrößen Tund s_in und als Ausgangsgrößen s_out und optional P = 17*s_out.

Im Unit delay-Block wird somit immer der aktuelle Zustand des Systems gespeichert.In dem function-Block wird aus dem aktuellen Zustand und der Temperatur der Zustand im nächsten Zeitschritt berechnet. Ich hoffe das war einigermaßen verständlich.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2012, 15:25     Titel:
  Antworten mit Zitat      
Hey Thomas, vielen Dank wieder für deine schnelle und ausführliche Antwort. das "s" definiert also nur, ob das System an oder aus ist, also ist der Unit Delay Block quasi ein Schalter mit 2 Zuständen?

Ich habe mich gerade einmal drangemacht, das Modell vereinfach in Simulink nachzubauen. Beim Ausführen der Simulation kam folgender Fehlercode:
Code:
Parse error: The expression to the left of the equals sign is not a valid target for an assignment.

Function 'Leistung' (#55.60.61), line 3, column 18:


Hier einmal ein Screenshot von dem Modell, dem Code und der Fehlermeldung:
http://www10.pic-upload.de/17.11.12/7i35s7gnps8a.jpg

Sind denn wenigstens schon die Ein-und Ausgänge von den Blöcken richtig verknüpft?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2012, 21:13     Titel:
  Antworten mit Zitat      
sieht soweit richtig aus. Beim Vergleich müssen natürlich 2 Gleichheitszeichen stehen. also: if s_in == 0 etc. Da hab ich mich vertippt.
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2012, 21:47     Titel:
  Antworten mit Zitat      
Hey, alles klar, vielen Dank nochmals. Bisher hatte ich nur "einfache" if/else Funktionen, sodass ich nie doppelte = Zeichen gebraucht habe. Der Regelkreis scheint zumindest schon mal so weit zu funktionieren, dass der Schalter anspringt. Aber den Abkühlungs-/Auheizungsverlauf wie in dem Beispiel bekomme ich so noch nicht hin, da muss ich wohl noch schauen wie sich das mit den Verlusten verhält, weil es ja eigentlich nur an denen liegen kann. Ich poste dann weitere Ergebnisse gerne hier rein!

edit: Was mir gerade noch einfällt: Macht es Sinn in dem Unit Delay Block einen Anfangswert ("Initial condition") zu setzen. Im Prinzip soll die Hiezung ja "direkt" enspringen und anfangen aufzuheizen. Wäre der Startwert dann in dem Falle 1?

edit2: Was mir noch aufgefallen ist, in meinem Modell zeigen alle Scopes, egal ob für T oder die Leistung erst knapp 2,5 Sekunden vor dem Simulationsende etwas an, unabhängig davon ob ich zB 10 Sekunden oder 100 Sekunden simuliere. Modell kann ich gerne per PN verschicken!
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 08:41     Titel:
  Antworten mit Zitat      
zu 1) Ja initial condition gleich 1 wäre in dem Fall richtig.

zu 2) den Fehler hab ich auch manchmal. Hab noch nicht raus gefunden woran das liegt.
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 14:49     Titel:
  Antworten mit Zitat      
Hey Thomas, also zu dem zweiten Punkt habe ich glaube ich eine Lösung. Das Problem scheint zu sein, dass der Scope standardmässig nur die letzten 5000 Werte darstellt und den Rest vorher abschneidet. (Wobei ich mich frage, wie viele Punkte das Programm pro Sekunde auswertet) Daher muss man den Scope öffnen, dann unter "Parameters"->"History" den Haken bei "Limit data points to last" rausnehmen. Dann zeigt der Scope bei mir zumindest den gesamten Bereich an, auch wenn sich dann nur ein gelber Block ergibt, hier als Beispiel eine Simulation über 10 Sekunden:

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.