Hallo,
hier habe ich euch mal eine Heizkreisregler gestrickt. Das Ausgangssignal ist hier für den DS2890, es kann aber auch z.B. 0-10 oder was auch immer mit erzeugt werden. Die im Beispiel eingetragenen Variablen bitte durch eure ersetzen.
Funktionsbeschreibung:
Der Regler fängt das Arbeiten an sobald $frgext = True ist. Es wird dann anhand der Aussentemperatur eine Vorlauftemperatur errechnet. Die Vorlauftemperatur errechnet sich aus der Aussentemperatur und den Parametern $steil und $kh. Einen weiteren Einfluss auf die Heizkurve kann man über eine Einzelraumregelung nehmen. Hierzu muss am Parameter $maxabw die maximale Regelabweichung der Einzelraumregler eingetragen werden. Mit $sw kann zusätzlich der Sollwert (Raum) angegeben werden. Die Einflussstärke der Einzelraumregelung auf die Heizkurve kann mit dem Parameter $verst erfolgen. Ein üblicher Wert ist hier 3, d.h. bei 1K Abweichung wird der Vorlauf um 3°C erhöht.
<?
$debug=false;
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : PI_Regler.ips.php
Trigger :
Interval : 3 Sekunde
Version 0.2
Made by Thomas Reger (msr_junky)
Erklärungen:
Das Triggerintervall sollte so schnell wie möglich eingestellt werden. Bei stabilen Regelkreisen kann auch mit einer längeren Zeit gearbeitet werden.
Das Optimum muß selbst gefunden werden, da sich jeder Regelkreis anderst verhält.
Mit den Parametern $Xp (Proportionalbereich) und $Tn Nachstellzeit für den I-Anteil) wird die Geschwindigkeit des Reglers beeinflusst.
Bei zu niedrigen Werten kann der Regler in Schwingung geraten. In der Praxis haben sich die vorgegebenen Werte für 80% aller Regelkreise als problemlos herausgestellt.
Sollte der Regler trotzdem Schwingen, sollten die Werte beginnend mit $Xp langsam erhöht werden.
Mit den Parametern $Ymin und $Ymax kann man den Arbeitsbereich des Regelsignals festlegen.
Mit dem Parameter $Frg kann man den Regler Ein/Aus-Schalten z.B. über ein Zeitflag oder einem Schalter oder einem Standby-Modul (Sommer/Winterumschaltung)
*/
$frgext= true;
$steil = 3;//Steilheit EF
$kh = 5; //Parallelverschiebung KH
$maxvl = 75; //Max. Vorlauftemp.
$minvl = 20; //Min. Vorlauftemp.
$sw = 21; // Raumsollwert fest vorgeben oder dynamisch aus Abfrage der Raumsollwerte
$maxabw = GetValueFloat("Heizung_Maxabweichung_EZR");//Max. Regelabweichung von EZR (EZR = Einzelraumregelung)
$verst = 3; //Raumeinfluss auf Heizkurve, gängiger Wert ist 3
//Aussentemperatur abfragen
$at = GetValueFloat("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 Sollwert
SetValueFloat("Heizung_Sollwert_Vorlauf_HK",$swhk); //Ausgabe berechneter Sollwert Vorlauf
If ($debug == true){
echo $swhk."
";
echo $at."
";
}
$Xp = 15; // Proportionalbereich
$Tn = 45; // Nachstellzeit
$Ymin = 0; // Min.-Regelsignal
$Ymax = 255; // Max.-Regelsignal
$Frg = $frgext; // Freigabe z.B. von Standbymodul
$Sw = $swhk; // Sollwert
$VL = GetValueFloat("VL_stat_Hzg"); // Fühler nach dem geregelt werden soll
$iah = GetValueFloat("PI_Regler_IAnteil_HK"); //alter berechneter I-Anteil des Reglers
$timeold=GetValueInteger("PI_Regler_last_HK"); // Letzer Durchlauf des Reglers
//Berechnung
$timediff= time() - $timeold;
$iah = (max(min((($Sw - $VL ) * $timediff * (1 / $Tn ) + $iah), $Ymax ), $Ymin )) * $Frg; //Berechnung I-Anteil
$Y= (max(min((($Sw - $VL ) * 10 / $Xp + $iah), $Ymax ), $Ymin )) * $Frg; //Berechnung Regelsignal
$xw = $VL - $Sw; //Berechnung Regelabweichung
Settype($Y,"Integer");
TMEX_F2C_SetPosition(44330,$Y);
$signal = (100/$Ymax)*$Y;
SetValueFloat("Heizung_RM_HV_HK",$signal); //Rückmeldung Regelsignal 0-100%
// Ausgabe
SetValueFloat("PI_Regler_IAnteil_HK",$iah);
SetValueInteger("PI_Regler_last_HK",time());
// Kontrolle
If ($debug == True ) {
echo "Zeitdifferenz".$timediff."
";
echo "I_Anteil alt = ".$iah."
";
echo "I-Anteil = ".$iah."
";
echo "Regelsignal = ".$Y."
";
echo "Regelabweichung = ".$xw."
";
}
?>
Viel Erfolg.
Gruß
Thomas