Software PID Regler in C#

Hallo Leute,

ich muss f=FCr meine Bachelorarbeit einen Software PID-Controller schreiben der ein Heizregister ansteuert.

Die Regelstrecke ist unbekannt, die Heizung wird durch Taktung gesteuert. D.h. es liegen immer z.b.: 1kw an

Ich habe mal die Heizung auf 1 kw angemacht um eine Kurve mit Beharrungszustand zu bekommen.Daraus kann man erkennen das es sich um eine PT1-Strecke handelt. Das funktioniert alles dufte, ich bekomme alle Werte raus: T1,Ks

Nun wollte ich in Matlab die Werte simulieren um die passenen Verst=E4rkungswerte Kpr,Tn,Tv rauszubekommen. das habe ich nicht hinbekommen.

Mein C# Dump Programm funkioniert aber nicht ohne diese Werte: Es kommt als Stellgr=F6=DFe immer riesige Werte heraus. Die Periodendauer beschr=E4nke ich fest auf 20s. Aber selbst wenn ich 1 Grad vor dem Sollwert liege will noch voll mit 20s Takten. Normalerweise m=FCsste er da ja nur noch mit 3 - 4 % der max Periodendauer takten was ja nur noch

1s schalten und 19 sekunden nix machen w=E4re.

Wie bekomme ich den Wert heraus?

Reply to
multimederer
Loading thread data ...

Sprungantwort

formatting link
Matlab
formatting link
Situation
formatting link

Reply to
multimederer

So habe nochmal alles sch=F6n zusammengefasst auf meiner Homepage

formatting link

Bitte schaut es euch an und helft mir!

Reply to
multimederer

multimederer schrieb:

Einen 2 Punkt Regler mit PC und C# ? Das ist mehr als mit Kanonen auf Spatzen geschossen. Kein Wunder das es in Deutschlad bergabgeht, wenn so ein Unfug an der Uni gelehrt wird.

Andreas

Reply to
Andreas Ruetten

@Andreas

Software PID Regler! fertige Regler will die meine Firma nett.

LOL als ob du die Situation so einfach beurteilen kannst.

Wenn schon FH!

Reply to
multimederer

multimederer schrieb:

Nagut dann eben PID.

fertige Regler will die meine Firma nett.

Ist schon klar.

Ich denke schon, ich habe schon komplexe Heizungessteuerungen incl. Teigpumpensteurung und Visualisierung auf einem 8051 Derivat entwickelt. Was ich eigentlich sagen wollte ist, das C# meiner Meinung nach nicht sonderlich geeignet ist um Steuerungen zu implementieren. Für eine Zeile Code brauchts ja schon einen 40Mbyte Moloch, wo es ein µC mit 32kbytes ( Die Chinesen brauchen dafür nur einen Pic-Clone mit

512 Byte ROM :) ) tun würde.

Na gut.

Aber vieleicht wäre es besser mal den Sourcecode abzulegen, und nicht das fertige Programm, damit man mal schauen kann was das Problem sein könnte. ( Oder übersehe ich da etwas )

Andreas

Reply to
Andreas Ruetten

Hallo "multimederer"

Warum sollte sich hier jemand die Mühe machen, wenn du nochnichtmal deinen Namen weist oder in der Lage bist, eine einfache Grußformel zu verwenden?!

Gruß Thorsten

Reply to
Thorsten Ostermann

@Andreas

Mein Problem ist ja auch nicht das Programm, sondern aus der Sprungantwort z.B. 1kW.pdf, die n=F6tigen Parameter der Strecke f=FCr den PID herauszufinden, ganz konkret Kpr,Tn,Tv, f=FCr die Pid Parameter Bei mir sind diese Parameter falsch sonst w=FCrde das Programm funktionieren.

Kann ich! Tustinverfahren

Kpp ist ein zus=E4tzlicher Faktor den ich aber erstmal auf 1 Stelle

