Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Tester
    4. Test Adapter pid (pid-Regler) V1.0.x

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Test Adapter pid (pid-Regler) V1.0.x

    This topic has been deleted. Only users with topic management privileges can see it.
    • mcm1957
      mcm1957 @mcm1957 last edited by mcm1957

      Ich dachte eigentlich, dass ich nur mal schnell den node-pid code in einen Adapter integriere.
      So kann man sich täuschen 🙂

      Sorry für die immer noch vorhandenen Fehler. Und DANKE für euren Testaufwand. Ohne den würde der Adapter wohl noch viel länger fehlerhaft bleiben.

      McM

      P.S: Für heute bin ich zu müde um mal schnell was rauszuschießen. Wird wohl morgen od. ev. Freitag werden für die nächste Version

      Ben1983 fu_zhou 2 Replies Last reply Reply Quote 0
      • Ben1983
        Ben1983 @mcm1957 last edited by

        @mcm57 alles gut. Top Entwicklung des Adapters.
        Mit dem integralanteil wäre es echt cool, wenn der immer nur den letzten Teil mit dem aktuellen Tn auf den alten Wert packt.
        Das ist beim einstellen schon wesentlich besser zum Testen.

        1 Reply Last reply Reply Quote 0
        • fu_zhou
          fu_zhou @mcm1957 last edited by fu_zhou

          @mcm57 hier ein Ausschnitt aus dem Quellcode vom S7-PID = der P-I-Teil, der sieht wie folgt aus:

          (* read last cycle time in Microseconds *)
          tx := T_PLC_US();
          tc := DWORD_TO_REAL(tx - t_last);
          t_last := tx;
          
          (* calculate proportional part *)
          p := KP * IN;
          
          (* run integrator *)
          i := (IN + in_last) * 5.0E-7 * KI * tc + i;
          in_last := IN;
          
          (* calculate output Y *)
          Y := p + i;
          

          Das sieht so aus, wie @Ben1983 oben schreibt: aufgeteilte Berechnung, und daher kein Sprung bei Verändern von Tn im laufenden Betrieb, oder?

          mcm1957 2 Replies Last reply Reply Quote 0
          • mcm1957
            mcm1957 @fu_zhou last edited by

            @fu_zhou

            Danke f.d. Beispiel. Im Prinzip hab ich es so umgesetzt.
            In deinem Codebeispiel wird nur anscheinen der Mittelwert (?) der Fehlerwerte integriert - anders kann ich mir lastIn nicht erklären. Ich integriere "nur" den Fehlerwert. Glaube aber nicht, dass dies viel Unterschied im Verhalten macht, zumindest sicher nicht wenn der Fehlerwert nicht groß herumspringt.

            fu_zhou 1 Reply Last reply Reply Quote 0
            • mcm1957
              mcm1957 @fu_zhou last edited by

              @fu_zhou @Ben1983

              Release 0.0.3-alpha.1 ist da

              • geändert: Einstellung rst Zustand löst keine Neuberechnung mehr aus
              • geändert: State diff zeigt nun den Fehlerwert, auch wenn sup aktiv ist
              • geändert: Die Berechnung des I-Teils wurde geändert; Änderungen a, Paramater Tn wirken nur mehr auf zuküftige Anteile",

              Offen ist noch die Anpassung der Formel im GUI

              Schaut bitte mal ob das jetzt besser passt.

              fu_zhou 1 Reply Last reply Reply Quote 0
              • fu_zhou
                fu_zhou @mcm1957 last edited by

                @mcm57 Der ganze PID-Algorithmus in der S7 ist eine Kombination aus Funktions-Aufrufen. Ist es hilfreich, wenn ich das alles mal zusammensuche? Ich glaube eher nicht, dazu sind wir hier schon weit genug, würde ich sagen.

                mcm1957 1 Reply Last reply Reply Quote 0
                • fu_zhou
                  fu_zhou @mcm1957 last edited by fu_zhou

                  @mcm57 cool, schaffe ich aber erst heute Abend, auch wenn mich das aktuell mehr juckt, als die Arbeit 😉

                  1 Reply Last reply Reply Quote 0
                  • mcm1957
                    mcm1957 @fu_zhou last edited by

                    @fu_zhou said in Test neuer Adapter pid (pid-Regler) V0.0.3-alpha.x:

                    @mcm57 Der ganze PID-Algorithmus in der S7 ist eine Kombination aus Funktions-Aufrufen. Ist es hilfreich, wenn ich das alles mal zusammensuche? Ich glaube eher nicht, dazu sind wir hier schon weit genug, würde ich sagen.

                    Danke für das Angebot.
                    Aber ich glaube auch, dass wir das nur (mehr) machen sollten, wenn es hier Probleme gibt die am Algorithmus liegen könnten.

                    McM

                    Ben1983 2 Replies Last reply Reply Quote 0
                    • Ben1983
                      Ben1983 @mcm1957 last edited by Ben1983

                      @mcm57 Jetzt ist es aber so, wenn man während hold einen Reset macht, passiert nichts => OK
                      setzt man dann hold wieder auf false, beginnt der Regler mit y = 0 neu zu regeln.

                      Wäre es keine Option, wenn Hold = true ist den rst state einfach zu bestätigen, aber nichts zu machen?

                      mcm1957 1 Reply Last reply Reply Quote 0
                      • Ben1983
                        Ben1983 @mcm1957 last edited by

                        @mcm57 Liegt das am Hold bit, dass die diff nicht passt?
                        798b2fe6-49cd-480c-8d74-9a99658b744a-image.png

                        mcm1957 1 Reply Last reply Reply Quote 0
                        • mcm1957
                          mcm1957 @Ben1983 last edited by mcm1957

                          @ben1983 said in Test neuer Adapter pid (pid-Regler) V0.0.3-alpha.x:

                          @mcm57 Jetzt ist es aber so, wenn man während hold einen Reset macht, passiert nichts => OK
                          setzt man dann hold wieder auf false, beginnt der Regler mit y = 0 neu zu regeln.

                          Wäre es keine Option, wenn Hold = true ist den rst state einfach zu bestätigen, aber nichts zu machen?

                          RST sollte keine außertourliche Neubrechnung auslösen, genausowenig wie das Ändern von act, set, ... RST mcht genau eines - der Integralspeicher wird resetted. Damit wird die Vorgeschuchte vergessen und beim nächsten Rechenzyklus wie bei einem ersten Start berechnet.

                          Das bei hold=true keine Reaktion auf y zu sehen ist ist daher gewunschen und m.E. ok.

                          Beim Restart (hold=false) wird y auf set-act/kp + offset gesetzt. Beim ersten Zyklus gibt es keinen Integralteil da dt mangels Vorgängerwert null ist. Wenn also am Ausgang y 0 angelegt wird, dann muss err = 0 sein (bzw. err*kp-off).

                          Bitte ggef das Loggend er Berechnungen aktivieren:
                          02ec3f3a-0bb7-421c-82ca-900e7c0724fa-image.png

                          Dann sollten die Berechnungszyklen im Log auftauchen:

                          0ea9f8f0-5958-4bde-9d93-40356208f58f-image.png

                          RST während eines Holds zu ignorieren wäre m.E. unlogisch.

                          1 Reply Last reply Reply Quote 0
                          • mcm1957
                            mcm1957 @Ben1983 last edited by

                            @ben1983 said in Test neuer Adapter pid (pid-Regler) V0.0.3-alpha.x:

                            @mcm57 Liegt das am Hold bit, dass die diff nicht passt?
                            798b2fe6-49cd-480c-8d74-9a99658b744a-image.png

                            Ich gehe mal davon aus, dass act nach dem letzen Update von y (und diff) sich wieder geändert hat. Diff wird NICHT ständig aktualisiert sondern spiegelt jenen diff Wert dar der bei der letzen Berechnung verwendet wurde. Act und Set können sich dann bis zur nächsten Berechnung ändern.

                            Änderungen von Act oder Set lösen keine extra Neuberechnung aus.

                            Ansonsten bitte wie oben die Berechnungslogs aktivieren und den zugehörigen Output posten.

                            MartinP 1 Reply Last reply Reply Quote 0
                            • MartinP
                              MartinP @mcm1957 last edited by

                              Instinktiv habe ich gewisse Vorbehalte, einen Regler zu weit weg von der zu regelnden Strecke zu implementieren.

                              Dass bei gutmütigen Regelkreisen auch eventuelle Latenz, die beim Durchschleusen durch den iobroker entstehen kann kein Problem ist, ist sicherlich einleuchtend. Schwieriger wird es, wenn schneller nachgeregelt werden muss.

                              Kennt noch jemand den "Magnet-Schweberegler"?

                              https://www.mikrocontroller.net/attachment/43883/Artikel_zum_Magnet-Schweberegler.pdf

                              Wäre ein so zeitkritischer Regelkreis auch mit einem iobroker Regler-Adapter möglich?

                              mcm1957 1 Reply Last reply Reply Quote 0
                              • mcm1957
                                mcm1957 @MartinP last edited by

                                @martinp
                                Sorry, dass kann ich dir nicht beantworten.

                                Die Entfernung spielt wahrscheinlich keine Rolle - wenn schon die Laufzeit des Signals am Kabel relevant wird, dann bruachen wir über Regler in Software wohl nicht sprechen. Prinzipiell ist aber ioBroker sicher nicht als Echtzeitsystem zu sehen.

                                1 Reply Last reply Reply Quote 0
                                • fu_zhou
                                  fu_zhou last edited by fu_zhou

                                  Das Verhalten von y bei Änderung von Tn bei laufendem Regler ist jetzt so, wie ich es mir gewünscht habe - danke! Die Kombinationen aus man, hold, rst, die ich jetzt mal so beim Rumspielen probiert habe, sind nachvollziehbar. @Ben1983 was meinst du?
                                  Philosophiefrage ist folgendes Szenario: Regler auf hold, dann rst = true => y bleibt stehen, dann hold = false => rst wird jetzt ausgeführt und der Regler fängt bei 0 an bzw. mit der Kp Sprungantwort. Heißt also, solange der Regler auf hold ist, bleibt das y stehen, das zum Zeitpunkt von hold ausgegeben wurde, selbst wenn rst = true gesetzt wird. Die philosophische Frage ist jetzt: so lassen oder bei hold = true führt ein rst = true zu y = 0 (das dann stehen bleibt, weil ja hold = true). Wenn dann hold = false gesetzt wird, ist das Ergebnis das gleiche (Regler startet y zu verändern ab 0), nur sieht man durch y = 0, dass rst betätigt wurde. Der Unterschied ist der Zeitpunkt, wann y = 0 wird. Einmal bei rst = true, das andere mal bei hold = false.

                                  Ah sehe gerade, dass das weiter oben schon diskutiert wurde, lasse es trotzdem mal stehen...

                                  mcm1957 1 Reply Last reply Reply Quote 0
                                  • mcm1957
                                    mcm1957 @fu_zhou last edited by

                                    @fu_zhou
                                    Ich möchte eigentlich konsequent den Y Ausgang nur bei einer Neuberechnung ändern.
                                    Warum?
                                    hold = true y=bleibt unverändert ist klar nachvollziehbar

                                    Wenn man bei hold=true auf RST reagiert, dann kommt als nächstes die Frage warum ein Ändern vion OFFS, MAN, MIN nichts ändert. Und warum sich die Änderung von SET, ACT nichts auswirkt.
                                    Das führt in einen Teufelskreis - meiner Ansicht nach.

                                    Und bei JEDER Änderung von Eingangsgrößen sofort neu zu berechnen führt bei einer Regelstrecke mit kurzer Verzögkerung (z.B. Y wirkt unverzögert auf act) zu einer Dauerberechnungsloop die den iob potenziell lahmlegt. Also auch nicht so toll.

                                    Ich würde das Ganze mal so lassen.
                                    Falls es wirklich Bedarf für ein erweitertes (!), soll heißen explizit einstellbares oder auslösbares und kompatibles Verhalten gibt, kann man natürlich über einer Erweiterung reden. Denkbar wäre z.B. ein Calculate Now Triggerstate. Ich bezweifle nur dass der Bedarf hier nennenswert ist.

                                    Insofern bitte mal den aktuellen Stand anschaun und allfällige Fehler melden. (Oder auch kurz, dass nix aufgefallen ist).

                                    Ich werde - sofern keine Probleme hier auftauchen - nach Update der Doku den Stand mal in den regularäen Beta Test (incl. Lates Request) schicken.

                                    fu_zhou 2 Replies Last reply Reply Quote 0
                                    • fu_zhou
                                      fu_zhou @mcm1957 last edited by

                                      @mcm57

                                      @mcm57 sagte in Test neuer Adapter pid (pid-Regler) V0.0.3-alpha.x:

                                      Ich würde das Ganze mal so lassen.

                                      👍

                                      Ansonsten läuft das Ding jetzt bei mir ohne Auffälligkeiten und ich nehme den Adapter mit dem aktuellen Stand mal produktiv.

                                      1 Reply Last reply Reply Quote 0
                                      • fu_zhou
                                        fu_zhou @mcm1957 last edited by

                                        @mcm57 jetzt fällt mir im Produktivbetrieb doch was auf: wenn max erreicht ist (lim = 1), in meinem Fall unten 11, wird i_sumerr schlagartig auf den 10-fachen Wert vom vorherigen Wert gesetzt und trotz großer Regelabweichung hält der Regler y bei max, obwohl y schnell kleiner werden müsste. Bei 10.9 war i_sumerr z.B. 110, dann springt i_sumerr bei Erreichen vom Limit (11) auf 1100. Und von dort kommt der Regler dann nicht mehr weg, weil vom hohen i_sumerr verhältnismäßig kleine Werte abgezogen werden bei einer Regelabweichung in die andere Richtung.

                                        564598eb-197e-41e6-b5c8-55df93993097-image.png

                                        mcm1957 1 Reply Last reply Reply Quote 0
                                        • mcm1957
                                          mcm1957 @fu_zhou last edited by mcm1957

                                          @fu_zhou
                                          Bitte aktiviere "log calculation" und poste mal die logs

                                          (https://forum.iobroker.net/topic/64250/test-neuer-adapter-pid-pid-regler-v0-0-3-alpha-x/191)

                                          Ich schau derweil mal in den Code

                                          Und fährst du "normal" oder "inverted" ?

                                          fu_zhou 3 Replies Last reply Reply Quote 0
                                          • fu_zhou
                                            fu_zhou @mcm1957 last edited by fu_zhou

                                            @mcm57 ich fahre normal, nicht invertiert.
                                            hier das log beim erreichen von max:

                                            pid.0
                                            2023-04-14 18:12:24.112	info	[C-TestRegler2] update() - {"ts":1681488744112,"act":-2,"set":-0.5,"diff":1.5,"off":0,"err":1.5,"y":11,"lim":true,"dt":501,"differr":null,"sumerr":1085,"supr":false}
                                            
                                            pid.0
                                            2023-04-14 18:12:23.612	info	[C-TestRegler2] update() - {"ts":1681488743611,"act":-2,"set":-0.5,"diff":1.5,"off":0,"err":1.5,"y":11,"lim":true,"dt":500,"differr":null,"sumerr":1085,"supr":false}
                                            
                                            pid.0
                                            2023-04-14 18:12:23.111	info	[C-TestRegler2] update() - {"ts":1681488743111,"act":-2,"set":-0.5,"diff":1.5,"off":0,"err":1.5,"y":10.999374999999967,"lim":false,"dt":501,"differr":null,"sumerr":108.49374999999966,"supr":false}
                                            
                                            pid.0
                                            2023-04-14 18:12:22.611	info	[C-TestRegler2] update() - {"ts":1681488742610,"act":-2,"set":-0.5,"diff":1.5,"off":0,"err":1.5,"y":10.991859999999969,"lim":false,"dt":500,"differr":null,"sumerr":108.41859999999967,"supr":false}
                                            

                                            und hier das log , wenn ich von act -2 auf act +3 springe, dann müsste y von max weg wieder kleiner werden, passiert aber nicht:

                                            pid.0
                                            2023-04-14 18:15:03.311	info	[C-TestRegler2] update() - {"ts":1681488903311,"act":3,"set":-0.5,"diff":-3.5,"off":0,"err":-3.5,"y":11,"lim":true,"dt":501,"differr":null,"sumerr":1135,"supr":false}
                                            
                                            pid.0
                                            2023-04-14 18:15:02.810	info	[C-TestRegler2] update() - {"ts":1681488902810,"act":3,"set":-0.5,"diff":-3.5,"off":0,"err":-3.5,"y":11,"lim":true,"dt":501,"differr":null,"sumerr":1135,"supr":false}
                                            
                                            pid.0
                                            2023-04-14 18:15:02.309	info	[C-TestRegler2] update() - {"ts":1681488902309,"act":-2,"set":-0.5,"diff":1.5,"off":0,"err":1.5,"y":11,"lim":true,"dt":501,"differr":null,"sumerr":1085,"supr":false}
                                            
                                            pid.0
                                            2023-04-14 18:15:01.808	info	[C-TestRegler2] update() - {"ts":1681488901808,"act":-2,"set":-0.5,"diff":1.5,"off":0,"err":1.5,"y":11,"lim":true,"dt":500,"differr":null,"sumerr":1085,"supr":false}
                                            

                                            und 2 Minuten später sieht es noch genauso aus:

                                            pid.0
                                            2023-04-14 18:17:57.000	info	[C-TestRegler2] update() - {"ts":1681489077000,"act":3,"set":-0.5,"diff":-3.5,"off":0,"err":-3.5,"y":11,"lim":true,"dt":500,"differr":null,"sumerr":1135,"supr":false}
                                            
                                            pid.0
                                            2023-04-14 18:17:56.500	info	[C-TestRegler2] update() - {"ts":1681489076500,"act":3,"set":-0.5,"diff":-3.5,"off":0,"err":-3.5,"y":11,"lim":true,"dt":501,"differr":null,"sumerr":1135,"supr":false}
                                            
                                            pid.0
                                            2023-04-14 18:17:55.999	info	[C-TestRegler2] update() - {"ts":1681489075999,"act":3,"set":-0.5,"diff":-3.5,"off":0,"err":-3.5,"y":11,"lim":true,"dt":500,"differr":null,"sumerr":1135,"supr":false}
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            427
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            15
                                            303
                                            35388
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo