Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage PID-Regler


von Asmin (Gast)


Lesenswert?

Hallo zusammen,

ich möchte einen geschlossenen Regelkreis mit PID-Regler und 
PT1-Regelstrecke simulieren. Das ganze in LabView mit Formelknoten, aber 
das ist erstmal egal.
Das ganze folgendermaßen:

float w[1000]   ist der Sollwert mit Sprung ab w[1000] von 3 auf 7
float y[1000]   ist die Regelabweichung
float x1[1000]  ist die Stellgröße
float x2[1000]  ist die Sollgröße

...

for(int i=0; i<1000; i++)
{
  if(i<998)
  {


    //Stelle 1

    x1[i+2] = xh1[i+1] + Kr*((1+dt/Ti + Td/dt)*y[i+2] +
              (-1-2*Td/dt)*y[i+1] + (Td/dt)*y[i]);       //PID-Regler
    x2[i+1] = x2[i] + dt/Ts*(Ks*x1[i]-x2[i]);            //PT1-Stecke

   //Stelle 2

   }
}

Die Frage ist, an welcher STelle wird jetzt die Regelabweichung 
berechnet?
An Stelle 1 oder Stelle 2, vor allem welche Komponente? y[i+2], y[i+1], 
oder y[i]? Würde y[i] = x2[i] - w[i] stimmen?

: Verschoben durch User
von Stefan (Gast)


Lesenswert?

Nach meiner Weltanschauung muss zuerst die Regelabweichung berechnet 
werden, da diese das Eingangssignal des Reglers ist.

>Würde y[i] = x2[i] - w[i] stimmen?
Ja, wenn x2 die (gemessene) Ist-Größe wäre... und nicht wie oben 
beschrieben die Sollgröße!

von Asmin (Gast)


Lesenswert?

Stefan schrieb:
>>Würde y[i] = x2[i] - w[i] stimmen?
>
> Ja, wenn x2 die (gemessene) Ist-Größe wäre... und nicht wie oben
>
> beschrieben die Sollgröße!

Ich meinte auch y[i] = w[i] - x2[i]. Habs auch so auch direkt 
substituiert in meiner Schleife, aber es funktioniert nicht.

Jetzt mal von PID abgesehen. Kann mir jemand die paar Zeilen 
Programmcode in der Schleife schreiben, für ein geschlossenen Regelkreis 
mit einem PI-Regler und einer PT1-Regelstrecke?

von Karl H. (kbuchegg)


Lesenswert?

Asmin schrieb:
> Stefan schrieb:
>>>Würde y[i] = x2[i] - w[i] stimmen?
>>
>> Ja, wenn x2 die (gemessene) Ist-Größe wäre... und nicht wie oben
>>
>> beschrieben die Sollgröße!
>
> Ich meinte auch y[i] = w[i] - x2[i]. Habs auch so auch direkt
> substituiert in meiner Schleife, aber es funktioniert nicht.