float fRegelabweichungWasser1=3DfSollwert-fIstwertNeuWasser; SummeTemphalten(float K,float t,float Tn) { //Errechnet aus gemessenem Stellgroe=DFenverlauf durschnittliche //Stellgroe=DFe //nach y=3Dmx+b die zum halten der eingestellten Endtemperatur X ben=F6tigt wird //-Tangenttengleichung mit Excel errechnet return((0.45f*Istwert+ 16.5f)/(K*t/(2.0f*Tn))); } SummeEinKproMinWasser(float K, float t, float Tn) { //inline Funktion=3D>Gesamter Ouelltext wird in den Aufruf =FCbergeben-weniger //verz=F6gerung //Errechnet aus gemessenem Stellgroe=DFenverlauf die durschnittliche //Einstiegsstellgroe=DFe in die Rampe beim //rauffahren nach y=3Dmx+b-Tangenttengleichung- mit Excel errechnet return(0.3688f*Istwert + 47.974f)/(K*t/(2.0f*Tn)); } pidberechnen() { if(fRegelabweichung1!=3D0) { fSumme=3DSummeEinKproMin(Kpr,TA,Tn);

}

else { fSumme=3DSummeTemphalten(Kpr,TA,Tn);

}

if (fStellgroesseReglerNeu-99.0f) { fSumme+=3DfRegelabweichung1+fRegelabweichung2; }

fProp=3DKpr*Kpp*fRegelabweichungW1;

fIntegral=3D(Kpr*TA*(fSumme))/(2.0f*Tn);//Berechnung des I_Anteils

fDiff=3DKpr*Tv*((fRegelabweichungW1-3*fRegelabweichung3+3* fRegelabweichung2-fRegelabweichung4)/6*TA);

fDiff=3D((fDiff+fDiff2+fDiff3+fDiff4)/4);//Mittelwert f=FCr ein besseres Ergenis fDiff=3DfDiff3; fDiff=3DfDiff2; fDiff2=3DfDiff; fStellgroesseReglerNeu=3DfProp+fIntegral+fDiff; //Stellgr=F6=DFe=3DP+I+D

fRegelabweichung4=3DfRegelabweichung3; fRegelabweichung=3DfRegelabweichung; fRegelabweichung=3DfRegelabweichung; if (fStellgroesseReglerNeu>=3D100.0f) //darf nicht gr=F6=DFer als +-100 sein { fStellgroesseReglerNeu=3D100.0f; } if (fStellgroesseReglerNeu

Reply to
multimederer

te schaut es euch an und helft mir!

Dem kann man nur zustimmen.

Also wenn du schon mit C# rummachst dann schreib doch eine Funktion die ganz simpel deine Strecke simuliert. Das ist ein 4 Zeiler (PT1 Glied in SW) Denk dran das in die Regelung und die Strecke deine ATR eingeht. Noch besser nimm Papier und Bleistift, Ziegler Nichols oder so, dann hast du schon einen Ausgangspunkt. Und wenn du schon mit dicken Eisen rechnest, google doch mal nach Luenberg Beobachter, da kannst du dann deine Totzeiten eliminieren,,aber das scheint dann schon Master-Prüfung zu sein.

Grüße

Markus Greim

Reply to
Markus Greim

multimederer schrieb:

Wenn das nicht ein spezielles Feature von C# ist, dann könnte hier der Fehler liegen.

Gruss, Jens

Reply to
Jens Carstens

~~ ~~~~~~~~~~~~

~~ ~ ~

Gruslig!

Nick

--
Motormodelle / Engine Models:

Ellwe 2FB * VTM 87 * DLM-S3a * cubic
more to come ...
Reply to
Nick Müller

@jens da habe ich mich verschrieben. habe es extra f=FCrs forum anders aufgeschrieben richtig sollte es so heissen:

fRegelabweichung4=3DfRegelabweichung3; fRegelabweichung3=3DfRegelabweichung2; fRegelabweichung2=3DfRegelabweichung1;

Das dient dazu die alten Werte zu speichern da ich sie noch brauche zum berechnen des D-Teils.

( Kp*Tv*(-Xd-(3*Xd)+(3*Xd)+Xd) )/(6*TA) Differentialalgorithmus einer Mittelwertbildung nach Typ 4 und diese Xd sind meine Regelabweichungen.

@all Nur weiss ich immer noch nicht wie ich jetzt meine Werte f=FCr Tv,Tn,Kp simuliere!!!!! =DCberall in der Literatur oder im Intenet steht:"Und dann habe ich es in den Simulator eingegeben und die Werte rausbekommen". Herzlichen Gl=FCckwunsch. Gibt es hier keinen Simulink-Guru?

Reply to
multimederer

