-         

Ergebnis 1 bis 3 von 3

Thema: PIDT1-Regler Implementierung

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379

    PIDT1-Regler Implementierung

    Anzeige

    Hallo!

    Um möglichst direkt auf den Punkt zu kommen: Ich habe bereits an verschiedenen Stellen digitale PID-Regler verwendet - sonderlich schwierig ist das ja auch nicht. Allerdings muss ich zugeben, dass ich mir die Sache nie ganz zu Ende überlegt habe, auch wenn mir der D-Anteil schon immer irgendwie etwas seltsam vorkam . Das Problem bei einem "digitalen D-Anteil" ist ja wohl, dass er immer nur instantan wirken kann, also von Sample zu Sample. Ich habe in dieser Sache etwas recherchiert, und siehe da, das ist natürlich ein alter Hut: man sollte sinnvollerweise einen PIDT1-Regler verwenden, also ein D-Glied mit exponentiellem Abfall.
    Auf der Diskussionsseite zum RN-Wissen Artikel "Regelungstechnik" ist ja sogar ein Codeschnipsel, der angeblich ein solches Verhalten implementiert (http://www.rn-wissen.de/index.php/Di...gelungstechnik). Allerdings habe ich diesen nicht so richtig verstanden und mich deshalb daran gemacht, die Sache selbst zu implementieren (was am Ende ja oft schneller geht, als anderer Leute Code zu verstehen…). Um nun meine eigentliche Frage allen weiteren Details vorweg zu nehmen: Mein Regler tut qualitativ was er soll, sprich: die Sprungantwort sieht so aus, wie sie aussehen soll. Ich bin mir aber unsicher, ob die Dinge auch quantitativ stimmen, ob also die Werte, die ich aus den typischen Parametrisierungsverfahren erhalte, den DT1-Anteil korrekt gewichten.

    Zunächst mal etwas Code. Das ist so eine Art Pseudocode, also keine bestimmte Programmiersprache, die Sache ist ja ziemlich "klartext".

    Code:
    do
       //aktuelle regelabweichung
       e = soll - ist;
       
       //P-Anteil
       P = e * kp;
        
       //I-Anteil
       I = esum * ki * ta;
      
       //DT1-Anteil
       //grundlage: out(i) = a0 * in(i) + a1 * in(i-1) + b1 * out(i-1);
       DT1 = a0 * e + a1 * ealt + b1 * DT1;
       
       //zu PIDT1 kombinieren
       PIDT1 = P + I + DT1 * kd; 
        
       esum = esum + e;
       ealt = e;
    loop
    P- und I-Anteil sind hier unproblematisch. Die Werte Ki und Kd berechne ich aus Tn und Tv, diese erhalte ich neben Kp aus den klassischen Einstellregeln (bzw. durch probieren), ta ist die Abtastzeit (also der zeitl. Abstand zwischen zwei Samples). Meine Herangehensweise an den DT1-Anteil war: DT1 müsste ja ein einfacher Hochpass sein, den man in diesem Anwendungsfall am besten als rekursiven Filter implementiert. Also habe ich da nochmal nachgelesen und komme zu dem Ergebnis:

    out(i) = a0 * in(i) + a1 * in(i-1) + b1 * out(i-1)

    Wobei in[i] das Eingangs- und out[i] das Ausgangssignal zum Zeitpunkt i sind. Wie ich aus der gewünschten Zeitkonstante die Parameter a0, a1 und b1 bestimme, ist mir klar. Ich habe außerdem gelesen, dass man die Zeitkonstante des DT1-Gliedes auf Tv/4 stellt. Somit kann ich den nötigen Hochpass umsetzen. Nun soll ja aber nicht nur die Zeitkonstante des DT1-Gliedes von Tv abhängen, sondern auch das "Gewicht" mit dem es in den PIDT1-Wert eingeht, zumindest setze ich das mal voraus, denn beim reinen PID-Regler ist es ja (nachvollziehbarerweise) auch so. Ist es also korrekt, wenn ich, analog zum PID, den DT1-Anteil nochmal mit Tv gewichte? So habe ich es im Code getan, wie man sieht.

    Ich hoffe ich habe mich halbwegs verständlich machen können, ich würde mich wirklich freuen, wenn jemand die Mühe auf sich nehmen könnte, die Sache einmal im Detail nachzuvollziehen.

    Ich danke schonmal sehr!
    Malte

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379
    Hallo!

    Leider wusste ja noch niemand was zu meinem Problem zu sagen. Ich wollte sicherheitshalber nochmal nachfragen, ob das ggf. an meiner zu knappen/ schlechten Darstellung des Problems liegt. Ich bin natürlich jederzeit gerne bereit, noch zusätzliche und ausführlichere Informationen zu geben.

    Wenn ansonsten niemand so recht Lust hat, sich im Detail durch den Gedanken zu wurschteln - was ich verstehen könnte - wäre mir auch schon mit einem kleinen Stück Code geholfen, egal welche Sprache, der einen PIDT1-Regler korrekt implementiert. Den könnte ich dann mit meinem Machwerk vergleichen.

    Also: wäre nett, wenn diejenigen, die vielleicht im Prinzip helfen könnten, mir kurz sagen, welche Informationen zu meinem Problem ich noch nachliefern sollte.

    Dank Euch!

    Malte

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    Hallo Malthe,

    ich bin vor Monaten schonmal über den Beitrag hier gestolpert - einfach auf der Suche nach genau dieser Lösung.
    Bin dann der Lösung aber gänzlich aus dem Weg gegangen, indem ich den D-Anteil auf 0 gelassen habe.

    Welche Lösung hast du gefunden - hast du einen DT1-Anteil umgesetzt?

    Gruß BoGe-Ro

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •