Heizkennlinie berechnen

Hi,

wie kann ich den die volgenden Werte Berechnen?

Heizkurve ? Wikipedia

Ich habe die Außentemperatur und nun würde ich mir gerne die vorlauftemperatur berechnen lassen.
Danke

Hallo,
meine Wago-Steuerung berechnet die Vorlauftemperatur folgendermassen:
Sollwert Vorlauf :=Neigung Heizkurve * 1.8317984*EXPT ((Raumtemperatur - Aussentemperatur), 0.8281902) + Niveau_Heizkurve + Raumtemperatur ;

gruß,
Rayk

Und woher bekomme ich die Werte „Neigung Heizkurve“ und "Niveau_Heizkurve "?

ein wenig Grundlagenwissen sollte man sich schon verschaffen z.B. hier: Heizkurve Infos und Einstellung shk-mayer.de

Neigung ist mir nun klar. Aber Niveau ?

Niveau=Parallelverschiebung d.h. die Vorlauftemperatur wird einfach angehoben

In der Formel wird (Raumtemperatur+ Niveau) zur berechneten Vorlauftemperatur addiert, d.h. mit dem Niveau kann die Vorlauftemperatur einfach angehoben werden, ist in der Übergangszeit wichtig, wobei nach meiner Sicht die ganze Regelung (ist es eigentlich gar nicht) nach Aussentemperatur unsinnig ist

Aussentemperatur 0°C -->Produkt in der Formel =10+Raumtemperatur (24°C)+Niveau(0)–>Vorlauf 34°C Resultat: zu kalt im Raum also Niveau anheben auf 6
Produkt in der Formel =10+Raumtemperatur (24°C)+Niveau(6)–>Vorlauf 40°C Raum wird warm…:slight_smile:

Hi,

für die Berechnung einer Heizkurve gibt es viele Lösungen. Die einen machen es linear, die anderen mit Krümmung, noch andere mit mehreren Krümmungen und jeder meint er hat die Beste :stuck_out_tongue:

Hier mal ne Lösung wie ich es mache. Die Heizkurve ist mit Raumeinfluss (was ich dir empfehle zu machen, da du ja eine Einzelraumregelung hast):

//Aussentemperatur abfragen
$at = GetValueFloat(57104 /*[Wetterstation\Wetter Aussentemperatur]*/  ); // AT

//Berechnung
$t1 = ($at/(320-$at*4));
$t2= pow($sw,$t1);
$swhk  =  Min(Max((((0.55)*$steil *($t2) *((-$at +20)*2)+ $sw + $kh) + ($maxabw * $verst)), $minvl ), $maxvl );

//Ausgabe VL-Sollwert
SetValueFloat(33989 /*[KG\Heizung\Heizung Regler Heizkreise\Heizung Sollwert Vorlauf Heizkreise]*/ ,$swhk);

Ich habe die Formel mal etwas aufgebröselt mit den Variablen $t1,$t2 damit es etwas übersichtlicher wird (kannst du ja dann ändern).

$sw = Raumsollwert (z.B. 21°C)
$swhk = Berechnete Vorlauftemperatur
$steil = Steilheit Heizkurve (z.B. 1)
$kh = Parallelverschiebung (z.B. 5)
$maxabw = Max. Regelabweichung der Einzelraumregler
$verst = Verstärkungsfaktor (z.B. 3)
$minvl = Mindesttemp. Vorlauf (z.B. 25°C)
$maxvl = Maxtemp. Vorlauf (z.B. 70°C)

Hoffe du kommst damit klar.

Gruß
Thomas

Uhi das ist ja genau das was ich will :slight_smile:

Ist nun ein Bestandteil der Heizung ->

Danke! Danke! Danke!

Wie genau ist denn das zu verstehen $t2= pow($sw,$t1); was soll den hier jetzt passieren mit der Info gewünschte Raumtemperatur und Ergebnis T1.
Wahrscheinlich sagt das pow sehr viel aus, nur ist es mir leider kein bekannter Begriff.
Bitte um kurze Unterstützung.
Vielen lieben Dank schon mal im Voraus.

http://php.net/manual/de/function.pow.php

Hi,

@MSR_Junky, danke für dein Script. Das ist genau das, was ich derzeit suche bzw. in den nächsten Tagen suchen werde :wink: Bin grad dabei an meiner FBH zu basteln. Aber:

