servus, ich arbeite mich gerade in das thema regelungstechnik ein. ich möchte den wasserdruck (0-2 bar) mit einer pumpe (1-5V bzw 0- 16300 DA Wandler) regeln die errechneten parameter stimmen jedoch nicht mit den funktionierenden parametern überein. realisiert wird das ganze mittels sps (codesys) und ethercat klemmen, sowie einer kreiselpumpe. zuerst nehme ich die sprungantwort in einem array auf. 250 druckwerte, wenn die pumpe von 8000-12000 erhöht wird und 5 sekunden läuft. aus den messwerten errechne ich dann mittels wendetangente die werte kp und ki. die parameter gebe ich dann an einen pi-reglerbaustein aus der oscat-lib. die erechneten werte liegen bei kp ca 1 , ki ca 117. wenn ich nun aber mit diesen werten den regler betreibe er ist super langsam. mit werten wie ki = 10000 und kp = 0.5 läuft alles prima. was übersehe ich? was mache ich falsch? helft mir azubi auf die sprünge!
Du wirst irgendwo einen Fehler haben. Glaskugel ist bis Mittwoch ausgeliehen.
Liegt bestimmt an der Unschärfe ;-P .... kleiner Witz am Rande auf Kosten des Gastes... Mein Vorredner hat schon gesagt ohne mehr Infos geht da nix. Das einzige STichwort was mir spontan einfällt analog-digital richtig umgerechnet?
ok hier etwas quellcode, scheint vom prinzip aber ja schon mal richtig gedacht zu sein.
1 | (****Regelstrecke aufnehmen****) |
2 | IF isAufnahme = true THEN |
3 | DuoPumpe:=6000; |
4 | MyTrigger(IN:= DoTrig , PT:= T#5S , Q=> OutTrig, ET=> Zeit2); |
5 | DoTrig:= TRUE; |
6 | IF OutTrig = TRUE AND Messdurchgang <=250 THEN |
7 | DuoPumpe:= 12000; |
8 | Regelstrecke[Messdurchgang]:= Druck1; |
9 | Messdurchgang := Messdurchgang +1; |
10 | ELSE |
11 | DuoPumpe:=0; |
12 | END_IF |
13 | END_IF |
14 | |
15 | (****Regelparameter errechnen****) |
16 | IF isBerechnung = TRUE AND SollDruck > 0 THEN |
17 | //Messdurchgang := 200; |
18 | ZEIT := TIME_TO_LREAL(Zeit2); //Gesamtzeit umwandeln |
19 | //Zeit:= 2; |
20 | tangente_m:=0; |
21 | tangente_t:=0; |
22 | tangente_wert:=0; |
23 | |
24 | FOR i:=0 TO Messdurchgang BY 1 DO |
25 | steigung := Regelstrecke[i+1]-Regelstrecke[i]; |
26 | IF tangente_m<steigung THEN |
27 | tangente_m:=steigung; |
28 | tangente_t:=i; |
29 | tangente_wert:=Regelstrecke[i]; |
30 | END_IF; |
31 | END_FOR; |
32 | |
33 | |
34 | tu_t:=(Regelstrecke[0]+tangente_m*(tangente_t)-tangente_wert)/tangente_m; |
35 | tu_tg_t:=(Regelstrecke[Messdurchgang-1]+tangente_m*(tangente_t)-tangente_wert)/tangente_m; |
36 | |
37 | tu:= tu_t/(Messdurchgang)*ZEIT; |
38 | |
39 | tg:= tu_tg_t/(Messdurchgang)*ZEIT - tu; |
40 | delta_x:=Regelstrecke[Messdurchgang-1]-Regelstrecke[0]; |
41 | delta_y := SollDruck; |
42 | ks:=delta_x/delta_y; |
43 | k_welle:= tg / (ks*tu); |
44 | |
45 | //Faktoren siehe http://de.wikipedia.org/wiki/Faustformelverfahren_(Automatisierungstechnik) |
46 | kp:= 0.7 *k_welle; |
47 | tn:= 2.3* tu; |
48 | //ki:= 1 / kp; //? |
49 | ki:= tn/kp; |
50 | |
51 | (****Regler****) |
52 | IF isRegler = TRUE THEN |
53 | |
54 | |
55 | |
56 | PiRegler( |
57 | ACT:= Druck1, |
58 | SET:= SollDruck, |
59 | SUP:= 0.02, |
60 | OFS:= 6000, |
61 | M_I:=0 , |
62 | MAN:= FALSE, |
63 | RST:= FALSE, |
64 | KP:= kp , |
65 | KI:= ki, |
66 | LL:= 0, |
67 | LH:= 16300 , |
68 | Y=> Regelgroesse, |
69 | DIFF=> , |
70 | LIM=> ); |
71 | |
72 | DuoPumpe := REAL_TO_INT(Regelgroesse); |
73 | END_IF; |
74 | END_IF; |
danke für die tipps. ich muss die regelgröße am ende noch umrechnen. der regle läuft prozentual von 0-100.
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.