Seite 1 von 2

LE: Universeller RTR

Verfasst: So Sep 15, 2019 7:45 am
von Robosoc
Hier teile ich einmal meine Gedanken und Arbeit zu einem universellen RTR ( Raumtemperaturregler), was gleichzeitig meine erste Customer-Logik ist :dance: .

Ich würde mich freuen, wenn der Eine oder Andere hier mitmacht und mitdenkt ... denn es soll ja ein universeller Baustein werden. Ich habe sicher auch nicht alles perfekt gemacht (ist ja mein erster Custom-Versuch). Und vielleicht kann ElabNet das Ergebnis ja später in die Bibliothek aufnehmen.

Hier erstmal meine Gedankenskizze (kann ich hier irgendwo Powerpoint-Dateien hinterlegen, damit man in einer gemeinsamen Datei arbeiten könnte?):
[hsimg]ext/dmzx/imageupload/files/96da7f1957d3 ... 551f28.jpg[/hsimg]
Bild

Soweit mein Code:

Code: Alles auswählen

/**
 *  RTR V1.0
*/
{
  "Level":[
    ["$Switch","bool",false],
    ["$CompSwitch","bool",false],
    ["$Alarm_Temp", "bool",false],
    ["$dummyTrue","bool",true],
    ["$dummyFalse","bool",false],
    ["$VAR<TempIn!>","float",15],
    ["$watchdogTime","integer",360],
    ["$Status","bool",false],
    ["$internStatus","bool",false],
    ["$TempCompInaktiv","float",18],
    ["$Reference","float",20],
    ["$Controlled","float",20],
    ["$Manipulate","float",0],
    ["$Kp","float",0],
    ["$Ki","float",0],
    ["$Kd","float",0],
    ["$Konst50","float",50],
    ["$Konst1","float",1],
    ["$Out","float",0]
  ],
  "Module":[
    ["Comparator","$Reference","$CompSwitch","$TempCompInaktiv"],
    ["And",["$CompSwitch","$Switch"],"$internStatus"],
    ["Multiplexer",["$dummyFalse",0],"$Out","$internStatus"],
    ["Multiplexer",["$dummyFalse",0],"$Status","$internStatus"],
    ["Break",["-$Status"]],
    ["Monoflop","$VAR<TempIn!>",0,"$internStatus","$watchdogTime",1],
    ["Multiplexer",["$dummyFalse",0],"$Out","$internStatus"],
    ["Multiplexer",["$dummyFalse",0],"$Status","$internStatus"],
    ["Multiplexer",["$dummyTrue",0],"$Alarm_Temp","$internStatus"],
    ["Break",["-$Status"]],
    ["Statistic",["$VAR<TempIn!>"],0,0,"$Controlled",0],
    ["PID controller","$Reference","$Controlled","$Manipulate","$Kp","$Ki","$Kd"],
    ["Limiter","$Manipulate","$Manipulate",0,["-$Konst50","$Konst50"]],
    ["Polynomial","$Manipulate","$Out",["$Konst50","$Konst1"]],
    ["Comparator","$Out","$internStatus",0],
    ["Multiplexer",["$internStatus","$dummyTrue"],"$Status","$internStatus"]
  ],
  "Input":[
    ["Sw","Schalter","$Switch","c"],
    ["TempIn","Temperatur Messung","$VAR<TempIn!>","a"],
    ["Const_TempInaktiv","Schwellwert ob Regelung notwendig","$TempCompInaktiv","u"],
    ["watchdogTime","Überwachungszeit","$watchdogTime","u"],
    ["Soll","Soll-Wert","$Reference","c"],
    ["Kp","Proportional-Term","$Kp","u"],
    ["Ki","Integral-Term","$Ki","u"],
    ["Kd","Diverential-Term","$Kd","u"]
  ],
  "Output":[
    ["Stell","Stellgröße","$Out","a"],
    ["FuehlerAlarm","bei 1 kein Temperaturwert innerhalb der Überwachungszeit","$Alarm_Temp","c"],
    ["Status","HK aktiv oder inaktiv","$Status","a"]
  ]
}
Erste Tests waren vielversprechend!

Aber sobald ich einen zweiten Temperatureingang wähle, lässt sich die Logik nicht mehr ausführen (Ich habe einige Räume, in denen ich das gerne nutzen würde).

Noch ein Hinweis: Der Ausgang Heizkreis-"Status" soll bewusst nicht einfach nur eine Rückmeldung zum Ausführen des Eingang "Schalter" sein. Der Status soll unterm Strich anzeigen, ob das Ventil offen ist oder nicht. In einer weiteren Logik würde ich dann z.B. über ein OR-Baustein aus allen Heizkreis-Stati ermitteln, ob die Umwälz-Pumpe der Fußbodenheizungen laufen muss oder nicht.

Was mir auch noch fehlt sind gute Initial PID-Werte für eine
  • Luft-Temperatur-Regler
  • Estrich-Temperatur-Regler

Re: LE: Universeller RTR

Verfasst: So Sep 15, 2019 8:01 am
von StefanW
Hallo Sven,

