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

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> Hier eine etwas geänderte Version der function: ( ein paar erläuternde Worte nachfolgend) > > <code> > /******************************************************************/ > /* 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 > */ > //konstanten für die berechnungen > const two = 2.0; > const tree = 3.0; > const zero = 0.0; > const twox = 2000.0; > // ****************************** > float ea; > float es,kd; > long z1,z2; > string diff,integral,zeit; > float ta; > function pid (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 > y1=y; > if y>500 or y<0 > { > if y>500 y1=500; > if y <0 y1=0; > } > ea = e; > //*****************************// > //kontrollanzeigen für den experimentellen betrieb > str.putfloatf(integral,ta / tn * es,3);str.putfloatf(diff,kd,3); > rblcd.clear(); > rblcd.print(diff);rblcd.print(" "); > rblcd.line(2);rblcd.print(integral);integral="";diff=""; > //*****************************// > return y1; > } > </code> > > Also das Programm rundherum hängt natürlich stark von der Regelaufgabe ab. > Zu den Parametern: > w- INT - hier wird der Sollwert übergeben. Das int-format sollte bei den meisten aufgaben genügen. > > x - int - hier wird der (gemessene) Istwert der Regelstrecke übergeben. > > Bei einer einfachen Temperaturregelung wäre x also die aktuelle Temperatur und w > die Solltemperatur. Bei einer anspruchsvolleren Solarkollektorpumpe wäre w die Differenztemperatur > Kollektor-Speicher und x die Kollektortemperatur. > > Der Rückgabewert kann direkt in eine entsprechende PLM-Ansteuerung weitergereicht werden. > Für einen quasistetigen Temperaturregler reicht als Ausgang ein Digitalausgang. > Mein quasistetigregler hab ich im Test mal so gestaltet: > > <code> > int m2,y; > thread tick > > { > loop > { > sleep 40; > regel.m2 = regel.m2 + 1; > if regel.m2 > 500 regel.m2 = 0; > } > } > > function raum1(int w,int x) > { > int tv,tn; > float kp; > tv=2;tn=110;kp=30; > y=pidtest.pid(w,x,tv,tn,kp); > if y>m2 rbports.set(2,1); else rbports.set(2,0); > } > > thread main > { > > run tick; > > > > } > </code> > > tv -float- Vorhaltezeit definiert die größe des d-Anteils im regler. > je größer, um so stärkere Reaktion des d-Anteils. Abschalten durch tv=0. > > tn-float- nachstellzeit. definiert den I-Anteil im regler. Je kleiner, um so stärker wirkt der I-Anteil. > abschalten durch sehr große Werte. > > tv und tn sind auf sekunden normiert (durch die ta berechnung innerhalb der function). > > kp-float- definiert den Proportionalanteil im regler. > > Eine Einstellung der Parameter von Hand erfordert etwas Gefühl und beobachtung der > einzelnen Anteile im Regler. > > Richtwerte kann man wie folgt berechnen: > tu bezeichne die Totzeit der Regelstrecke. Als Totzeit bezeichnet man die Summe aller Zeiten vom > anlegen eines Eingangssignals (beispiel heizung an) bis zu einer Reaktion der Regelstrecke > ( beispiel messwert am Temperaturfühler beginnt zu steigen) > > tg bezeichne die Ausgleichszeit der Strecke. Die Ausgleichszeit ist die Zeit von der ersten Reaktion > bis zum erreichen des endwerts (bzw. dessen nähe). Die Ausgleichszeit beginnt also nach der Totzeit. > > Jetzt die Regelparameter: Recht brauchbare Werte kann man mit folgender Formel berechnen: > kp=0,6...0.95*tg/tu > tv=0,2...0,5*tu > tn=1...5*tu > > Viel Spass beim probieren. > > krassos > > PS: Die praktische Einstellung der Parameter erfordert geduld und Spucke. > Im Einzelfall würde ich das aber gern hier diskutieren.
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB