Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, 68613211, S. 1/7 Hubschrauber-Simulation mit Simulink (Matlab 5.3), mit Cursor und Funktion Fragtext homepage: http://www.home.hs-karlsruhe.de/~kero0001/ zum konstruktiven Aufbau und zum Chaos-Effekt siehe. http://www.home.hs-karlsruhe.de/~kero0001/hubschrauber/hubteph4HS.html In diesem Text wird ein neuentwickelter Cursor zum Abfragen der Matlab-Bilder eingeführt und dessen Funktionsweise wird beschrieben. Außerdem werden die zu variierenden Parameter mit einer neuen Eingabefunktion (fragtext) eingegeben Datei hub_60.mdl Kessler, 1.12. 2002 5.5.2005 Hubschrauber mit realen Parametern, vgl. Tephys hubrep5.txt hub_60.mdl: Weg-Integrierer mit Startwert xst W i Fa W-periodisch UnivRegler t Clock +-Umax HubiMotor uM kx G konv outports mit 20000 Punkten ux tst HubiMasse Aufruf mit rhub_PID: Für PID-Dimens., mit Cursor und Parameterabfrage. Aufruf mit hubParx (x=1,2, 6,7,10,11..) ; Variation Ap, xst, rGL -->CHAOS-Effekt 1 Subsystem Hubi-Masse in_Fa 1/m 2 Last G 3 in_tst 1 s 0 rv*u+rGL*sgn(u)+rt*u*abs(u) v 1 s 1 out_x Starwert xst Weg-Integrierer hat Startwert xst reib Bis zur Zeit tst wird Masse festgehalten auf Position xst DGLn: dx/dt = v m*dv/dt = Fa-G -( rV* v + rGL*sign(v) +rtu*v*abs(v) Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, 68613211, S. 2/7 Subsystem Hubi-Motor Strom i UM 1 out_1 1/R in_1 1 kg 1/J 1/s +-imax u = Winkelgeschwind. des Motors 2.219 kg Kraft Fa 2 ka*u*abs(u)*( (u>0) +eta*(u<0 ) ) out_2 uM= Motorspannung, w = Winkelgeschwind., J = Träghmoment Strom i = (uM - kg * w), aber Strom ist begrenzt auf +- imax Auftriebskraft Fa = ka * w*abs( u ) * ( (w > 0) + eta *( w < 0 ) ) man beachte: w > 0 ist =1, wenn w >0, sonst =0 DGL: J*dw/dt = kg* (i - 2.219 * Fa) "Universal"-PID-Regler 1 X kW 2 W kW*W 1/Ti 1/s Ap 3 konv -1 Td du/dt Bei konv = 1 wird W-X differenziert, bei konv = 0 nur -X mit kW < 1 wird P-Kanal abgeschwächt 1 Y Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, 68613211, S. 3/7 Subsystem W-periodisch Quelle für Sollwert W, anstiegsbegrenzt u. verrundet 1 1/tW +- vmax 1 W s Wmax * sgn ( sin ( 2 *pi* f * u ) ) Clock Fcn Zunächst zwei der mit obiger Simulink-Datei erzeugten Bilder. Später weitere Matlab-Bilder, vorher aber die drei benötigten MatlabDateien zum Aufrufen: 10 Nr Zeit 1 3.8 2 10.9 8 W 2 2 ux 3.93 4.81 uM/10, FA -1.5 -1.5 0 0 W ux uM/10 Fa 6 4 2 0 ,Ap=20,Td=0,konv=0,Ti=400000,kW=1,vmax=20 -2 0 5 10 15 20 25 30 35 40 45 50 Matlab-Bild 1:P-Regler. Erkenntnis: Regelkreis ist total instabil. Ablesen der „Periode“ der Regelschwingung aus den beiden Cursorwerten T= 10.9-3.8= 7.1sec, ==> nach Tietze-Schenk Td =T/6.28 = 1.13 sec 10 Nr Zeit 1 11.5 2 23.9 3 36.1 8 W 2 -2 2 ux 1.93 -1.99 1.97 uM/10, 0.968 0.502 0.968 FA W ux uM/10 Fa 0.3 0.0998 0.3 6 4 2 0 ,Ap=20,Td=0.8,konv=0,Ti=6,kW=0.85,vmax=1 -2 0 5 10 15 20 25 30 35 40 45 50 Matlab-Bild 2 „Optimale“ PID- Dimensionierung, vgl. Parameterausdruck im Bild: Ap=20; Td=0.8; konv=0; Ti=6; kW=0.85: vnmax=1 Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, 68613211, S. 4/7 Anschließend die Datei zum Aufrufen obiger Simulink-Schaltung. Darin Aufruf des Cursors und neue Funktion fragtext % Datei rhub_PID.m R. Kessler FH-Karlaruhe, 5.5.2005 % Ziele: 1. neue Funktion fragtext zur Eingabe von Parametern % 2. neuer Cursor simcurs2 % Mehrfach-Lauf mit Tastaturabfrage einiger Parameter % Hinweis: bei Eingabe "RETURN" bleibt Wert unverändert % Variation der PID-Parameter TD, Ti, vmax, kon um "optimale" % PID-Dimensionierunjg zu erhalten % format compact; % verhindert unnötigen Zeilenvorschub clear; % Löscht alle Variablen. So sollte man jedes Programm beginnen!! % Vorschlagswerte für die Parameter: f=0.04; % Frequenz der Führgröße Wmax=2; tW = 0.1; vmax= 20; dt = 0.0100; kg = 0.02102; R = 3.53; imax= 2.5; J = 6.0274E-5; tst = 1.00000; xst = 0; kx = 14.00000 Ti = 4.0E+5; konv = 0; Td = 0; kW = 1; Ap = 20; rGL = 0.10000; % entspricht dem Experiment Umax = 15.00000; eta = 0; % bei eta =0 hat der Propeller rückwärts keinen Auftrieb ka = 2.46E-6; % für Auftriebskraft Fa G = 0.20000; % Gewichtskraft (ist erforderlich bei eta =0, weil % Hubi bei Rückwärts-Drehrichtung keinen Auftrieb hat rv = 0; rt = 0; m = 1.92700; % Masse tmax = 50.00000; % Anschließend Schleife zur Eingabe der zu variierenden Parameter: nr=0; weiter =1; % Bei nr = 0 die Schaltung des Modells auf Bildschirm darstellen: if nr == 0 hub_60; input(''); end; while weiter == 1, [Ap,SAp]=fragtext(' Ap', 'Ap', Ap); [Td,STd]=fragtext(' Td', 'Td', Td); [konv,Skonv]=fragtext(' D-Anteil konventionell (1/0)', 'konv', konv); [Ti,STi]=fragtext(' Ti', 'Ti', Ti); [kW,SkW]=fragtext(' AbschwächFaktor kW im P-Kanal ', 'kW', kW); [vmax,Svmax]=fragtext(' Geschwind. Sollwertsprung +-vmax ', 'vmax', vmax); % Ende der Abfragen, jetzt rechnen: tic; % Stoppuhr startet sim('hub_60'); % Simulation ausführen toc; % Stoppuhr endet nr = nr +1; figure(nr); clf reset; % ruft Figur nr auf und löscht Inhalt set(0,'DefaultLineLineWidth', 1.5); % Kurven dick plot(t,W, t,ux,'m', t, uM/10+4,'k', t,Fa+6,'r' ); grid on; axis([0,tmax,-3,10 ]); % sorgt für vorgegebene Achsenbereiche legend('W','ux','uM/10','Fa'); %///// Start Cursor: ////// Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, 68613211, S. 5/7 tc= t; yc= [W'; ux'; uM'/10; Fa']; % Wichtig: die Vektoren transponiert übergeben ofsc= [0, 0 ,4,6]; % Wichtig: die Grafik-Offsets wie im plot-Befehl Stry=[' Zeit W ux uM/10, FA']; % Tabellenkopf tab=1; while 1 Simcurs2; end; %///// Ende Cursor: ////// % Parameter als Text aufs Bild schreiben: text(0,-0.9,([SAp,STd,Skonv,STi,SkW, Svmax ])); input(' '); % wartet auf Return weiter = input('weiter?? (1/0) '); if isempty(weiter), weiter = 1;end; end; % von while und Ende der Matlab-Datei rhub_PID.m Anschließend die Datei simCurs2.m, die den Cursor realisiert % % % % % % % % % % % Datei SimCurs2.m Zeitcursor für Matlab-Bilder R. Kessler FH-Karlsruhe, 23.10.2003, Endfassúng 12.5.2004, 5.5.2005 Cursor-Abfrage mit linker Maustaste, Ende mit rechter Maustaste (oder Esc) Zeit-Cursor: wird aufgerufen von "beliebigem" Programm übergabewerte: xVektor tc, DatenMatrix yc, OffsetVektor ofsc, string Tabellenkopf Bei Simulink sind die to workspace Felder Spaltenvektoren, also müssen die to workspace-Vektoren transponiert übertragen werden 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 ystep = 0.04 * ( axen(4)-axen(3) ); % ySchrittweite der Tabelle ytext = 0.93* (axen(4)-axen(3)) + axen(3); % y-Position Tabelle neu 4.5.05 ytext = 0.98* (axen(4)-axen(3)) + axen(3); % y-Position Tabelle neu 5.5.05 xtext = 0.1 * (axen(2)-axen(1)); [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; weiter=1; xlabel(' '); xlabel('Cursorwerte in Tabelle schreiben? linke Maus, Ende Esc od. rechte Maus') disp('---------------------------------------------------------------------') while weiter > 0 %N < 10 % maximal N-1 Cursor-Klicks möglich [Xcurs,Ycurs,button]= ginput(1); % Fadenkreuz will 1 Taste if button ==1 % linke Maustaste hat die Nummer 1,rechte die Nummer 3 % Abfangen Klicken ausserhalb zulässigem x-y-Bereich: N=N+1; % oben nach hier verlegt OK=1; if ( Xcurs < min(tc)), OK =-1; N=N-1; end; if ( Xcurs > max(tc)), OK =-1; N=N-1; end; if ( Ycurs < axen(3)), OK =-1; N=N-1; end; if ( Ycurs > axen(4)), OK =-1; N=N-1; end; if OK >0 % wenn im zulässigen Zeitbereich geklickt wurde if N == 1, text(xtext,ytext,['Nr ',Stry]); % Tabellenkopf aufs Bild schreiben end; % if N == 1 % Kurvenzeichen unter die Kopfzeile plotten: KZ= ['s', 'o', '<' ,'^', '<','>' ,'+', 'x']; Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, 68613211, S. 6/7 hold on; for kzeil =1:zeil plot(xtext/5+xtext+xtext+kzeil*xtext,ytext-1*ystep,[KZ(kzeil)]); end; % kzeil ... [wert,NrX]= min( abs( Xcurs- tc) ); % Finden des Zeitwertes zeit= tc(NrX); Zeittab(N,1)= zeit; % 1. Spalte der Zeit-Tabelle for ktab=1:zeil Zeittab(N,ktab+1)= yc(ktab, NrX) ; end; % ktab... % Zeile N der Tabelle aufs Bild schreiben: text(xtext/5 +xtext,ytext - (N+1)*ystep,... [num2str(N),' ',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)); y_li_max=max(ytext,0.8*axen(4)); Liy=[0.9*axen(3),y_li_max]; plot(Lix(N,:),Liy,':m');hold on; % Vertikale punktierte Linien for kzeil =1:zeil, % Kurvenzeichen KZ an den Cursor-Klick-Stellen plot(Lix(N,:), yc(kzeil,(NrX))+ofsc(kzeil),KZ(kzeil)); end; % kzeil.. hold off end; % if OK > 0 end; % if button ==1 % Taste Esc oder rechte Maustaste zum Beenden des Cursors: if (button== 27)| (button == 3) weiter= 0; % Ende Cursor % Jetzt Tabelle auf Bildschirm schreiben: if (tab > 0) & (N > 1) disp(Stry); % Tabellenkopfauf Bildschirm schreiben disp( Zeittab(:,:) ); end; % if (tab... break, % Cursor beenden end; % if button == 27 oder 3, end;% while weiter > 0 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 Anschließend die Funktion fragtext: function [Neuwert,Stringwert]= fragtext(text,Name,Altwert); % [Neuwert,Stringwert]= fragtext(text,Name,Altwert); % für Für Eingaben von Zahlen für Parameter,% % neu mit Ausgabe von Text (ASpril2005) % Beispiel: [Ap,S1]=frag('Ap',Ap); % [J,SJ]=fragtext( 'Trägheitsmoment', 'J', J); Ax=input([text,' ',Name,'= ',num2str(Altwert,10),', neuer Wert ?? ']); Neuwert=Altwert; if ~isempty(Ax), Neuwert=Ax; end; % Neu für Matlab 5.3 Stringwert=[',',Name,'=',num2str(Neuwert,10)] ; Prof. Dr. R. Kessler, FH-Karlsruhe, Sensorsystemtechnik, 68613211, S. 7/7 Anschließend weitere Matlab-Bilder mit Variation der Regler-Parameter 10 Nr Zeit 1 7.03 2 13.6 3 16.8 8 W 2 -2 -2 ux uM/10, FA 1.51 1.24 -3.02 0.967 -1.5 1.44 0.3 0 0.581 W ux uM/10 Fa 6 4 2 0 ,Ap=20,Td=1.1,konv=0,Ti=400000,kW=1,vmax=20 -2 0 5 10 15 20 25 30 35 40 45 50 Matlab-Bild 3:Td= 1.1, Sollwert W sprunghaft, dadurch bei abfallendem Sollwert starker Überschwinger der Regelgröße ux 10 Nr Zeit 1 7.26 2 13.3 3 25.7 8 W ux uM/10, FA 2 1.25 -1.31 1.51 1.51 -2.24 0.968 -0.296 1.5 0.3 0.0119 0.45 W ux uM/10 Fa 6 4 2 0 ,Ap=20,Td=1.1,konv=0,Ti=400000,kW=1,vmax=1 -2 0 5 10 15 20 25 30 35 40 45 50 Matlab-Bild 4: Td= 1.1, Sollwert W anstiegsbegrenzt (vmax=1), dadurch bei abfallendem Sollwert kein Überschwinger der Regelgröße mehr. Aber natürlich noch Regelabweichung, weil I-Anteil fehlt 10 Nr Zeit 1 11.2 2 22 3 33.9 8 W ux uM/10, FA W ux uM/10 Fa 2 1.99 0.969 0.3 -2 -2.31 0.844 0.226 2 2.26 0.717 0.196 6 4 2 0 ,Ap=20,Td=0.8,konv=0,Ti=6,kW=1,vmax=1 -2 0 5 10 15 20 25 30 35 40 45 50 Matlab-Bild 5: Jetzt mit I-Anteil: Ti = 6 Td= 0.8, Infolge I-Anteil Regelgröße zu groß: Abhilfe kW kleiner 1 wählen, s. Matlab-Bild 2.