Ich frag mich zb, wo du in
   Kr*((1+dt/Ti + Td/dt)*y[i+2]

das y[i+2] hernehmen willst, wo du doch gerade erst mal y[i] berechnet 
hast.

> Jetzt mal von PID abgesehen. Kann mir jemand die paar Zeilen
> Programmcode in der Schleife schreiben, für ein geschlossenen Regelkreis
> mit einem PI-Regler und einer PT1-Regelstrecke?

Fang schrittweise an.
Zunächst nur der PID Regler und da auch nur der P-Anteil.

Wenn wir mal annehmen, dass die Stellgröße gleich der 'gemessenen' 
Ist-Größe ist, dann lautet doch ein einfacher P-Regler


  for( i = 0; i < 1000; ++i ) {

    y[i] = w[i] - x[i];
    x[i+1] = Kp * y[i];
  }

den bringst du zum laufen.
Und dann ergänzt du den I-Anteil danach den D-Anteil etc.

Es bringt nichts gleich von vorne herein mit komplizierten Formeln 
loszulegen, nichts funktioniert und man weiß nicht wo man anfangen muss. 
Zumal ein PID Regler mit den Regelkoeffizienten steht und fällt.

von xenon (Gast)


Lesenswert?

Die Regelfrequenz spielt auch eine Rolle..

von Asmin (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wenn wir mal annehmen, dass die Stellgröße gleich der 'gemessenen'
>
> Ist-Größe ist, dann lautet doch ein einfacher P-Regler
>
>
>
>
>
>   for( i = 0; i < 1000; ++i ) {
>
>
>
>     y[i] = w[i] - x[i];
>
>     x[i+1] = Kp * y[i];
>
>   }

Genau folgendes verstehe ich nämlich nicht:  x[i+1] = Kp*y[i];
Die Formel für einen P-Regler im Zeitbereich ist doch: x(t) = Kp*y(t).
Wieso rechnest du x[i+1] und nicht x[i]?
Also laut der allgemeinen Formel hätte ich jetzt x[i] = Kp*y[i] 
geschrieben.

von Karl H. (kbuchegg)


Lesenswert?

Asmin schrieb:

> Genau folgendes verstehe ich nämlich nicht:  x[i+1] = Kp*y[i];
> Die Formel für einen P-Regler im Zeitbereich ist doch: x(t) = Kp*y(t).

Kannst du auch machen.

> Wieso rechnest du x[i+1] und nicht x[i]?

Weil ich gerne hätte, dass wenn ich die Daten auswerte ich die lesen 
kann als


   x      Wert der zum Stellglied ging
   y      Regelabweichung die sich daraus ergeben hat

sprich: in deinem Array - für ein ganz bestimmtes i hab ich in einer 
Zeile stehen, den Wert den ich als Stellgröße vorgegeben habe und im y 
daneben steht dann der daraus resultierende Fehler. Aus diesem Fehler 
ergibt sich der nächste Wert für die Stellgröße usw. usw.

D.h. der Lesefluss in den Arrays ist so
1
i     x                  y
2
----------------------------
3
4
0     o----------------> o
5
                         |
6
      +------------------+
7
      |
8
      v
9
 
10
1     o----------------> o
11
                         |
12
      +------------------+
13
      |
14
      v
15
16
2     o----------------> o
17
                         |


Für mich ist es logischer, die Zeile mit dem x anfangen zu lassen. Weil 
ich ja zunächst mal eine Stellgröße vorgeben muss, ehe ich überhaupt zu 
einem Fehler kommen kann. Für dich mag das anders aussehen.
Ich seh die Sache halt so: Am Anfang eines Zeitintervalls i stelle ich 
die Stellgröße ein und am Ende des Zeitintervalls hol ich mir den daraus 
resultierenden Ist-Wert um daraus die Stellgröße für das nächste 
Zeitintervall zu berechnen. Bei mir vergeht halt die Zeit nachdem ich 
die Stellgröße gestellt habe. Also praktisch gesehen im waagrechten 
Pfeil.

> Also laut der allgemeinen Formel hätte ich jetzt x[i] = Kp*y[i]
> geschrieben.

Kannst du auch machen.
Du musst nur für dich wissen, wie die Werte zusammenhängen und welcher 
Wert sich aus welchem anderen Wert ergibt, wenn du deine Log-Arrays 
studierst.

In einem realen PID Regler existieren ja die Arrays sowieso nicht mehr. 
Die sind ja jetzt sowieso nur für dich eine Hilfe, damit du im 
Nachhinein verfolgen kannst, was deine Regelgleichungen gemacht haben 
und wie sie den x-Wert nachgeführt haben.

von Asmin (Gast)


Lesenswert?

Eigentlich dachte ich, dass es von der Rücktransformation aus der 
z-übertragungsfunktion abhängt, ob ich x[i+1] oder x[i] oder sonst was 
hinschreibe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.