Forum: Mikrocontroller und Digitale Elektronik Regelung mit mehreren Variablen und Abhängigkeiten: Wie am besten?


von HerrBärt (Gast)


Lesenswert?

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?

von cppler (Gast)


Lesenswert?

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.

von Nachbar (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hinz oder Kunz (Gast)


Lesenswert?

Bevor man sowas auf die Hardware loslaesst unf nachher den Durchblick 
verliert, sollte man sich eine Simulation goennen.

von HerrBärt (Gast)


Lesenswert?

> 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)?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

Womit man eine Simulation schreibt? Mit Visual Cplusplus, VisualBasic, 
Delphi, irgendwas...

von cppler (Gast)


Lesenswert?

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 !

von HerrBärt (Gast)


Lesenswert?

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!

von W.S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.