Wo ist jetzt in deinem Script der Raumeinfluß? Ich sehe nur den RaumSOLLwert, nicht die aktuelle IST-Temperatur des Raumes. Ich weiß ja, dass sich eine gut eingestellte FBH „selbst“ regeln soll und sehr träge ist… aber ich habe das Gefühl, dass ich auf den Temp-Sensor im Wohnzimmer nicht verzichten möchte :wink:

Und noch pauschaler gefragt: Weiß jemand, wie ich die Temperatur bei Soll-/Ist-Abweichung am Besten anpasse? Kleine Hysterese (0,2K o.ä.) ist klar, aber was schalte ich dann? Stellventil zum Raumkreis per PWM pulsen lassen? Vorlauftemp über Motormischer ändern? Oder einfach bei Sollüberschreitung die Pumpe abschalten und bei Unterschreitung wieder anschalten? Letzteres ist mir sehr sympatisch (spart etwas Strom), wird mir wahrscheinlich aber Ermittlung der Vorlauftemp. erschweren (wenn die Pumpe nicht arbeitet, kommt kühlt es am Vorlaufsensor ab).

Viele Grüße,
Michael

Ich komme hier leider noch nicht weiter… hat denn keiner einen Tipp für mich? :wink:

Meine letzte Überlegung war, z.B. einmal pro Stunde zu prüfen, ob die Raum-IST-Temperatur von der Raum-SOLL-Temperatur abweicht. Falls IST-Temp zu hoch, wird der Motormischer um sagen wir 1% runtergefahren und dadurch die Vorlauftemp der FBH gesenkt. Dadurch, dass das Skript regelmäßig läuft, sollte sich eine Regelung einstellen… ich befürchte jetzt aber, dass das Verfahren zu sehr pendelt.

Nur der Vollständigkeit halber, falls es in Zukunft mal jemanden interessiert:

habe es mittlerweile mit einer Heizkennlinien-Berechnung wie der von Thomas (MSR_Junky) in diesem Thread gelöst.
Thomas hat mir freundlicherweise auch nochmal erklärt, wie die Raum-Ist-Temperatur einfließt:

Hallo Michael,

du hast das geanu richtig interpretiert. In Abhängigkeit der Regelabweichung zwischen Ist- und Solltemperatur (bei mehreren Räumen dann die maximale Abweichung) und dem Verstärkungsfaktor wird genau um dieses Ergebnis die Heizkurve, welche nach Aussentemperatur fährt, angehoben oder abgesenkt.

in die Variable „$maxabw“ seines Skriptes muss man also die Differenz zwischen Raumsoll und Raumist befüllen.

Viele Grüße,
Michael

Ich habe die Berechnung von MSR_Junky (Thomas) mal in Excel abgebildet, dort kann man den Einfluss der Parameter sofort sehen.

Gruß
Harald

Heizkennlinie mit Raumtemperatureinfluss.xls (47 KB)

Moin moin,

@Harald: danke dafür, dass dürfte dem ein oder anderen behilflich sein.

@all:
ich kapere den Thread mal für eine etwas andere Frage: wie berechnet man in Abhängigkeit von Raum-Soll-Temp und Raum-Ist-Temp den Öffnungsgrad eines Heizkörperventils? (wie es z.B. die Homematic-Heizkörperthermostate tun) ?

Hintergrund: ich kann an einem Heizkörper kein motorisches Ventil verbauen, vorhanden ist nur ein Stellantrieb „Auf oder Zu“. Mit einer Quasi-PWM kann man ja einen Öffnungsgrad nachbilden. Also z.B. 2min offen und 2min zu entspricht 50% Öffnung. Doch nach welcher Berechnung ermittle ich den Öffnungsgrad? Und welchen Zeitabstand sollte man für die Quasi-PWM hernehmen?

Dank & Gruß,
ika

Hallo!

Such mal nach PID Regler
Die berechnete Stellgrösse 0-100 % dann in PWM umwandeln…

Schönen Gruß:)
Egon

Hi,
ja sowas hatte ich im Kopf.
Allerdings finde ich im Forum dazu nur einen uralten Hinweis, dass es mal ein PID-Regler-Modul für IPS von Steiner geben sollte (ist aber wohl nie gekommen?) und darüber hinaus viele unterschiedliche Skripte, bei denen ich noch nicht sehe, welches nun am Besten regelt. Die einen scheinen mir zu einfach gestrickt, die anderen benötigen Stellparameter wie Totzeit und Verstärkungsfaktoren etc. die sich mir noch nicht ganz erschließen.

