Hallo, ich habe 1 Heizung, 2 Temperaturen und 2 Pumpen. Also 2 Heizkreise. Ich will jetzt eine Regelung programmieren. Eigentlich gang einfach. Dachte ich am Anfang. Wenn z.B. die Temperatur im ersten Heizkreis kleiner der Mindesttemperatur, dann Heizung an. Pumpe an und aus, um Temperatur dann zwischen Mindest- und Maximaltemperatur zu halten. Wenn Maximaltemperatur überschritten, dann Heizung aus. Das auch im anderen Heizkreis usw.. Jeder Kreis für sich ganz einfach. Jetzt kommen aber Querabhängigkeiten dazu; z.B. wenn beide Mindesttemperaturen unterschritten soll Heizkreis 1 Priorität vor Heizkreis 2 haben. Wenn Heizkreis 2 aber unter Temperatur x, dann soll das passieren usw. Kurzum: Das ganze geht schon irgendwie mit verschachtelten if-else-Prüfungen, wird aber sehr schnell unübersichtlich. Das geschilderte Szenario soll nur ein Beispiel sein. Da kommt einem ja schon etwas Boolsche Algebra in den Sinn. Also jede Menge Gleichungen aufstellen und dann so weit wie möglich vereinfachen. Wie geht man so eine Art von Regelung im__Allgemeinen am besten an?
Dann schreibe Dir alle Möglichkeiten auf und mache daraus eine Statemachine. Außerdem brauchst Du noch einen Regler (PID z.B.) der in den jeweiligen Zuständen die dazu passenden Werte einregelt.
http://de.wikipedia.org/wiki/Fuzzylogik ? Ansonsten schau dir mal Reglungstechnik für MIMO- Systeme an. Übertragungsfunktionen in Matrixen was gibt es schöneres. Oder gleich in den Zustandsraum gehen.
HerrBärt schrieb: > Kurzum: Das ganze geht schon irgendwie mit verschachtelten > if-else-Prüfungen, wird aber sehr schnell unübersichtlich. Das > geschilderte Szenario soll nur ein Beispiel sein. Da kommt einem ja > schon etwas Boolsche Algebra in den Sinn. Also jede Menge Gleichungen > aufstellen und dann so weit wie möglich vereinfachen. > Wie geht man so eine Art von Regelung im__Allgemeinen am besten an? Für dir ein paar Zwischenvariablen ein. Welche 'Zustände' gibt es. Da gibt es die Abhängigkeit, dass Pumpe1 laufen muss und dass Pumpe2 laufen muss. Und es gibt den Fall, dass der Brenner laufen muss. zb (Ich nehm jetzt nur den Trivialfall, den du ausgeführt hast)
1 | //
|
2 | // was gilt für die Pumpen?
|
3 | // (ist mehr oder weniger gleichbedeutend mit:
|
4 | // welcher Heizkreis braucht Energie?)
|
5 | //
|
6 | if( Temperatur1 < Minimum ) |
7 | Pumpe1 = TRUE; |
8 | else if( Temperatur1 > Maximum ) |
9 | Pumpe1 = FALSE; |
10 | |
11 | if( Temperatur2 < Minimum ) |
12 | Pumpe2 = TRUE; |
13 | else if( Temperatur2 > Maximum ) |
14 | Pumpe2 = FALSE; |
15 | |
16 | |
17 | //
|
18 | // Für den Brenner als ganzes ist die Sache recht einfach
|
19 | // Wenn einer der beiden Heizkreise Energie braucht, seine
|
20 | // Pumpe also läuft, dann muss auch der Brenner laufen
|
21 | //
|
22 | if( Pumpe1 || Pumpe2 ) |
23 | Brenner = TRUE; |
24 | else
|
25 | Bremmer = FALSE; |
Und da kannst du jetzt natürlich noch zusätzliche Bedingungen einbauen, die regeln, wann denn noch die jeweiligen Pumpen laufen sollen. Der Trick besteht darin, sich Zwischenzustände zu machen, die aufgrund irgendwelcher Anforderungen auf ein/aus gehen und diesen Zustand dann in der Hierarchie immer weiter in Richtung Quelle (Heizung) tragen. > wenn beide Mindesttemperaturen unterschritten soll Heizkreis > 1 Priorität vor Heizkreis 2 haben. Ok. das heisst also konkret
1 | if( Temperatur1 < Minimum ) |
2 | Pumpe1 = TRUE; |
3 | else if( Temperatur1 > Maximum ) |
4 | Pumpe1 = FALSE; |
5 | |
6 | if( Temperatur2 < Minimum ) |
7 | Pumpe2 = TRUE; |
8 | else if( Temperatur2 > Maximum ) |
9 | Pumpe2 = FALSE; |
10 | |
11 | if( Temperatur1 < Minimum && Temperatur2 < Minimum ) |
12 | {
|
13 | Pumpe1 = TRUE; |
14 | Pumpe2 = FALSE; |
15 | }
|
Und so baust du eben 1 Fall nach dem anderen ein, dessen Aussage darin besteht, ob die Pumpe im zugehörigen Fall laufen muss oder nicht. Wenn da im Endeffekt rauskommt, das gar keine Pumpe laufen muss, dann wertet das der nachfolgende Heizungsabschnitt sowieso so aus, dass er die Heizung dann auch abstellen kann.
Bevor man sowas auf die Hardware loslaesst unf nachher den Durchblick verliert, sollte man sich eine Simulation goennen.
> Außerdem brauchst Du noch einen Regler (PID z.B.) der in den jeweiligen > Zuständen die dazu passenden Werte einregelt. Bei diesem Beispiel glaube ich das nicht, da es ja nur digitale Ausgänge gibt: Heizung und Pumpen sind entweder an oder aus. Wobei das streng genommen technisch sinnvoll wohl nur bei der Heizung wäre; die Pumpen könnte man schon irgendwie "modulierend" betreiben. Nachbar schrieb: > Ansonsten schau dir mal Reglungstechnik für MIMO- Systeme an. > Übertragungsfunktionen in Matrixen was gibt es schöneres. Oder gleich in > den Zustandsraum gehen. Uff: Wenn's darauf hinauslaufen sollte, beschäftige ich mich wohl doch eher mit Bienenzucht oder so ;-) Karl Heinz Buchegger schrieb: >> wenn beide Mindesttemperaturen unterschritten soll Heizkreis >> 1 Priorität vor Heizkreis 2 haben. > > Ok. das heisst also konkret Genau so hatte ich auch angedacht. Aber mit jeder Querabhängigkeit wird quasi immer noch eine weitere Ebene "oben drauf gesattelt" und am Ende hätte man wahrscheinlich alle Variablen x-fach mit 20 && und || Blöcken in einem if () verknüpft. Aber dem kann ich wenigstens folgen, nur ist es sehr unübersichtlich. Hinz oder Kunz schrieb: > Bevor man sowas auf die Hardware loslaesst unf nachher den Durchblick > verliert, sollte man sich eine Simulation goennen. Soll ja nur virtuell sein; ich will etwas lernen. Ohne Simulation wird man dann aber wohl auch so oder so nicht weiterkommen, da man selbst keine Rückkopplung über das Ergbenis und den Einfluß einzelner Komponenten auf das Gesamtsystem bekommt. Womit könnte man denn sowas simulieren (freie Software)?
HerrBärt schrieb: > Genau so hatte ich auch angedacht. Aber mit jeder Querabhängigkeit Mit jeder Querabhängigkeit kommt eine weitere Bedingung dazu. Wobei es natürlich trickreich sein kann, die Reihenfolge der Auswertung der Bedingungen so hinzudrehen, dass sich in Summe das richtige ergibt.
Womit man eine Simulation schreibt? Mit Visual Cplusplus, VisualBasic, Delphi, irgendwas...
HerrBärt schrieb: >> Außerdem brauchst Du noch einen Regler (PID z.B.) der in den jeweiligen >> Zuständen die dazu passenden Werte einregelt. > Bei diesem Beispiel glaube ich das nicht, da es ja nur digitale Ausgänge > gibt: Heizung und Pumpen sind entweder an oder aus. Wobei das streng > genommen technisch sinnvoll wohl nur bei der Heizung wäre; die Pumpen > könnte man schon irgendwie "modulierend" betreiben. > Für diesen Fall ist das wohl "overkill" nur kann der PID ja auch weniger :-D Und wenn man einmal eine sinnvolle Codebasis hat erspart man sich bei neuen Projekten das Rad mehrfach neu zu erfinden ... Ich würde soweit gehen das ganze objektorientiert zu implementieren und die einzelnen Zustände in eigenen Klassen zusammenzufassen inklusive der Transitionen. Karlheinz hat den "Klassiker" gewählt der im Grunde genommen das gleiche abbildet. Aber egal wie es implementiert wird um die Zusammenstellung der einzelnen Zustände und deren Transitionen kommt niemand herum !
Siebzehn mal Fuenfzehn schrieb: > Womit man eine Simulation schreibt? Mit Visual Cplusplus, VisualBasic, > Delphi, irgendwas... Ich soll also selber eine Software schreiben, die meine selber geschriebene Software simuliert und damit testet??? Also da habe ich dann aber doch ganz andere Ansichten, was Ergebisqualität betrifft. Vom Aufwand mal ganz abgesehen. Ich dachte da eher so an Software wie LTSpice oder Simulink, wobei Letztere ja nicht frei ist. cppler schrieb: > Karlheinz hat den "Klassiker" gewählt der im Grunde genommen das gleiche > abbildet. > Aber egal wie es implementiert wird um die Zusammenstellung der > einzelnen Zustände und deren Transitionen kommt niemand herum ! Ja, irgendwie sind die Ansätze ja schon ähnlich und müssen es ja auch sein. Ich dachte nur, es gibt mittlerweile "modernere" Varianten, dies zu tun. Und ja: Um das Zusammenstellen der Variablen und das Aufstellen von Zusammenhängen kommt man niemals rum!
HerrBärt schrieb: > Wenn z.B. die Temperatur im ersten Heizkreis kleiner der > Mindesttemperatur, dann Heizung an. Pumpe an und aus, um Temperatur dann > zwischen Mindest- und Maximaltemperatur zu halten. Ach herrje... Wenn ich mal so das Verhalten meiner Heizung angucke, dann sind die Haupt-Pumpen (Vorkreis und eigentlicher Hauptkreis) eigentlich immer an. Was dabei geregelt wird, ist der Zustand des Mischers - und das ist nicht an/aus sondern feinstufig per Motor, also quasi analog. Naja, ich denk mal, das allererste dürfte sein, Zeitkonstanten aufzunehmen, damit später die ganze (mir selbst zu komplizierte) Regelung nicht ins Schwingen kommt. W.S.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.