Seite 1 von 3

Erste Versuche mit LE - PID-Regler

Verfasst: Do Mai 23, 2019 9:11 am
von Robosoc
Moin,

ich versuche mich gerade testweise am experimentellen LE und habe mir dazu den PID-Regler vorgenommen. Drei Dinge sind mir aufgefallen (eventuell noch Hinweise auf Bugs oder Verbesserungsmöglichkeiten?):

Bild

1.
Mein als Ausgang gewähltes Objekt K-270 ist in der ETS und durch den Import folglich auch im TWS mit DPT 5.001 (0...100%) hinterlegt, das habe ich mehrfach überprüft. Der LE zeigt die Werte im Diagnosemodus (Doktormodus) aber dennoch scheinbar in absoluten Zahlen an. Ich hätte erwartet, dass da dann Prozentwerte angezeigt werden. Siehe Screenshot roter Kreis. Ist das noch ein Bug oder mache ich einen Gedankenfehler?
Auch Grafana zeigt mir hier nur absolute Werte an, wenn ich den Grafanabutton im LE Diagnosemodus klicke.

Der KNX Busmonitor liefert jedoch Prozentwerte -> in dem aktuellen Fall erwartete 100%, weil die 25°C Solltemperatur ja deutlich über der aktuellen Raumtemperatur liegen.


2.
Die mit blau eingekreiste Zahl irritiert mich dazu. Die Regel habe ich heute gegen grob 8:00 Uhr erstellt. Seit dem ist von keiner PA ein Wert auf den Bus geschrieben worden. Ich habe im Doktormodus mal manuell 25°C eingegeben um zu sehen, was denn so passiert. Das hat soweit funktioniert. Anschließend habe ich ausversehen das Taskfenster geschlossen. Ich bin mir recht sicher, dass ich die Logik vorher nicht gespeichert habe.
Als ich dann in einem neuen Taskfenster wieder in den LE gegangen bin, standen die 25°C noch immer in der Logik. Das heißt mein zu Testzwecken manuell eingegebene Wert bleibt auch dauerhaft anliegen obwohl er nicht auf den Bus geschrieben wird? Das verhalten war für mich erst überraschend, ist aber für mich jetzt nachvollziehbar.

Woran erkenne ich denn nun aber, dass die Logik grundsätzlich wieder auf Bussignale reagiert und der manuell eingegebene Wert nicht die Logik einfriert. Ich nehme an, dass erzeuge ich grundsätzlich per Klick auf das orange hinterlegt X, in dem Popoup, zur Eingabe manueller Werte. Aber es gibt kein optisches Feedback, dass jetzt wieder der nächste vom Bus gesendete Werte übernommen wird. In meinem Fall wird der Sollwert leider nicht zyklisch gesendet, weil die Zeitschaltuhr im Inzennio Z41 diese Möglichkeit m.E. nicht bietet.

3.
Deaktiviert man den Doktor-/Diagnosemodus, so bleibt die Logik dennoch vollständig aufgeklappt mit allen letzten Werten und der kleinen Grafik unterhalb der Logik sichtbar. Lediglich das grüne Stetoskopzeichen neben der Logic-ID verschwindet und der Diagnosebutton wechselt von grün auf grau. Die Werte sind nicht mehr anklickbar. Ich hätte erwartet, dass aber auch alle Anzeigewerte wieder verschwinden, so dass ein optischer Zustand hergestellt wird, wie wenn man eine Logik nach dem öffnen des LE oder nach dem Anlegen sieht. Das wäre dann aus meiner Sicht konsequenter und aufgeräumter.