Hi!

 <? 

//e = aktuelle Reglerabweichung -> Soll-Ist 
//ealt = vorherige Reglerabweichung 
//esum = die Summe aller bisherigen Abweichungen e 
//Ta = Rechenschrittweite (Abtastzeit) 
//Kp = Verstärkungsfaktor Proportionalregler 
//Ki = Verstärkungsfaktor Integralregler 
//Kd = Verstärkungsfaktor Differenzialregler 
//y = Antwort -> muss im Bereich zwischen 0-100 sein 
// esum = esum + e 
// y = Kp * e + Ki * Ta * esum + Kd * (e – ealt)/Ta 
// ealt = e 
$Kp=5; 
$Kd=0; 
$Ki=2.5; 
$Script = IPS_GetScript($IPS_SELF); 
$Ta=Round((time() - $Script['LastExecute'])/60,0); 
echo "Zeitdifferenz: " .$Ta. " "; 

//aktuelle Regelabweichung bestimmen 
$e = GetValueFloat(28056 /*[Raum-Temperaturen\Büro Joachim\Soll Temperatur]*/ )- GetValueFloat(40847 /*[Raum-Temperaturen\Büro Joachim\Temperatur]*/ ); 
echo "Regelabweichung: ".$e." "; 

// Die Summe aller vorherigen Regelabweichungen bestimmen 
If ((getValueinteger(37838 /*[Raum-Temperaturen\Büro Joachim\Heizungs-Stellelement]*/ ) == 0) and ($e < 0)) 
    // Die Negativ-Werte sollen nicht weiter aufsummiert werden, wenn der Stellmotor schon auf 0 ist 
    { 
   $esum = (GetValueFloat(43568 /*[Raum-Temperaturen\Büro Joachim\Hilfsvariablen\Summe Regelabweichungen]*/ )); 
   } 
else 
    { 
    $esum = (GetValueFloat(43568 /*[Raum-Temperaturen\Büro Joachim\Hilfsvariablen\Summe Regelabweichungen]*/ )) + $e; 
    } 

echo "Summe Regelabweichungen: ".$esum." "; 
SetValueFloat(43568 /*[Raum-Temperaturen\Büro Joachim\Hilfsvariablen\Summe Regelabweichungen]*/ , $esum); 

// Die vorherige Regelabweichung ermitteln 
$ealt = GetValueFloat(19069 /*[Raum-Temperaturen\Büro Joachim\Hilfsvariablen\Vorherige Regelabweichung]*/ ); 
// Die Regelgröße nun errechnen 

echo "Produkt Kp * e = : ".$Kp * $e." "; 
echo "Produkt Ki * Ta * esum = : ".$Ki * $Ta * $esum." "; 
$y = ($Kp * $e + $Ki * $Ta * $esum + $Kd * ($e - $ealt) / $Ta); 

// Vorherige Regelabweichung durch jetzige ersetzen 
SetValueFloat(19069 /*[Raum-Temperaturen\Büro Joachim\Hilfsvariablen\Vorherige Regelabweichung]*/, $e); 

//$NeuerWert = GetValueInteger(37838 /*[Raum-Temperaturen\Büro Joachim\Heizungs-Stellelement]*/ ) + (abs($e)/10*$y); 
$NeuerWert = $y; 

If ($NeuerWert < 0) 
    { 
    $NeuerWert = 0; 
    } 
elseif ($NeuerWert > 100) 
    { 
    $NeuerWert = 100; 
    } 
echo "Neue Regelgrößen: ".$NeuerWert." "; 
SetValueInteger(37838 /*[Raum-Temperaturen\Büro Joachim\Heizungs-Stellelement]*/ , $NeuerWert); 
//Umskalierung auf 0-255 und Errechnung des HEXwertes 
$Sendewert = dechex(Round(($NeuerWert * 2.55))); 
echo "Gerundeter Wert: ".Round(($NeuerWert * 2.55))." "; 
echo "Gesendeter Wert: ".$Sendewert; 
$Sendewert = "0x$Sendewert"; 
echo $Sendewert; 
HID_SendEvent(22578 /*[Stellmotorsender]*/, 0, chr(0x01).chr($Sendewert).chr(0x02)); 

Das funktioniert
Die Regelgüte hängt vor allem von den PID Einstellungen ab.
Wenn nicht durchblickst dann ein Buch über Regelungstechnik lesen oder hier Fragen.:slight_smile:
Schönen Gruß:)
Egon