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

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 17.09.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 15.11.2012, 23:47
Titel: Code für Regelung mit Aufheizung/Abkühlung & Hysterese
|
 |
|
 |
|
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.
|
|
|
|
|
Thomas84 |

Forum-Meister
|
 |
Beiträge: 546
|
 |
|
 |
Anmeldedatum: 10.02.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 16.11.2012, 10:13
Titel:
|
 |
genau für solche Probleme hat man stateflow entwickelt.
Wenn du das nicht nehmen willst:
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
|
|
|
matlab123 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 17.09.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 16.11.2012, 17:11
Titel:
|
 |
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.
|
|
|
Thomas84 |

Forum-Meister
|
 |
Beiträge: 546
|
 |
|
 |
Anmeldedatum: 10.02.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 17.11.2012, 10:42
Titel:
|
 |
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
|
|
|
matlab123 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 17.09.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 17.11.2012, 15:25
Titel:
|
 |
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:
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?
|
|
|
Thomas84 |

Forum-Meister
|
 |
Beiträge: 546
|
 |
|
 |
Anmeldedatum: 10.02.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 17.11.2012, 21:13
Titel:
|
 |
sieht soweit richtig aus. Beim Vergleich müssen natürlich 2 Gleichheitszeichen stehen. also: if s_in == 0 etc. Da hab ich mich vertippt.
|
|
|
matlab123 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 17.09.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 19.11.2012, 21:47
Titel:
|
 |
|
 |
|
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!
|
|
|
Thomas84 |

Forum-Meister
|
 |
Beiträge: 546
|
 |
|
 |
Anmeldedatum: 10.02.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 20.11.2012, 08:41
Titel:
|
 |
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.
|
|
|
matlab123 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 17.09.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 20.11.2012, 14:49
Titel:
|
 |
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:
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|