VG,
Sven

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Do Mai 23, 2019 1:50 pm
von S. Kolbinger
Hallo Sven,
Robosoc hat geschrieben: Do Mai 23, 2019 9:11 am 1.
Mein als Ausgang gewähltes Objekt K-270 ist in der ETS und durch den Import folglich auch im TWS mit DPT 5.001 (0...100%) hinterlegt, das habe ich mehrfach überprüft. Der LE zeigt die Werte im Diagnosemodus (Doktormodus) aber dennoch scheinbar in absoluten Zahlen an. Ich hätte erwartet, dass da dann Prozentwerte angezeigt werden. Siehe Screenshot roter Kreis. Ist das noch ein Bug oder mache ich einen Gedankenfehler?
Auch Grafana zeigt mir hier nur absolute Werte an, wenn ich den Grafanabutton im LE Diagnosemodus klicke.
Die Logik-Engine (LE) kennt nur reine Zahlen (ohne Einheit). Der Grafana-Link im Debug-Modus spiegelt die Sichtweise des LE wider.
Die Umwandlung in die DPT-spezifische Darstellung, mit der impliziten physikalischen Einheit, erfolgt ausschließlich im KNX-Daemon/-Logger.
Wenn du also, zusätzlich zum KNX-Objekt K-270, noch eine Zeitserie als Ziel hinzufügen würdest, würde in dieser Zeitserie tatsächlich der Wert "92911,75" abgespeichert. Mit anderen Worten: Der Wert "92911,75" wird einmal an den KNX-Daemon/-Logger geschickt, wo er an den Wertebereich des DPTs (255 <=> 100%) angepasst wird, und zum anderen an die Zeitserie gesendet, die diesen Wert in seiner ursprünglichen abspeichern kann und auch macht.
Robosoc hat geschrieben: Do Mai 23, 2019 9:11 am 2.
...
Woran erkenne ich denn nun aber, dass die Logik grundsätzlich wieder auf Bussignale reagiert und der manuell eingegebene Wert nicht die Logik einfriert. Ich nehme an, dass erzeuge ich grundsätzlich per Klick auf das orange hinterlegt X, in dem Popoup, zur Eingabe manueller Werte. Aber es gibt kein optisches Feedback, dass jetzt wieder der nächste vom Bus gesendete Werte übernommen wird. In meinem Fall wird der Sollwert leider nicht zyklisch gesendet, weil die Zeitschaltuhr im Inzennio Z41 diese Möglichkeit m.E. nicht bietet.
Die Logik reagiert, parallel zu den manuell eingegebenen Werten, auch immer auf die Objekt-Werte (hier: "Bussignale") solange der Eingang nicht abgekoppelt wurde:
Gekoppelt: Bild / Abgekoppelt: Bild (Zum Wechseln der Zustände auf das Symbol klicken)
Ein automatisches Wiederherstellen der Werte nach beenden des Debug-Modus wird nicht gemacht. Es kann ja durchaus beabsichtigt sein, dass der manuell eingegebene Wert erhalten bleiben soll. Es gibt Überlegungen, dieses Verhalten in Zukunft zu verändern.
Aktuell muss man, will man den ursprünglichen Wert restaurieren, den alten Wert vor dem Beenden des Debug-Modus manuell schreiben.
Robosoc hat geschrieben: Do Mai 23, 2019 9:11 am 3.
Deaktiviert man den Doktor-/Diagnosemodus, so bleibt die Logik dennoch vollständig aufgeklappt mit allen letzten Werten und der kleinen Grafik unterhalb der Logik sichtbar. Lediglich das grüne Stetoskopzeichen neben der Logic-ID verschwindet und der Diagnosebutton wechselt von grün auf grau. Die Werte sind nicht mehr anklickbar. Ich hätte erwartet, dass aber auch alle Anzeigewerte wieder verschwinden, so dass ein optischer Zustand hergestellt wird, wie wenn man eine Logik nach dem öffnen des LE oder nach dem Anlegen sieht. Das wäre dann aus meiner Sicht konsequenter und aufgeräumter.
Das sehe ich auch so, und steht auch so auf der Liste, aber weit hinten in der Prio. :roll:

Trotzdem viel Spaß beim Ausprobieren.

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Do Mai 23, 2019 2:57 pm
von Robosoc
Alles klar, danke. Jetzt habe ich auch den Grund für die Stecker (gekoppelt und abgekoppelt) verstanden. Das ist eine gute Lösung!

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Di Mai 28, 2019 9:48 pm
von Robosoc
S. Kolbinger hat geschrieben: Do Mai 23, 2019 1:50 pm Der Wert "92911,75" wird einmal an den KNX-Daemon/-Logger geschickt, wo er an den Wertebereich des DPTs (255 <=> 100%) angepasst wird
Hallo Stefan,

