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
elseif(Temperatur1>Maximum)
9
Pumpe1=FALSE;
10
11
if(Temperatur2<Minimum)
12
Pumpe2=TRUE;
13
elseif(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
elseif(Temperatur1>Maximum)
4
Pumpe1=FALSE;
5
6
if(Temperatur2<Minimum)
7
Pumpe2=TRUE;
8
elseif(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.
> 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.
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.