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

Re: PID-Regler Kategorie: Programmierung (von guido - 9.12.2004 21:23)
Als Antwort auf Re: PID-Regler von krassos - 8.12.2004 22:02
Ich nutze:
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
>
Danke für den Tip das mit der int habe ich im eifer gar nicht bemerkt (schäm)

Das mit Exel ist ne gute Idee danke nochmal

Mfg Guido


    Antwort schreiben


Antworten:

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)