Bist Du Dir sicher, dass Der Wert im KNX-Daemon umgewandelt wird, bzw. Dass das korrekt geschieht? Mein PID Regler regelt im gesamten Wertebereich, dass kann ich in Grafana sehen. Aber bisher bleibt der absolute Wert immer im hohe negativen Bereich. skaliert auf 0-100% hätte ich jetzt dann aber erwartet, dass 10 bis 15% in der Knx Adresse ankommen sollte. Tut es aber nicht.

Vg, Sven

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Mi Mai 29, 2019 5:01 pm
von S. Kolbinger
Hallo Sven,
Robosoc hat geschrieben: Di Mai 28, 2019 9:48 pm ...
Bist Du Dir sicher, dass Der Wert im KNX-Daemon umgewandelt wird, bzw. Dass das korrekt geschieht? Mein PID Regler regelt im gesamten Wertebereich, dass kann ich in Grafana sehen. Aber bisher bleibt der absolute Wert immer im hohe negativen Bereich. skaliert auf 0-100% hätte ich jetzt dann aber erwartet, dass 10 bis 15% in der Knx Adresse ankommen sollte. Tut es aber nicht.
...
Klar bin ich mir sicher, ich hab's doch programmiert ;)

Aber ich glaube zu wissen, wo hier das Missverständnis liegt.
Es wird nicht der maximale Wertebereich von "float" (-3.4E+38 ... 3.4E+38) auf 0-100% abgebildet, sondern die Zahl am Ausgang (Stellwert) ist bereits der Zielwert (nur ohne die Einheit; hier: [%]) und wird, je nachdem welcher DPT das Ziel hat, bestmöglichst angepasst.

Wenn also das Zielobjekt den DPT 5.001 (0% ... 100%) hat, geschieht die Anpassung folgendermaßen:
Float-WertDPT 5.001
X < 0.0->0 (0%)
0.0 <= X <= 100.0->0 .. 255 (0% .. 100%)
X > 100.0->255 (100%)
Ziel sollte es in deinem Fall sein, den Stellwert im Bereich von 0 bis 100 zu halten.
Die Werte für die Parameter Ki und Kd sind auf die Zeiteinheit von einer Sekunde normiert, d.h. Ki wird mit Einheit [1/s] und Kd mit [1s] angenommen.
Da sich die Temperaturen bei einer Heizungssteuerung eher langsam ändern (mehrere Minuten bis Stunden), würde ich für einen guten Startwert von Ki einen Wert von 0.0001 ... 0.001 nehmen.
Den Kd-Wert würde ich zu Anfang auf 0 setzen und erst mal als reinen PI-Regler betreiben. Erst wenn man gute Werte für Kp und Ki gefunden hat und der Stellwert sicher im Bereich 0..100% liegt, würde ich, falls noch nötig, vorsichtig an der Kd-Schraube drehen.

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Mi Mai 29, 2019 11:25 pm
von jockel
Sehr schön dargestellt, wäre vielleicht auch etwas für die Knowledgebase!

Und es gilt wie immer: Regler parametrisieren ist häufig eher Kunst als Wissenschaft... Der D-Anteil des Reglers soll ja die Reaktion auf schnelle Änderungen ermöglichen, daher denke ich auch nicht, dass er bei einer Regelung der Raumtemperatur benötigt wird!

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Do Mai 30, 2019 9:14 am
von Robert_Mini
jockel hat geschrieben: Mi Mai 29, 2019 11:25 pm Sehr schön dargestellt, wäre vielleicht auch etwas für die Knowledgebase!
Gerade notiert.
(Falls jemand Lust/Zeit hat: Mithilfe in der Logik Doku für die KB gerne erwünscht ;) ).

In jedem Fall helfen Rückmeldungen und kurze Beschreibungen zu Logiken als Basis für die KB.

Robert

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Do Mai 30, 2019 4:08 pm
von Robosoc
Danke auch von meiner Seite. Habe es verstanden und spiele jetzt mit den Einstellungen und kann das von Dir beschriebene Float zu DPT5.001 jetzt bestätigen. Das hatte ich weiter oben missverstanden!