@Nick Was ist dendaran gruslig? Das ist eine sehr unkryptische Zeile, wo jeder Benuzter hier sofort erkennt wie man die Periodendauer ausrechnet!!!!! Stellgr=F6=DFe/100 : Stellgr=F6=DFe in Prozent (Stellgr=F6=DFe/100)*20s : Zeit wie lange geschaltet wird bei 20s Periodendauer

@all Mir geht das gemeckere tierisch auf den Keks. Eure doofen Kommentare k=F6nnt ihr woanders hinschreiben!!!!

Reply to
multimederer

Zum Realnamen reichts offensichtlich immer noch nicht ...

... also ist der Eifer hier etwas gedämpft. Wenn man aber schon mit groops.google rumtut kann man ja diese newsgroup nach PID googlen, das Thema taucht häufig auf.

MfG JRD

Reply to
Rafael Deliano

Das quoting (und so). [darum mach ich das jetzt]

~~ ~~~~~~ Kommentar und code stimmen nicht überein. Der code ist suboptimal. Besser wäre ein Konstrukt wie: if (abs(x) > 100.0) { x = 100.0 * sign(x); // Vorzeichen behalten } Da werden aus 6 Zeilen plötzlich 3 die richtig und klar sind.

Die sinnlose Klammersetzung (da würde ich mangelnde Mathematikkenntnisse draus ableiten)

Andere Fehler haben Andere auch schon gefunden. Hier noch paar: Scheinbar gibt es auch keine Arrays in C# um darin fRegelaweichung abzulegen. Auf fRegelabweichungW1 wird nur lesend zugegriffen, unwarscheinlich dass es den gewünschten Wert enthält. Inline-Funktionen. Was gibt's denn dafür einen Grund, ausser dass man nur einen 90MHz Penzibrumm hat. Abgesehen davon, dass sie nirkwo verwendet wird. Undsoweiter. _Gruslig_ eben!

Würde zu mir einer kommen und fragen ob ich ihm bei der Fehlersuche helfen würde, wäre meine Antwort, dass er zuallererst mal selbst den code _kritisch_ durchschaut. In der Zwischenzeit wären die Entlassungspapiere fertig. Wenn derjenige Programmierer wäre.

Gruß, Nick

--
Motormodelle / Engine Models:

Ellwe 2FB * VTM 87 * DLM-S3a * cubic
more to come ...
Reply to
Nick Müller

@Rafael Ich habe echt das ganze Internet abgegoogled. Das macht kein Mensch mit nen Software PID. Im Intenet findet man nur die Therorie.

sebi

Reply to
multimederer

formatting link
Heft 2 S. 6 hat eine leicht lesbare Darstellung zu PID in Software.

Bezüglich C# : man wird keinen fertigen Code in dieser Sprache finden, sie ist eher ungeeignet. Andererseits ist die Berechnung relativ trivial sodaß Sprache keine Rolle spielt.

Bei kleinen Controllern wird Regler mit fester Abtast- frequenz arbeiten, dann sind die Konstanten fest. Bei PC ( oder allem was gut multiplizieren kann ) wäre es auch möglich, das Programm in Schleife laufen zu lassen und Timer zu lesen. Anhand der Zeitdifferenz zum letzten Sample kann man dann Konstanten skalieren. Man erreicht dadurch höhere Abtastfrequenz und damit bessere Regelung. Gleichzeitig gleicht man dadurch Verzögerungen automatisch aus wenn das Betriebsystem unerwünschte Interrupts einfügt. Die Skalierung ist für "P-Faktor" nicht nötig, für "I" einfach, bei "D" kanns schwierig werden.

Dafür ist Ziegler & Nichols ( bzw. ähnliche Verfahren ) zuständig. Man sollte sich mal Lutz, Wendt "Taschenbuch der Regelungstechnik" Verlag Harri Deutsch aus der Bibliothek holen. Jedoch muß man berücksichtigen, daß Z&N aus historischen Gründen für eine Serienanordnung des PID-Reglers gedacht ist, während man ihn ( wegen der Patches für I-Anteil ) auf Controller eher in Parallelschaltung implementieren wird. Dadurch ändern sich die Parameter. Altmodisch & Faulheit fördernd: Erwin Samal" Grundriß der praktischen Regelungstechnik Band II" Oldenbourg 1970 hat einen "Atlas der Regelungstechnik" wo übliche Sprungantworten und übliche Einstellungen des PID-Reglers samt erreichbaren Sprungantworten katalogisiert sind.

Es mag zwar sein, daß die Rauschunterdrückung durch solche Diffrenzierer günstiger ist ( vgl. auch

formatting link
Heft 6 S. 17 ) aber der Differenzierer für Z&N ( und die gesamte klassische Regelungstechnik ) ist erstmal simpel einpoliger IIR. Man sollte es erst mit dem machen und dann bei Rauschen komplizierteres nachrüsten.

Bezüglich Tests: es macht wenig Sinn ungetestete Software gegen echte Regelstrecke laufen zu lassen, weil dann beide Mucken haben. Es kann sinnvoller sein die Sprungantwort der Regelstrecke aufzunehmen und sie dann durch einen groben Dummy aus RC-Gliedern, Operationsverstärkern zu ersetzen. Anhand dem kann man dann die Software stabil bekommen und dann erst an die echte Regelstrecke gehen.

MfG JRD

Reply to
Rafael Deliano

Danke Rafael!

Das sind doch mal endlich interessante Infos. Ich werde sehen was ich daraus machen kann. Auf solche Antworten warte ich!!!!

Gru=DF sebi

Reply to
multimederer

Hallo,

"multimederer" schrieb im Newsbeitrag news: snipped-for-privacy@g44g2000cwa.googlegroups.com... [....]

ich hab mir Dein Simulink-Modell angesehen und bin der Meinung, daß da so einige Unklarheiten und Fehler sein müßten. Bevor Du was in C mit dem Rechner programmierst, sollte das Modell erstmal laufen. Ein PID-Algorithmus ist nichts weiter als ein digitales IIR-Filter, damit würde ich mich zum Schluß beschäftigen, bevor Du die anderen Probleme gelöst hast. Ich selbst bin nicht in der Automatisierung tätig, kann aber trotzdem einiges erkennen, so von meinen Grundlagenkenntnissen her.

Ich würde erstmal von Anfang an systematisch an die Sache herangehen. Die Sprungantwort des Ofens habe ich gesehen. Mir fällt auf, daß bei einem Wärmetransport keine Laufzeit oder Totzeit zu sehen ist, aber das kann ja so sein. Dann wundert mich, daß Du das Abkühlverhalten nicht aufgenommen hast, denn das wird doch sicher anders sein, schätze ich mal so ab. Das würde bedeuten, daß Du streng genommen die PID-Koeffizienten umschalten mußt je nach Aufheizen oder Abkühlen, ohne die gespeicherte Energie im Filter zu verlieren, alles machbar.

Dein Simulink-Modell ist, so wie Du es ins Netz gestellt hast, erstmal unverständlich. Ich hatte verstanden, daß Du einen 2-Punktregler entwickeln wolltest, das ist aber keiner, ich sehe keinen Schalter. Dann ist ein fataler Fehler vorhanden im PID-Regler:

u1 >=1000

kann nur heißen

u1

Reply to
Winfried Salomon

@Winfried

ie

ja

men

en mu=DFt

r zu

Das stimmt! F=FCr das Abk=FChlverhalten muss ich die Werte auch noch aufnehmen und dann das ganze auch wieder simulieren, damit ich meine Kp,Tv und Tn rausfinde.

Ausserdem habe ich noch verschiedene kW (1-9) Stufen, wo ich verschiedene Temperaturbereiche nutzen will (z.B. bei 1kw von 20=B0-

70=B0C),damit die Steigung nicht unter 0.5k/min geht(VDE-Vorschrift). Diese Werte bei wieviel Kw welche Temperatur haben die Diplomanden vor mir schon rausgefunden, die das ganze mit dem Mikroprozessor anno '94 angesteuert haben.

Bl=F6d ist nur das der Beharrungszustand von =FCber 3kW jenseits von 300 =B0C liegt wo bei mir aber Schlu=DF ist, weil dann die Temperatursicherung schaltet. Ob Scheibenthermostate gepr=FCft werden die jenseits von 220=B0C liegen muss ich noch nachfragen.

Interessant ist noch das ich mit einer bestimmten Steigung 0.5/min oder

1/min die Kurven fahren muss.

Ich probiere jetzt erstmal die Simulink-Werte so zu ver=E4ndern wie du es gesagt hast.

Gru=DF=20

Sebastian

Reply to
multimederer

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.