eine sehr schöne Arbeit! Super.

==> Wir nehmen das am Ende gerne in die Liste der Bausteine auf, das ist ja auch der Sinn der Sache

lg

Stefan

Re: LE: Universeller RTR

Verfasst: So Sep 15, 2019 8:37 am
von 773H
Hallo.
Für Komfortanwendungen braucht man noch eine Möglichkeit zur Sollwertumschaltung (Nachtabsenkung, daheim, unterwegs, Party, ...)
Für einfache Anwendungen (FBH, elektrisch) reicht evtl. ein Zweipunktregler.

Gruss
Stephan

Re: LE: Universeller RTR

Verfasst: Mi Sep 18, 2019 10:06 pm
von andy_m
Hi Sven,
aus gegebenem Anlass (mein Wiregate hat sich verabschiedet, nach 9 Jahren bravem Dienst), möchte ich die RTR Funktion jetzt auf den TW ziehen. Könntest Du mal einen Screenshot von einem fertig 'beschalteten' Baustein zeigen!? Welche Werte hast Du z.B. für den PID Regler benutzt, etc.
Ich muss gestehen, ich kenne mich mit dem LE noch nicht viel aus :(

Gruß Andy

PS: Zum Thema Diagramme online, schau Dir das mal an: https://www.draw.io/

Re: LE: Universeller RTR

Verfasst: Mi Sep 18, 2019 10:54 pm
von Robosoc
Ich bin hier aufgrund fehlender Zeit noch nicht viel weiter.

Die Sensorüberwachung schmeiss ich am Wochenende raus und realisiere Sie separat. Dazu habe ich ja einen eigen Thread laufen. Eine AntiWindUp Funktion habe ich implementiert (ganz simpler Schwellwertschalter).

Und ich habe noch keine Pid Regler Einstellungen, die was taugen.daran bin ich schon vor einigen Monaten gescheitert und in den letzten Tagen nochmal. Also natürlich probiere ich erstmal nur einen PI Regler. Stephan‘s (773H) Meinung oben, bei FBH könnte ein Zweipunktregler reichen kann ich nicht teilen. Ich denke dafür ist meine Temperaturmessung im Estrich viel zu träge. Vielleicht würde es bei Anlegefühlern passen.

S. Klobiger hatte uns ja vor Monaten einen skalierbaren (mit Vorlage 0-100%) PID Regler gebastelt, den ich in meiner RTR Logik auch eingebunden habe. Dabei hat er auch beschrieben, dass der TWS PID Regler im Sekundentakt arbeitet, wir also niedrige Ki werte verwenden müssen, eher bei 0,001 bis 0,0001. Das konnte ich nachvollziehen, dachte ich.

Zuletzt habe ich mal versucht meine RTR-Einstellungen aus dem Wiregate Server umzusetzen (Plugin Multi-RTR, ich glaub geschrieben vom User ChrissM , welches letztlich auch PI Regelung macht), die bei mir ausreichend brauchbare Ergebnisse liefern. Dort verwende ich z.B. für die Estrichregelung ein proportionalGain von 3 und eine IntegralTime von 160. Wenn ich es richtig verstehe skaliert der Multi-RTR aber die Zeit durch Multiplikation mit 60auf Minuten.

Demnach müsste man meines Erachtens im TWS ein Kp von 1/3 und ein Ki von 1/(60x160) nehmen um auf ein gleiches Ergebnis zu kommen. Kd= 0. aber das Ergebis war bei mir ein so krasser Überschwinger, dass ich erstmal die Überhitzungsshwelle programmiert habe :doh:

Lange Rede, wenn jemand mal gute Ideen für erste PI Einstellungen hat, gerne her damit

Re: LE: Universeller RTR

Verfasst: Mi Sep 18, 2019 10:55 pm
von Robosoc
andy_m hat geschrieben: Mi Sep 18, 2019 10:06 pm PS: Zum Thema Diagramme online, schau Dir das mal an: https://www.draw.io/
Sehr interessant, danke

Re: LE: Universeller RTR

Verfasst: Mi Sep 18, 2019 11:05 pm
von Dragonos2000
Robosoc hat geschrieben: So Sep 15, 2019 7:45 am Aber sobald ich einen zweiten Temperatureingang wähle, lässt sich die Logik nicht mehr ausführen (Ich habe einige Räume, in denen ich das gerne nutzen würde).
Hast Du eingrenzene können wo es herkommt? Ich tippe mal auf das Monoflop/Watchdog.

Re: LE: Universeller RTR

Verfasst: Do Sep 19, 2019 5:34 am
von Robosoc
Dragonos2000 hat geschrieben: Mi Sep 18, 2019 11:05 pm Hast Du eingrenzene können wo es herkommt? Ich tippe mal auf das Monoflop/Watchdog.
Ja, ist geklärt. Kann nicht gehen. Siehe
https://forum.timberwolf.io/viewtopic.php?f=24&t=1425

Re: LE: Universeller RTR

Verfasst: Do Sep 19, 2019 6:27 am
von Robosoc
andy_m hat geschrieben: Mi Sep 18, 2019 10:06 pm Könntest Du mal einen Screenshot von einem fertig 'beschalteten' Baustein zeigen!?
Fall Dir das jetzt schon hilft (PI Einstellung ist ein reiner Spielwert und funktioniert nicht gut!!!):
Bild
Die binären Ausgänge habe ich noch nicht verschaltet, die schaue ich mir im Moment noch rein im Dok-Modus an.

Der aktuelle Code, den ich aber noch ändern werde (habe die MonoflopZeile, die nicht funktionieren wird, hier einfach auskommentiert) ist Folgender:

Code: Alles auswählen

/**
 *  RTR V1.1
*/
{
  "Level":[
    ["$Switch","bool",false],
    ["$CompSwitch","bool",false],
    ["$Alarm_Sensor", "bool",false],
    ["$Alarm_MaxTemp", "bool",false],
    ["$dummyTrue","bool",true],
    ["$dummyFalse","bool",false],
    ["$VAR<TempIn!>","float",15],
    ["$watchdogTime","integer",360],
    ["$Status","bool",false],
    ["$internStatus","bool",false],
    ["$TempCompInaktiv","float",18],
    ["$TempCompMaxWarm","float",30], 
    ["$Reference","float",20],
    ["$Controlled","float",20],
    ["$Manipulate","float",0],
    ["$Kp","float",0],
    ["$Ki","float",0],
    ["$Kd","float",0],
    ["$Konst50","float",50],
    ["$Konst1","float",1],
    ["$Out","float",0]
  ],
  "Module":[
    ["Comparator","$Reference","$CompSwitch","$TempCompInaktiv"],
    ["And",["$CompSwitch","$Switch"],"$internStatus"],
    ["Multiplexer",["$dummyFalse",0],"$Out","$internStatus"],
    ["Multiplexer",["$dummyFalse",0],"$Status","$internStatus"],
    ["Break",["-$internStatus"]],
//["Monoflop","$VAR<TempIn!>",0,"$internStatus","$watchdogTime",1],
    ["Multiplexer",["$dummyFalse",0],"$Out","$internStatus"],
    ["Multiplexer",["$dummyFalse",0],"$Status","$internStatus"],
    ["Multiplexer",["$dummyTrue","$dummyFalse"],"$Alarm_Sensor","$internStatus"],
    ["Break",["-$internStatus"]],
    ["Statistic",["$VAR<TempIn!>"],0,0,"$Controlled",0],
    ["Comparator","$Controlled","-$internStatus","$TempCompMaxWarm"],
    ["Multiplexer",["$dummyFalse",0],"$Out","$internStatus"],
    ["Multiplexer",["$dummyFalse",0],"$Status","$internStatus"],
    ["Multiplexer",["$dummyTrue","$dummyFalse"],"$Alarm_MaxTemp","$internStatus"],
    ["Break",["-$internStatus"]],
    ["PID controller","$Reference","$Controlled","$Manipulate","$Kp","$Ki","$Kd"],
    ["Limiter","$Manipulate","$Manipulate",0,["-$Konst50","$Konst50"]],
    ["Polynomial","$Manipulate","$Out",["$Konst50","$Konst1"]],
    ["Comparator","$Out","$internStatus",0],
    ["Multiplexer",["$dummyFalse","$dummyTrue"],"$Status","$internStatus"]
  ],
  "Input":[
    ["Sw","Schalter","$Switch","c"],
    ["TempIn","Temperatur Messung","$VAR<TempIn!>","a"],
    ["Const_TempInaktiv","Schwellwert ob Regelung notwendig","$TempCompInaktiv","u"],
    ["Const_TempMax","Schwellwert, ob Temperatur zu hoch","$TempCompMaxWarm","u"],
    ["watchdogTime","Überwachungszeit","$watchdogTime","u"],
    ["Soll","Soll-Wert","$Reference","c"],
    ["Kp","Proportional-Term","$Kp","u"],
    ["Ki","Integral-Term","$Ki","u"],
    ["Kd","Diverential-Term","$Kd","u"]
  ],
  "Output":[
    ["Stell","Stellgröße","$Out","a"],
    ["FuehlerAlarm","bei 1 kein Temperaturwert innerhalb der Überwachungszeit","$Alarm_Sensor","c"],
    ["HitzeAlarm","bei 1 zu Hohe gemessene Temperatur","$Alarm_MaxTemp","c"],
    ["Status","HK aktiv oder inaktiv","$Status","a"]
  ]
}

Re: LE: Universeller RTR

Verfasst: Do Sep 19, 2019 10:05 pm
von Gecks
@Robosoc im Studium erinnere ich mich daran Mal was von Reglereinstellungen gehört zu haben :geek:
Irgendwas mit Übertragungsfunktion und Sprungantwort. Da gibt es auch ein paar praktische Möglichkeit um näherungsweise die pasenden Werte zu finden. Auf die Schnelle habe ich von Honeywell folgendes PDF gefunden.
https://www.google.com/search?q=honeywe ... metrierung
Da gab es aber noch ne andere Faustformel :?: Vielleicht dämmert es mir noch :idea: