Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: PID-Regler Kategorie: Programmierung (von krassos - 8.12.2004 22:02)
Als Antwort auf Re: PID-Regler von guido - 8.12.2004 19:58
Ich nutze:
C-Control II Unit, CC2-ReglerBoard, OSOPT V3.0
> Hallo
>
> ich habe versucht den PID-Regler von Krassos als Regler für meine Kesselkreispumpe einzusetzen.
> Leider bleibt die Unit immer hängen wenn ich den Regler starte und ich weis nicht warum.
> ich habe für die Werte tv und tn erstmal 0.1 eingesetzt als ausgang sozusagen.
> dann habe ich für kp 0.01 eingesetzt ist das io ???
> ich denke ich poste mal den Code dann kann man sich das leichter vorstellen.

Uff,

ich werd mir mal Mühe geben, mich in das Konstrukt reinzudenken.

>
>

//[mal eben gelöscht wegen der übersichtlichkeit]
 
> /*****************************************************************/
> //Pumpe 2
> /******************************************************************/
> /* PID-Regler
> /*
> /* Author    : Andreas Sperling
> /* Vorlage   : Andreas Sperling
> /* Version   : 0.4
> /* Datum     : 29. Juni 2004
> /* geändert  : 03. Juli 2004
> /* Getestet  : ja
> /* Benötigt  :
> /*
> /******************************************************************/

> /*
> Geändert: I-Anteil arbeitet nur innerhalb des Proportionalbandes
> Dadurch wird die �berschwingweite bei grossen Führungssprüngen oder
> grossen Störgrössen verringert.
>
> Geändert: Abtastzeit ta wird innerhalb der function berechnet.
> */

> /*
> w Sollwert
> x istwert
> ta abtastzeit
> tv vorhaltezeit (D-Anteil)
> tn nachstellzeit (i-anteil)
> kp proportionalanteil
> */

> function pid2 (int w,int x,int tv,int tn,float kp) returns int
> {
> int y1;float e,y,diff1;
> z1=system.timer();
> ta=(z1-z2);ta=ta/twox;z2=z1;if ta<0.1 or ta>20.0 ta=1.0; //Abtastzeitermittlung
> e = w - x;//regelabweichung
> if kp*e<500 es = es + ((ea + e) / two);else es=0.01; //i-speicher
> diff1=e-ea;
> kd = (kd+tv / ta * diff1)/two; //D-anteilsberechnung und d-Anteil ausklingen
> y = kp * (e +(ta / tn * es) + kd); //stellwertsberechnung
> y=y*(-1); //wert invertieren
> y1=y;
> if tempaus.value[4]>700 y=14999;
> if y>14999 or y<4499
> {
> if y>14999 y1=14999;
> if y <4499 y1=4499;
> if y <3000 y1=0;
> }
> ea = e;
> return y1;
> }
> //---------------------------------------------------------------------------
> //init und ausgabe der PWM ports
> //---------------------------------------------------------------------------
> int pid[5],out,out2;
> float d[2];
>
> //************
> thread main
> //************
> {
> pid[0]=0.1;
> pid[1]=0.1;
> pid[2]=0.1;
> pid[3]=0.1;


Die Parameter die du hie vorgibst, sind float. In der Funktion wird int erwartet.
Also übergibst Du hier 0. Division durch Null führt zum Absturz.


>
>
> d[0]=0.01;
> d[1]=0.01;
>
>  plm.settimebase(0,5);
>  plm.settimebase(1,5);
>  plm.setmode(0,0);
>  plm.setmode(1,0);
>  plm.setperiod(0,15000);
>  plm.setperiod(1,15000);
>  plm.out(0,-1);
>  plm.out(1,-1);
> loop
>    {
>
>   out=pid1(500,tempaus.value[0],pid[0],pid[1],d[0]);
>   if regelung3.oelp==1 plm.out(0,out);
>   else plm.out(0,0);
>  
>   out2=pid2(600,tempaus.value[4],pid[2],pid[3],d[1]);
>   if regelung3.holzp==1 plm.out(1,out2);
>   else plm.out(1,0);
>
>     }
> }
> //---------------------------------------------------------------------------
>
>

> Die Invertierung erfolgt weil ich einen Festen Sollwert für den Kessel vorgeben möchte. Um
> Kondensat zu vermeiden einmal bei K1 50.0°C und bei K2 60.0°C und da venn der vorgabe Wert
> grö�er als der Istwert ist die Pumpe laufen soll habe ich das Signal Invertert das ist alles.
>
> Ich hoffe Ihr könnt helfen


Ich bin an meine Solarpumpe wie folgendermassen rangegangen:
Die Funktion hab ich auf excel-vba portiert und dann das ganze für statische,
von mir erwartete Soll- und Istwerte simuliert.
Daraus kannst Du zumindest die Ergebnisse des Reglers im statischen Betrieb abschätzen.


Ich hab grade eben noch ein Modul für die Sprungantwort gefunden:

'pid-testalgorithmus
'versuchskonfiguration
' ta= abtastzeit
'tn=nachstellzeit (i-Anteil)
'tv=vorhaltezeit (d-Anteil)
'kp=proportionalbeiwert (p-Anteil)

Sub testpid()

es = 0
ea = 0
ea3 = 0
 w = Cells(9, 3).Value  'w steht in C9 (für Sprungantwort =1)
 
 tn = Cells(11, 3).Value 'tn in C11
 tv = Cells(12, 3).Value    'tv in C12
 kp = Cells(13, 3).Value    'kp in C13
 ta = 1

For t = 0 To 251
x = Cells(t + 4, 7).Value   'Der Startwert für x steht in G4 (für sprungantwort =0)
'x = Cells(t + 5, 7).Value
'ta = t + 1
e = w - x 'regelabweichung
es = es + (ea + e) / 2 'i-speicher
If e - ea > 0 Then

kd = tv / ta * (e - ea)


Else:
If kd > 0.5 Then

kd = kd * (1 - 1 / kd)
Else: kd = 0
End If
End If
y = kp * (e + (ta / tn * es) + kd)

ea = e


'Hier werden ab Zeile 5 Ausgaben berechnet. Diese lassen sich sehr schön als Diagramm darstellen
' und stellen das Reglerverhalten dar. Hier können sehr schön verschiedene Werte für
' die Parameter simuliert werden
Cells(t + 5, 4).Value = y
Cells(t + 5, 5).Value = e
Cells(t + 5, 6).Value = ea
Cells(t + 5, 7).Value = Cells(t + 4, 7).Value + y
Next t

End Sub


GruÃ? krassos


    Antwort schreiben


Antworten:

Re: PID-Regler (von guido - 9.12.2004 21:23)
    Re: PID-Regler (von krassos - 9.12.2004 21:48)
        Re: PID-Regler (von Guido - 1.03.2005 17:46)
            Re: PID-Regler (von krassos - 7.03.2005 15:57)
                Re: PID-Regler (von krassos - 7.03.2005 21:57)
                    Re: PID-Regler (von guido - 10.03.2005 17:37)
                       Re: PID-Regler (von guido - 13.03.2005 14:55)
                          Re: PID-Regler (von krassos - 16.03.2005 21:41)
                             Re: PID-Regler (von krassos - 8.04.2005 17:34)
                                Re: PID-Regler (von Guido - 13.04.2005 21:21)
                                   Re: PID-Regler (von krassos - 14.04.2005 5:01)
                                     Re: PID-Regler (von Guido - 14.04.2005 19:50)