Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 1/1 PWM-Füllstands-Regelung, simuliert mit Simulink (mit Cursor) und mit Tephys A1 Sensor für h4 Sensor für h1 A2 A3 A4 BelüftungsRohr h1 h3 h2 h4 Zufluß Q1 Ausfluß A12 A23 A34 A40 RückschlagVentil Pumpe Wasser Vorrats-Wanne Zusätzlich zu der bereits realisierten Simulation mit PID-Regler und mit Zweipunktregelung (mit verzögert-nachgebenden Rückführung) soll hier noch die Pulsweiten-Modulation (PWM) simuliert werden. Die bisherige Füllstandsregelung mit Tephys-Simulation findet man unter: http://www.home.hs-karlsruhe.de/~kero0001/Textfuel1/textfuel3.html Die bisherige Füllstandsregelung mit Simulink-Simulation findet man unter: http://www.home.hs-karlsruhe.de/~kero0001/fuel523simul/fuel523simul.html Die Simulation der PWM-Regelung einer Strecke aus 4 gleichen PT1-Gliedern findet man mit Simulink: http://www.home.hs-karlsruhe.de/~kero0001/pwmsimul/pwmsimul.html mit Tephys: http://www.home.hs-karlsruhe.de/~kero0001/PWM/PWM_PID_3.html Ergebnis vorweggenommen Erkenntnisse zum Vergleich PWM und „stetige“ PID-Regelung: Wenn die Modulationsfrequenz fPWM „genügend groß“ gewählt wird, dann sind die Kurven Regelgröße X (entspricht Höhe h4) und sogar Höhe h1 bei PWM-Betrieb nahezu identisch mit den entsprechenden Ergebnissen bei „stetigem“ Betrieb. Aber es ergibt sich der beabsichtigte Vorteil, dass die Pumpe nur entweder voll oder gar nicht fördert. Über den Vorteil der PWM-Regelung gegenüber der PID-Regelung wird in dem zitierten Tephys-Text zur PWM-Regelung nachgedacht. Daraus einige Zeilen kopiert und hier eingefügt (Schrift Arial): Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 2/2 Jetzt soll aber wahlweise die Realisierung der Stellgröße Y auch als „pulsweiten-moduliertes“ Signal probiert werden. Wozu denn das? Man stelle sich vor, die Stellgröße Y soll eine Leistung von Kilowatt oder mehr steuern. Dann würde ein „stetig“ arbeitendes „Stellorgan“ Probleme bringen. Leichter könnte man die Kilowatts dadurch steuern, indem man sie nur „ein“ und „aus“- schaltet, z.B. eine elektrische Heizung oder auch eine Pumpe. Die Schaltung einer elektrischen Heizung könnte man z.B. mit einem „Halbleiter-Relais“ aufbauen, das mit Thyristortechnik „Puls-Pakete“ von der Minimal-Länge einer halben Netzperiode beim Strom-Nulldurchgang ein- bzw. -ausschaltet. Das Ganze klingt nach „Zweipunktregelung“, aber bitte mit „verzögert- nachgebender Rückführung“. Hier und heute zur Abwechslung mal „Pulsweitenmodulation“. Der „Modulator“ wird wie folgt realisiert: Eine geeignete „Vergleichs-Spannung“ ( hier uV genannt) ist eine positive Dreieckspannung (Maximalwert aV, Minimalwert 0, ..) mit der Frequenz fd . Die Spannung uV wird verglichen mit der vom PID-Regler gelieferten stetigen Stellgröße (diese wird ab jetzt YPID genannt). Der „Vergleicher“ soll bewirken, dass die wirklich auf die Strecke einwirkende Stellgröße (nach wie vor Y genannt) nur Ein/Aus-Verhalten hat. Der Vergleicher arbeitet nach dem einfachen Prinzip: wenn die PID-Stellgröße YPID größer als der momentane Wert uV der Vergleichs-Spannung ist, dann ist die Stellgröße Y „high“ und liefert den Wert aYPW , sonst den Wert Null. In Tephys-Formulierung: YPW = aYPW * ja( YPID – uV ) .... In MATLAB wäre das YPW = aYPW * ( YPID > uV ), in SIMULINK müsste man ein entsprechendes Blockschaltbild malen, so wie im nachfolgenden Bild angedeutet. Mit dem Wahlschalter kann man die Art der verwendeten Stellgröße wählen: Beim Parameter pid =1 ist Y = YPID (also die stetige Stellgröße ), bei pid = 0 ist Y=YPW (also die Pulsweiten-Stellgröße) pid W YPID PID-Regler Strecke X DreieckGenerator aYPW uV Vergleicher X Y YPW WahlSchalter Es haben sich also drei neue Parameter ergeben, nämlich die Dreieckfrequenz fd, die Dreieckamplitude aV und die Amplitude aYPW des Pulsweitensignals. Ziel des nachfolgenden Textes ist es, für die vorliegende Aufgabe diese drei neuen Parameter zu optimieren, so dass die Regelung mit Pulsweiten-Stellgröße möglichst genau so gut ist wie die Regelung mit stetiger Stellgröße Y. Tephys-Simulation Die nachfolgende Tephys-Datei ist entstanden aus der (in der oben zitierten TephysSimulation der homepage stehenden) Tephys-Datei 4ta_110.txt. Nur die 4 (groß geschriebenen) Zeilen 19, 20, 21, 22 sind anders. Sie realisieren die zusätzliche Pulsweiten-Modulation (PWM) Tephysdatei 4TAPWM1.TXT 1 W0 = aW*ja(t-t1)*ja(t2-t)+aW0{ W0=Quelle für Sollwert. Summe von aW0 und Rechteckimpuls im Zeitbereich t1 bis t2..} 2 W = W+begr((W0-W)/tW,vma,vmi)*dt {W = Sollwert, anstiegsbegrenzt und verrundet} 3 h1 = h1+(Qz-A12*torr(h1-h2))*dt/A1 { h1 = Wasserhöhe im Tank 1. Info zu torr s.u.} 4 h2 = h2+(A12*torr(h1-h2)-A23*torr(h2-h3))*dt/A1 { h2= Wasserhöhe im Tank 2} 5 h3 = h3+(A23*torr(h2-h3)-A34*torr(h3-h4))*dt/A1 { h3=Wasserhöhe im Tank 3} 6 h4 = h4+(A34*torr(h3-h4)-A40*torr(h4))*dt/A1 { h4= Wasserhöhe im Tank 4} Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 3/3 7 X = kh*h4 { X = Regelgröße, kh = Sensorkonstante} 8 S1 = ja(ja(h1-h1o)+S1*ja(h1-h1u)) { S1= „Schalter“ für Überlaufschutz. S1=1 oder 0. Wenn S1=1, soll Pumpe nicht pumpen. Funktion: wenn h1 >h1o, dann S1=1, wenn h1 > h1u, dann S1=“alter“ Wert von S1, wenn h1 < h1u, dann S1 = 0. Im Experiment wird S1 durch invertierenden "OP- Schmitt-Trigger“ realisiert } 9 int = begr(int+(W-X)*dt/Ti,inma,-inma) { int = Integral(W-X)*dt/Ti, aber int begrenzt auf inma, inmi. Si=1 oder 0, s. Zeile 10} 10 Eind = ja(konv)*(W-X)-nein(konv)*X 11 uM = begr(Ap*(kW*W-X+int+(Eind-uCd)*Td/Td1),Uma,Umi) { uMPID = Ausgang des PID-Reglers, begrenzt auf Uma, Umi. Im P-Kanal Abschwächung auf kW*W. kW <1 kann „Überschwingen“ infolge I-Anteil verhindern} 12 uCd = uCd+(Eind-uCd)*dt/Td1 13 Ein2 = W-X-Kr*Ur { Ein2 = Eingang in den Zweipunkt-Regler: Kr= „Rückführ-Faktor“, Ur = Ausgangs-Spannung des Rückführ-Netzwerks, vgl. Schaltung } 14 ST2 = ja(ja(Ein2-swo)+ST2*ja(Ein2+swo)) { ST2 = „Schmitt-Trigger“ der Zweipunktregelung. ST2 =1 oder 0. Funktion: wenn Ein2 > swo, dann ST2=1, wenn Ein2+swo > 0, dann ST2 gleich dem „alten“ Wert von ST2. Wenn Ein2 +swo <=0 (d.h. wenn Ein2 < -swo ), dann ST2 =0 } 15 uM2pkt = Uma*ST2 { uM2pkt = Motorspannung im Falle der Zweipunktregelung} 16 uCT = uCT+(uM2pkt-uCT)*dt/TTp { uCT = Spannung am Tiefpass-Kondensator CT des „Rückführ-Netzwerks“, Zeitkonstante ist TTp, Eingang ist die Motorspannung uM2pkt . Vgl. Schaltung } 17 uCH = uCH+(uCT-uCH)*dt/THp { uCH = Spannung am Hochpass-Kondensator CH des Rückführ-Netzwerks, Zeitkonstante ist THp, Eingang ist uCT. Vgl. Schaltung } 18 Ur = uCT-Nach*uCH { Ur= Ausgangs-Spannung des Rückführ-Netzwerks. Falls Nach = 0, dann Ur = uCT, falls Nach = 1, dann Ur = Ausgang des Hochpasses des Rückführ-Netzwerks } 19 SZ = saeg(fPWM*t)*aPWM {SZ = Sägezahnfunktion Frequenz fPWM, Amplitude aPWM } 20 uPWM = ja(uM-SZ)*aPWM {uPWM= Stellgröße der Pulsweiten-Modulation: hat Wert aPWM, wenn uM > SZ, sonst den Wert Null} 21 uM1 = nein(PWM)*uM+ja(PWM)*uPWM{ uM1 = Motorspannung bei analoger Regelung (bei PWM=0) oder bei PWM-Regelung (bei PWM > 0) } 22 Qz = nein(S1)*kQ*(nein(zwei)*ja(uM1-3)*(uM1-3)+ja(zwei)*uM2pkt) { Qz = Förderleistung der Pumpe (Volumen pro Zeit) für die 3 Arten der Regelung. Wenn der Überlaufschutz anspricht (also bei S1=1), dann Qz = 0. Erst bei uM >3 Volt pumpt die Pumpe. } 23 t = t+dt { t = Zeit} Hinweis zu Vergleich Tephys und Simulink: Man beachte die enorm platz-sparende (und damit auch zeit-sparende!) Form derTephys-Methode gegenüber der (nachfolgend dargestellten) SimulinkMethode. In den obigen 23 Zeilen Tephys-Algorithmus ist „Alles“ enthalten. Um das Gleiche mit Simulink zu erreichen, werden außer der Simulink-Schaltung noch 5 „Subsysteme“ benötigt (nur aus Platzgründen, sonst würde die Simulink-Zeichnung total unübersichtlich werden!). Außerdem benötigt man zum „eleganten“ Laufenlassen der Simulink-Simulation noch für jeden Parametersatz je eine „Parameter-Datei“ und muss mühsam eine „Stringdatei“ programmieren. Um den Cursor zu benutzen, benötigt man schließlich noch die „Cursor-Datei“ simcurs2.m. Bei Tephys ist das „Laufenlassen“ viel einfacher: Man wählt die Parameter und startet die Simulation (mit Menüpunkt Run). In dem dann folgenden Tephys-Bild sind in der Parameter-Tabelle ALLE Parameter enthalten. Mit dem Cursor kann man ohne den geringsten Aufwand die Werte abfragen und die Cursorwerte werden automatisch als Tabelle ins Bild geschrieben. In das Tephys-Bild kann man einen Text schreiben (mit Taste „T“) und mit der Taste „s“ wird das Tephysbild abgespeichert. Dabei kann man noch einen Kommentar eingeben. Das auch in PCX-Form abgespeicherte Tephysbild kann man schließlich in ein WordDokument einfügen. Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 4/4 Anschließend das Simulink-Modell fuelPWM1.MDL. Es ist entstanden aus der oben zitierten Simulink-Schaltung der homepage. Die Pulsweiten-Modulation ist hinzugekommen, realisiert mit dem Subsystem PWM. Dessen Innenschaltung s.u. Datei fuelPW M1.MDL 4-Tank-FüllstandsRegelung. wahlweise PIDoder Zweipunkt-Regler mit verzögert-nachgebender Rückführung. Zusätzlich Regelung mit Pulsweite-Modulation (PW M) Überlaufschutz für Höhe h1 Schwellen h1o, h1u. Wenn aktiv, pumpt Pumpe nicht. kh X h1 uM Q1 In1 Uma,0 QW UnivReg begrenzt Int W kon Out1 PWM Mux PWM PWM h4 aW=2; aW0=2; tW=0.2;vma=4.7;vmi=-4.7; A1=0.00286;A2=A1;A3=A1;A4=A1; kh=10; A12=7.4e-5; A23=6.45e-5; A34=8e-5; A40=3.5e-5; t1=100; t2=300; dt=0.1; tmax=500; Uma=15; vn2Pkt zwei h1o,h1u f(u)= (u[2]<1)*(u[1]>3)*(u[1]-3)*kQ S4tank int Uma Nach f(u) NOT Programm laufen lassen: Die beiden rechten Textblöcke einzeln markieren, kopieren, in MATLAB einfügen und mit Return aktivieren. Oder viel (!!) besser mit Parameter-Datei fuelPWMx.m mit x= 21,22,23,24,25,26,27,35,45 h1o=0.95; h1u=0.90; Ap=30; Td=6.37; Td1=0.5; Ti=64; inma=15; inmi=-15; kQ=1.4e-5; kon=1; kW=1; zwei=0;fPWM=0.15; PWM=1; Nach =0; TTp=6.4; THp=64; Kr=0.033; swo=0.07; sim('fuelPWM1'); figure(1); plot(t,W, t,X, t,h1, t,Q1*0.5e4 ); grid; Anschließend das Subsystem PWM: Es realisiert die Pulsweitenmodulation. Es ist dem oben behandelten Tephys-Programm nachgedichtet Subsystem PWM 1 In1 YPID Funktion: Wenn der Steuereingang PWM=0 ist, dann legt der Schalter die "kontimuierliche" PID-Stellgröße YPID auf den Ausgang out1. Wenn PWM=1 ist, dann ist out1.=YPWM YPWM: if YPID > SZ then YPWM= Uma else YPWM = 0 u * fPWM - floor (u * fPWM) Uma Erzeugung Saegezahn, floor(x)=Ganzzahlteil von x z.B. floor(17.8) = 17 2 PWM > 1 Out1 Uma YPWM Schalter SZ NOT Um die Parameter leicht variieren zu können, wird für jeden Parameter-Satz je eine eigene „Parameter-Datei“ geschrieben (hier fuelPWMPar21C.m bis fuelPWMPar27C.m). Sie ruft die (immer gleiche) „Stringdatei“ auf (hier fuelPWMS1C.m ), die ihrerseits die Simulink-Simulation startet, die Ergebnis-Kurven zeichnet und den Cursor aufruft Anschließend ein Beispiel für eine Parameter-Datei: % Datei fuePWMPar21C Zum Betreiben der Simulink-Schaltung fuelPWM.MDL % % Zum Betreiben des FuellstandsRegelung-Modells fuelPWM.MDL (Matlab 5.3) % 4-Tank-System. Höhe h4 soll geregelt werden, Zufluß zu Tank 1 Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 5/5 % Wahlweise PID-Regelung oder PWM oder % Zweipunktregler mit verzögert-nachgebender Rückführung % Die Parameter sind etwa wie bei Tephys-Datei 4ta152.txt % 16.Juni 2000, auf Matlab 5.3 geändert am 8.6.2002 % einiges verbessert am 3.12.02., PWM am 10.5.2004 % Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik %-----------------------------------------------------------------------% % Die Parameter aus SIMULINK-Schaltung fuel532.m kopiert und hier eingefügt: t1=100; t2=300; aW=2; aW0=2; tW=0.1; vma=40; vmi=-40; dt=0.05; A1=0.00286; A2=A1; A3=A1; A4=A1; kh=10; A12=7.4e-5; A23=6.45e-5; A34=8e-5; A40=3.5e-5; h1o=0.95; h1u=0.90; h1u=0.92; Uma=15; % Ti=64; inma=0.5; inmi=-0.5;kon=1;kW=1; Td=6.37; Td1=0.1; Ap=30; Ti=1e5; inma=1e3; inmi=-1e3; kon=1; kW=1; Td=0; Td1=0.1; Ap=30; zwei = 0; Nach=1; TTp=6.37; THp=64; Kr=0.033; swo=0.08; kQ=1.4e-5; tmax=500; PWM=1; % PWM-Regelung fPWM=0.15; % Frequenz des Sägezahns Bild=21; fuelPWMS1C; % Stringdatei fuelPWMS1C.m aufrufen mit Cursor % Ende der Parameter-Datei fuelPWMP21C.m Anschließend die (immer gleiche) Stringdatei fuelPWMS1C.m % Datei fuelPWMS1C.m mit Cursor % Stringdatei zum Betreiben der Simulink-Schaltung fuel523.MDL % Wird aufgerufen von Parameter-Datei fuelPWMParxC.m mit x=1,2,3.... if Bild == 1 fuelPWM1; end; % Simulink-Schaltung auf Bildschirm if Bild ==21 fuelPWM1; end; % Simulink-Schaltung auf Bildschirm if zwei ==0; % Erzeugung von Strings für die Paramter-Ausgabe auf das Bild: SPWM= ['PWM=',num2str(PWM),';']; SfPWM= ['fPWM=',num2str(fPWM),';']; SAp= ['Ap=',num2str(Ap),';']; STd= ['Td=',num2str(Td),';']; STi= ['Ti=',num2str(Ti),';']; Sinma= ['inma=',num2str(inma),';']; SkW= ['kW=',num2str(kW),';']; Skon= ['kon=',num2str(kon),';']; end; if zwei == 1; % Erzeugung von Strings für die Paramter-Ausgabe auf das Bild: SKr= ['Kr=',num2str(Kr),';']; Sswo= ['swo=',num2str(swo),';']; STTp= ['TTp=',num2str(TTp),';']; STHp= ['THp=',num2str(THp),';']; SNach=['Nach=',num2str(Nach),';']; end; % Erzeugung weiterer Strings für die Paramter-Ausgabe auf das Bild : SBild= ['Bild=',num2str(Bild),';']; Svma= ['vma=',num2str(vma),';']; Svmi= ['vmi=',num2str(vmi),';']; SaW= ['aW=',num2str(aW),';']; SaW0= ['aW0=',num2str(aW0),';']; StW= ['tW=',num2str(tW),';']; St2= ['t2=',num2str(t2),';']; Stmax= ['tmax=',num2str(tmax),';']; Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 6/6 % Die Simulation starten: sim('fuelPWM1'); % das ist für Matlab 5.3 set(0,'DefaultLineLineWidth', 1.5); % Kurven dicker; normal:1.0 figure(Bild); if zwei == 0, plot(t,W,t,X,t,h1,'k',t,int); hold on; set(0,'DefaultLineLineWidth', 1.0); % Kurven dünn plot(t,Q1*0.5e4,'b'); hold off; grid on; end; if zwei == 1, plot(t,W,t,X, t,h1,'k'); hold on; set(0,'DefaultLineLineWidth', 1.0); % Kurven dünn plot(t,Q1*0.5e4,'b'); grid; hold off; end; axis([0,max(t),-0.5,aW+aW0+ 1]); % Definition der Achsen if Bild ==1 disp ('Fadenkreuz verlangt Mausklick '); end; gtext({[SBild,Svma,Svmi,SaW,StW]},'fontsize',11); % Textausgabe beginnt beim Fadenkreuz if zwei == 0, gtext({[SPWM,SfPWM,SAp,STd,STi,Sinma,Skon,SkW]},'Fontsize',12); legend('W','X','Q1*0.5E4', 'h1','int'); % neu am 4.11.02 end; if zwei == 1, gtext({[SKr,Sswo,STTp,STHp,SNach]},'fontsize',11); legend('W','X','h1','Q1*0.5e4'); % neu am 4.11.02 end; %///////// cursor aktivieren: if zwei == 0 %plot(t,W,t,X,t,Q1*0.5e4,'b',t,h1,'k',t,int); tc= t; % Vektor der x-Achse, hier die Zeit yc= [W'; X'; Q1'*0.5e4; h1'; int']; % als Spaltenvektor, drum hier transponiert (x', y') ofsc= [0, 0, 0, 0, 0,0 ]; % Der Vektor der y-Offsets %.....5....1....5....2....5....1....5....3....5....4....5.... Stry=[' Zeit W X Q1*0.5e4 h1 int']; % Tabellenkopf tab=1;% Tabelle auf Bildschirm erwünscht % Jetzt Zeitcursor aufrufen while 1 SimCurs2; end; % Aufruf des Cursors end; % if zwei ==0 if zwei ==1 tc= t; % Vektor der x-Achse, hier die Zeit yc= [W'; X'; h1'; Q1'*0.5e4']; % als Spaltenvektor, drum hier transponiert (x', y') ofsc= [0, 0, 0, 0, 0,0 ]; % Der Vektor der y-Offsets %.....5....1....5....2....5....1....5....3....5....4....5.... Stry=[' Zeit W X h1 Q1*0.5e4']; % Tabellenkopf tab=1;% Tabelle auf Bildschirm erwünscht % Jetzt Zeitcursor aufrufen while 1 SimCurs2; end; % Aufruf des Cursors end; % if zwei ==1 xlabel('Zeit in sec') %/////////////////// % Ende der StringDatei fuelPWMS1C.m mit Cursor Und der Vollständigkeit wegen noch die Cursor-Datei simcurs2.m % Datei SimCurs2.m Zeitcursor für Matlab-Bilder % Bei Simulink sind die to workspace Felder Spaltenvektoren, % also müssen die to workspace-Vektoren transponiert übertragen werden % R. Kessler FH-Karlsruhe, 23.10.2003, Endfassúng 12.5.2004 % Zeit-Cursor: wird aufgerufen von "beliebigem" Programm % übergabewerte: Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 7/7 % xVektor tc, DatenMatrix yc, OffsetVektor ofsc, string Tabellenkopf xlabel('Fadenkreuz auf Beginn der zu erstellenden Tabelle + Klick'); disp ('Fadenkreuz auf Beginn der zu erstellenden Tabelle + Klick'); [xtext,ytext] = ginput(1); % ziemlich oben z.B.rechte Hälfte axen=axis; % V = AXIS returns a row vector containing the scaling % for the current plot. ystep = 0.06 * ( axen(4)-axen(3) ); % ySchrittweite der Tabelle [zeil,spalt]=size(yc); % zeil = Anzahl Zeilen, spalt=Anzahl Spalten kzeil=1:zeil; % Vektor clear Zeittab; % Zunächst Löschen, damit bei Mehrfach-Aufruf % dieses Cursorprogramms die Tabelle leer ist !! N=0; xlabel(' '); xlabel('Cursorwerte in Tabelle schreiben? Taste 1<Return>, Ende: Taste 6<Return>') disp (' Cursorwerte in Tabelle schreiben? Taste 1<Return>, Ende: Taste 6<Return>') disp('--------------------------------------------------------------------------') while N < 10 % maximal N-1 Cursor-Klicks möglich N=N+1; Ax= input(''); if Ax == 1, % Taste 1 zum Beginn des Cursors % Abfangen Klicken ausserhalb zulässigem x-Bereich OK=-1; while OK <0 OK=1; [Xcurs,Ycurs]= ginput(1); if ( Xcurs < min(tc)), OK =-1; end; if ( Xcurs > max(tc)), OK =-1; end; end;% while OK < 0 if N == 1, text(xtext,ytext,Stry); % Tabellenkopf aufs Bild schreiben end; [wert,NrX]= min( abs( Xcurs- tc) ); zeit= tc(NrX); Zeittab(N,1)= zeit; % 1. Spalte der Zeit-Tabelle for ktab=1:zeil Zeittab(N,ktab+1)= yc(ktab, NrX) ; end; % Zeile N der Tabelle aufs Bild schreiben: text(xtext,ytext-N*ystep, num2str(Zeittab(N,1:1+zeil),3)); % Jetzt vertikale Linien bei den selektierten Zeiten: hold on; Lix(N,:)= [tc(NrX),tc(NrX)]; y_li_max=max(ytext,0.9*axen(4)); Liy=[0.9*axen(3),y_li_max]; plot(Lix(N,:),Liy,':m'); hold on; % Vertikale punktierte Linien for kzeil =1:zeil, % Kreise an den Cursor-Klick-Stellen plot(Lix(N,:), yc(kzeil,(NrX))+ofsc(kzeil),'o'); end; hold off end; % if Ax == 1, if Ax== 6, % Taste 6 zum Beenden des Cursors % Jetzt Tabelle auf Bildschirm schreiben: if (tab > 0) & (N > 1) disp(Stry); % Tabellenkopf schreiben disp( Zeittab(:,:) ); end; break, % Cursor beenden end; % if Ax== 6, end;% while N < 10 xlabel(' ') break; % Rückkehr zur Aufrufstelle % Hinweis: % Die Tabelle im Bild ist eine Datei mit Namen Zeittab. % Speichern der Tabelle mit dem neuem Namen Zeittab1: % save Zeittab1 Zeittab - ascii ; % Laden der Tabelle: % Tab1=load('Zeittab1'), sie heißt jetzt Tab1 % Ende Matlab-Datei SimCurs2.m Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 8/8 Anschließend Bilder mit PWM-Simulink-Simulation, meist mit einigen Cursor-Abfragen, (gelegentlich das entsprechende Tephys-Bild) Erkenntnisse zum Vergleich PWM und „stetige“ PID-Regelung: Wenn die Modulationsfrequenz fPWM „genügend groß“ gewählt wird, dann sind die Kurven Regelgröße X (entspricht Höhe h4) und sogar Höhe h1 bei PWM-Betrieb nahezu identisch mit den entsprechenden Ergebnissen bei „stetigem“ Betrieb. Aber es ergibt sich der beabsichtigte Vorteil, dass die Pumpe nur entweder voll oder gar nicht fördert (s. Kurve Q1 * 0.5E4). 5 Bild=21;vma=40;vmi=-40;aW =2;tW =0.1; 4.5 PWM=1;fPWM=0.15;Ap=30;Td=0;Ti=100000;inma=1000;kon=1;kW=1; 4 W X Q1*0.5E4 h1 int 3.5 Zeit 3 72.6 W 2 X Q1*0.5e4 1.86 0 h1 int 0.291 0.000404 2.5 2 153 4 4.02 0 195 239 0.638 0.00109 4 3.9 0.84 0.67 0.0012 4 3.82 0 0.599 0.00132 1.5 1 0.5 0 -0.5 0 50 100 150 200 250 Zeit in sec 300 350 400 450 500 Bild 1. Aufruf war fuelPWMPar21C. P-Regler, Ap = 30. Die Periode T der Regelschwingung kann mit Cursor gefunden werden: T=41.5 sec. Nach dem Vorschlag von Tietze-Schenk ergibt Td = T/6.28 = 6.6 sec und Ti = 10*Td = 66.7 sec Tephysbild 1 die gleichen Parameter wie beim obigen Simulink-Bild 21 Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 9/9 5 Bild=22;vma=40;vmi=-40;aW =2;tW =0.1; 4.5 PWM=1;fPWM=0.15;Ap=30;Td=6.37;Ti=100000;inma=1000;kon=1;kW=1; 4 W X Q1*0.5E4 h1 int 3.5 3 2.5 2 1.5 1 0.5 0 -0.5 0 50 100 150 200 250 Zeit in sec 300 350 400 450 500 Bild 2: Aufruf war fuelPWMPar22C PD-Regler Td=6.37 (gemäß Vorschlag Tietze-Schenk, s. Bild 1). Die Regelschwingung ist infolge des D-Anteils gedämpft. Man erkennt, dass noch Regelabweichung vorhanden ist. Kein Wunder, denn da die Pumpe pumpen soll, benötigt sie eine Spannung. Folglich muss bei PD-Regelung eine Regelabweichung auftreten. Bild=23;vma=40;vmi=-40;aW =2;tW =0.1; 5 PWM=1;fPWM=0.15;Ap=30;Td=6.37;Ti=64;inma=10;kon=1;kW=1; 4.5 4 3.5 Zeit W X Q1*0.5e4 168 4 4.77 0.84 356 2 1.53 0 0.802 h1 W X Q1*0.5E4 h1 int int 0.973 3 0.301 -0.321 2.5 2 1.5 1 0.5 0 -0.5 0 50 100 150 200 250 Zeit in sec 300 350 400 450 500 Bild 3: Aufruf war fuelPWMPar23C PID-Regler mit Ti = 64 sec, gemäß Vorschlag Tietze-Schenk. Zwar wird das Ziel Regelabweichung = 0 erreicht, aber nach den Sprüngen von W ergibt sich eine beachtliche "Überschwingung" bzw. "Unterschwingung" der Regelgröße X. Man ahnt, warum das so ist: Die PumpFörderleistung Q1 geht sowohl beim Aufwärtssprung als auch beim Abwärtssprung der Führgröße in Begrenzung. Dadurch steigt (bzw. fällt) die Regelgröße X mit begrenzter Geschwindigkeit. Folglich nimmt das Integral der Regelabweichung unnötig große Werte an und muss dann erst wieder kleiner werden, um den Endzustand (Regelabweichung = 0 ) zu erreichen. Aus dem Bild findet man die maximale Geschwindigkeit von X zu 0.049 Volt/sec. Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 10/10 Tephysbild 3: Parameter wie beim obigen Simulink-Bild 32 5 Bild=24;vma=0.049;vmi=-0.049;aW =2;tW =0.1; 4.5 PWM=1;fPWM=0.15;Ap=30;Td=6.37;Ti=64;inma=10;kon=1;kW=1; 4 3.5 Zeit 81.8 W 2 X 2 Q1*0.5e4 0.84 0.366 h1 W X Q1*0.5E4 h1 int int 0.189 3 157 4 4.18 0 0.719 0.427 2.5 2 1.5 1 0.5 0 -0.5 0 50 100 150 200 250 Zeit in sec 300 350 400 450 500 Bild 4: Aufruf war fuelPWMPar24C PID-Regler, aber Führgröße W mit Anstiegsbegrenzung ( vma bzw vmi gemäß dem vorherigen Bild berechnetem Wert). Man erkennt, dass infolge der Anstiegsbegrenzung die Überschwinger sehr viel kleiner sind Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 11/11 5 Bild=34;vma=0.04;vmi=-0.049;aW =2;tW =8; 4.5 PWM=1;fPWM=0.15;Ap=30;Td=6.37;Ti=64;inma=10;kon=1;kW=1; W X Q1*0.5E4 h1 int 4 3.5 3 2.5 Zeit W 161 3.97 250 4 X Q1*0.5e4 4.05 0.84 h1 0.677 int 0.329 2 4.01 0.84 0.72 0.294 1.5 1 0.5 0 -0.5 0 50 100 150 200 250 Zeit in sec 300 350 400 450 500 Bild 34: Aufruf war fuelPWMPar34C Wieder PID-Regler, Aber Anstiegsgeschwindigkeit noch kleiner (vmwa= .04 statt 0.049) und Sollwert verrundet (mit tW= 8 statt 0.1). Dadurch Überschwinger vermieden (vgl. vorhergehendes Bild) Bild=26;vma=0.047;vmi=-0.047;aW =4;tW =8; 8 PWM=1;fPWM=0.15;Ap=30;Td=6.37;Ti=64;inma=100;kon=1;kW=1; 7 6 W X Q1*0.5E4 h1 int 5 4 Zeit W 222 7 407 3.01 X 5.44 5.45 Q1*0.5e4 0 0.84 h1 0.938 0.827 int 2.12 2.56 3 2 1 0 0 50 100 150 200 250 Zeit in sec 300 350 400 450 500 Bild 6: Aufruf war fuelPWMPar26C PID-Regler in der obigen "optimalen" Dimensionierung. ABER Sollwert W so hoch, dassder Überlaufschutz von Tank 1 anspricht ( siehe das stoßweise Pumpen, Kurve Q1, und die konstante Höhe h1). Erstaunlicherweise bleibt bei der Abnahme des Sollwertes die Regelgröße X noch lange Zeit konstant, deutlich oberhalb des Sollwertes und der Überlaufschutz bleibt ebenfalls noch lang aktiv, obwohl der Sollwert schon längst wieder auf kleinem Wert ist! Grund für dies Verhalten: der Integralwert steigt unnötig hoch an und benötigt lange Zeit zum Wieder-Abnehmen. Als Abhilfe gegen das Hochlaufen des Integrierers bietet sich natürlich an: Integralwert begrenzen! Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, PWM_Fuellstands_Regelung_2.doc, Seite 12/12 Bild=27;vm a=0.047;vm i=-0.047;aW =4;tW =8; 8 PWM=1;fPWM=0.15;Ap=30;Td=6.37;Ti=64;inma=0.5;kon=1;kW=1; 7 W X Q1*0.5E4 h1 int 6 Zeit 5 4 W X 3 Q1*0.5e4 88.7 2.99 257 7 5.46 0.84 0.84 432 3 3.01 0 0.533 0.941 0.499 h1 int 0.253 0.5 0.248 3 2 1 0 0 50 100 150 200 250 Zeit in sec 300 350 400 450 500 Bild 7: Aufruf war fuelPWMPar27C Hier wird der Integralwert int auf die Werte inma = 0.5 Volt bzw. inmi = - 0.5 Volt begrenzt, folglich schnelles Reagieren der Regelgröße X bei Abnahme des Sollwertes W, trotz Überlaufschutz!