PI(D) - Regler, Raumtemperatur

Hallo, gibt es eine Möglichkeit die Raumtemperatur über einen PI(D)- Regler zu steuern?

Hallo!

Ja.:D:D

Schönen Gruß:)
Egon

Du könntest dir ein PID Regler Script schreiben und damit dann nur die Heizventile ansteuern. Da es ja scheinbar über EIB laufen soll.

Sind die EIB Raumtemperaturregler nicht brauchbar?
Ich regele bei mir auch über einen PID Regler in meiner Siemens SPS. Da habe Ich mir einen Baustein geschrieben.

Es ist nur nicht so leicht funktionierende einstellungen zu finden. Da durch die Thermischen Stellantriebe und die entfernung zwischen Heizkörper und Temperaturfühler eine recht große Totzeit verursachen. Hier kann man den I anteil fast komplett weg lassen.

Hallo!
Sowas?

 <? 

//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)); 

?>  

Schönen Gruß:)
Egon

@ egon

Danke.