R. Kessler, D:\75884983.doc, S. 1/5 Hubschrauber mit Simulink und mit Matlab Datei hub_60.mdl Kessler, Nov. 05 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 G kx konv ux tst outports mit 20000 Punkten HubiMasse Für PID: Aufruf mit rhub_PIDuM20 rhub_PID Für Chaos-Effekt: Aufruf mit hubParx (x=1,2, 6,7,10,11..) ; Variation Ap, xst, rGL clear;vmax=1;Ap=20;Td=0.7;Ti=5;konv=1;kW=1;MATL=1;dtM=0.01;cur=0;bild=8;rhub_PIDuM20 bild 8,Ap=20,Td=0.7,konv=1,kW=1,Ti=5,vmax=1, mitMatlab: dt=0.01 10 W ux uM/10 Fa 8 6 Fa 4 uM/10 2 0 W,ux -2 0 5 10 15 20 25 30 35 40 45 50 % Datei rhub_PIDuM20.m Simulink und wahlweise auch reines Matlab % wahlweise mit Cursor (bei Simulink) % Aus rhub_PIDuM2.m entstanden, aber hier ohne Abfrage mit fragtext %clear;vmax=1;Ap=20;Td=0.7;Ti=5;konv=1;kW=1;MATL=1;dtM=0.01;cur=0;bild=8;rhub_PIDuM20 % R. Kessler FH-Karlsruhe, 5.5.2005 und Okt. 2008 % Variation der PID-Parameter TD, Ti, vmax, kon um "optimale" % PID-Dimensionierung zu erhalten % format compact; % verhindert unnötigen Zeilenvorschub % Werte der Parameter, soweit nicht im Aufruf enthalten: 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; R. Kessler, D:\75884983.doc, S. 2/5 xst = 0; kx = 14; % Ti = 4000; konv = 0; % Td = 0; kW = 1; % Ap = 20; rGL = 0.10000; % entspricht dem Experiment Umax = 15.00000; Umin= -15; 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.0; % Gute Werte: Ap=20; Td=1; konv=0; Ti=10; vmax=1; kW=0.9; % Gute Werte: Ap=20; Td=0.7; konv=0; Ti=7; vmax=1; kW=0.9; if bild==1, hub_60 ; end; % Simulink-Schaltung auf Bildschirm sim('hub_60'); % Simulation ausführen figure(bild); clf reset; % ruft Figur bild 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; % Achsen zeichnen und beschriften: hold on; set(0,'DefaultLineLineWidth', 1); % Kurven dünn plot([0,max(t)],[0,0],'k',[0,max(t)],[4,4],'k',[0,max(t)],[6,6],'k' ); set(0,'DefaultLineLineWidth', 1.5); % Kurven dick text(max(t),0,' W,ux'); text(max(t),4,' uM/10'); text(max(t),6,' Fa'); axis([0,tmax,-3,10 ]); % sorgt für vorgegebene Achsenbereiche legend('W','ux','uM/10','Fa'); Sbild = ['bild ',num2str(bild)]; S1=[',Ap='num2str(Ap)];S2=[',Td='num2str(Td)]; S3=[',konv='num2str(konv)];S4=[',kW='num2str(kW)]; S5=[',Ti='num2str(Ti)];S6=[',vmax='num2str(vmax)]; Titext= [Sbild, [S1,S2,S3,S4,S5,S6] ]; title(Titext); % Cursor: if cur>0 %///// Start Cursor: ////// 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: ////// end; % Wahlwiese mit reinem Matlab rechnen if MATL>0 disp('anschliessend mit Matlab: Taste'); pause; hubmat_60_2; end; ******************************************************************* % Datei hubmat_60_2.m R. Kessler März 2006, Oktober 2008 % wie Simulink-Modell hub_60.mdl, aber hier mit "reinem Matlab" statt Simulink % wird von rhub_PIDuM20.m gemeinsam mit dem Simulink-Modell aufgerufen format compact; N=floor(tmax/dtM); %Deklarieren der Speicherwerte. % Wichtig,sonst Rechenzeit riesig, % Rechenzeit steigt etwa quadratisch an mit Anzahl Rechenpunkte tp=zeros(1,N); Wp=tp; uMp=tp; Fap=tp; uxp=tp; wp=tp; % Startwerte: x=0; v=0; W=0; int=0; w=0; Fa=0; WXalt=0; R. Kessler, D:\75884983.doc, S. 3/5 t=0; k=0; tic; % Start Stoppuhr % Numerisches Lösen der DGLn, vgl. Simulink % Algorithmus ähnlich "Euler", aber anders als bei Euler werden hier immer % die "aktualisierten" Werte benutzt, bei Euler werden dagegen erst beim % nächsten Schleifendurchlauf die neuen Werte benutzt. while t < tmax W0=Wmax*sign(sin(2*pi*f*t)); % Sollwert Rechteckfunktion st= (W0-W)/tW; % Steigung Sollwert if st> vmax st= vmax; end; if st<- vmax st= -vmax; end; W=W+st*dtM; % W= Sollwert, anstiegsbegrenzt auf +- vmax if t < tst x=xst; v=0; end; % für t<tst ist x=xst und v=0; tst= Startzeit if t>= tst x=x+v*dtM; end; % x = Posisiton der Masse if t>= tst v=v+(-G+Fa-rv*v-rGL*sign(v)-rt*v*abs(v))*dtM/m;end; % v =Geschwind. % 3 Arten Reibung: viskos (rv), Gleitreibung (rGL), turbulente Reibung (rt) % G=Gweicht, Fa= Aufrirebskraft infolge Propeller ux=kx*x; % ux = Regelgröße int=int+(W-ux)*dtM/Ti; % I-Anteil des Reglers DA=Td*((konv>0)* (W-ux-WXalt)/dtM -(konv <=0) * kx*v ); % D-Anteil des Reglers WXalt=W-ux; uM=Ap*(kW*W-ux +DA +int); % uM = Ausgang des Reglers, noch unbegrenzt if uM >Umax uM=Umax; end; if uM <-Umax uM=-Umax; end; % uM = Motorspannung, begrenzt auf +- Umax i = (uM - kg*w)/R; if i> imax i=imax;end; if i< -imax i=-imax;end; % i =Strom w = w+ ((i - 2.219*Fa)*kg )*dtM/J; % w = Winkelgeschwindigkeit Propeller Fa= ka*w*abs(w) *( (w>0)+eta *(w<0) ) ; % Auftriebskraft des Propellers k=k+1; % Speichern der Plotwerte (Index p) %tp=zeros(0,N); Wp=tp; uMp=tp; Fap=tp; uxp=tp; wp=tp; %if k==1 size(Wp),size(uMp),size(Fap),size(uxp), end; tp(k)=t; Wp(k)=W; uMp(k)=uM; Fap(k)=Fa; uxp(k)=ux; t=t+dtM; end; % while t < tmax toc; % toc= Rechenzeit MATbild = bild+20; figure(MATbild); clf reset; plot(tp,Wp, tp,uxp,'m', tp, uMp/10+4,'k', tp,Fap+6,'r' ); grid on; % Achsen dünn zeichnen und beschriften: hold on; set(0,'DefaultLineLineWidth', 1); % Kurven dünn plot([0,max(tp)],[0,0],'k',[0,max(t)],[4,4],'k',[0,max(t)],[6,6],'k' ); set(0,'DefaultLineLineWidth', 1.5); % Kurven dick text(max(tp),0,' W,ux'); text(max(tp),4,' uM/10'); text(max(tp),6,' Fa'); axis([0,tmax,-3,10 ]); % sorgt für vorgegebene Achsenbereiche legend('W','ux','uM/10','Fa'); Sbild = ['bild ',num2str(bild)]; Titext= [Sbild, S1,S2,S3,S4,S5,S6,[', mitMatlab: dt=',num2str(dtM)] ]; title(Titext); % Ende Datei hubmat_60_2.m ******************************************************************* % 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 R. Kessler, D:\75884983.doc, S. 4/5 % ü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']; 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)); R. Kessler, D:\75884983.doc, S. 5/5 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