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
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!
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?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.