VG, Sven

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Fr Mai 31, 2019 11:00 am
von Robert_Mini
Setze das mal auf gelöst.

@S. Kolbinger:
Heißt das, dass am Ausgang der Logik der gesamte Float bereicht dargestellt wird und erst bei der Konvertierung in den DPT auf 0 -100% beschränkt wird und dann auf 0-255 bei DPT 5.001 umgerechnet wird?

Oder ist das nur im Doctormodus so?

Ich finde das ein wenig verwirrend (und ungewöhnlich), schöner wäre es, wenn der Reglerausgang schon auf 0-100% gekappt wird, da ein Reglerausgang > 100 und <0 ja keinen Sinn macht.

Robert

Re: Erste Versuche mit LE - PID-Regler

Verfasst: Fr Mai 31, 2019 5:23 pm
von S. Kolbinger
Hi Robert,
Robert_Mini hat geschrieben: Fr Mai 31, 2019 11:00 am Heißt das, dass am Ausgang der Logik der gesamte Float bereicht dargestellt wird und erst bei der Konvertierung in den DPT auf 0 -100% beschränkt wird und dann auf 0-255 bei DPT 5.001 umgerechnet wird?
Das ist korrekt. Die Logik-Engine -- genau wie auch der Dispatcher -- berücksichtigen nicht die eventuellen Einschränkung des Zielobjektes, z.B. durch den DPT.
Robert_Mini hat geschrieben: Fr Mai 31, 2019 11:00 am Ich finde das ein wenig verwirrend (und ungewöhnlich), schöner wäre es, wenn der Reglerausgang schon auf 0-100% gekappt wird, da ein Reglerausgang > 100 und <0 ja keinen Sinn macht.
Da gebe ich dir vollkommen Recht. Umso mehr es in dem beschriebenen Fall zu einem wegdriften des Stellwertes durch den Integral-Anteil kommen kann, falls diese Einschränkung dem Regler nicht bekannt sind.

Um es ganz klar zu sagen:
Der PID-Regler wie er aktuell auswählbar ist, ist ein universeller Regler und möglichst allgemein gehalten.
Will man damit eine brauchbare Heizungsregelung realisieren, sind noch weitere Bausteine notwendig.
Wie du bereits erwähnt hast, muss man in der Logik eine Bereichseinschränkung des Stellwerts entsprechend des verwendeten Stellglieds vornehmen. Eventuell auch eine Offsetanpassung auf eine mittlere Einstellung (am besten nahe dem Wert für den eingeschwungenen Zustand der Regelung).

Ich werde mal eine erste Heizungsregel-Logik zusammenstellen. Könnte aber ein bis zwei Tage dauern, bin gerade noch anderweitig ( :angry-argument: ) beschäftigt ;)

Hinzugefügt nach 50 Minuten 29 Sekunden:
Noch nicht der Weisheit letzter Schluss, aber damit sollte es schon mal besser gehen:

Code: Alles auswählen

{
	"Level": [
		["$Reference","float",20.0],
		["$Controlled","float",20.0],
		["$Manipulate","float",0.0],
		["$Kp","float",0],
		["$Ki","float",0],
		["$Kd","float",0],
		["$Konst50","float",50.0],
		["$Konst1","float",1.0],
		["$Out","float",0.0],
		["$VAR<Inhibit?>", "bool", false]
	],
	"Module": [
		["Break", ["$VAR<Inhibit?>"]  ],
		["PID controller","$Reference","$Controlled","$Manipulate","$Kp","$Ki","$Kd"],
		["Limiter","$Manipulate","$Manipulate",0,["-$Konst50","$Konst50"]],
		["Polynomial","$Manipulate","$Out",["$Konst50","$Konst1"]]		
	],
	"Input": [
		["Soll","Soll-Wert","$Reference","c"],
		["Ist","Ist-Wert","$Controlled","a"],
		["Kp","Proportional-Term","$Kp","u"],
		["Ki","Integral-Term","$Ki","u"],
		["Kd","Diverential-Term","$Kd","u"],
		["Inhibit", "INHIBIT", "$VAR<Inhibit?>", "u" ]
	],
	"Output": [
		["Stell","Stellgröße","$Out","a"]
	]
}