%   Script VERHKRAN.M
%
%   Erläuterung der Bewegungsgleichung
%   am Beispiel der Verladebrücke
%
%        Eingang: Kraft an Laufkatze [N]
%        Ausgang: seitliche Position der Last [m]
%
%   [A b c d]  Zustandsraummodell
%
% J. Lunze
% für 2. Auflage: 6.11.1998
% für 3. Auflage: 3.4.2001
% für 4. Auflage: 21.9.2003
% für 5. Auflage: 18.4.2005
% für 6. Auflage: 4.12.2006
% für 7. Auflage: 28.4.2008
% für 8. Auflage: 2.2.2010
% für 9. Auflage: 16.2.2012
% für 10. Auflage: 27.1.2014
% für 12. Auflage: 5.08.2019
%
%   
clear
Bspkran;
close all;


%%  Eigenbewegung bei Anfangsauslenkung des Greifers
%   
figure(1);
x0=[0.7;            % Laufkatze bei 0.7 m
    0;
    -6/180*pi;      % -6 Grad = -0.105 rad Auslenkung des Lasthakens
    0];
T=[0:0.1:10];
subplot(2, 1, 1);
Yfrei=initial(Verladebruecke, x0, T);
plot(T, Yfrei, 'b', [0 10], [0 0], 'k:');
latexxlabel('$$t$$ in s');
latexylabel('$$y_{\rm frei}$$ in m');
rotateY;
latextitle('Eigenbewegung');
axis([0 10 -1 2.8]);
xticks([0 2 4 6 8 10]);
yticks([0 2]);
%                     Mittelwert der Pendelung ist nicht 0,7m, weil
%                     Laufkatze selbst zu Pendelbewegung durch die Last
%                     angeregt wird.


%%  Erzwungene Bewegung der Verladebrücke
%   
figure(2)
%  Eingangsgröße u(t) wird durch Regler bestimmt,
%  der Last positioniert
%  I-Erweiterung der Regelstrecke
AI=[A zeros(n, 1);
    c 0];
bI=[b;
    1];
cI=[c 0];
dI=0;
VerladebrueckeIerw=ss(AI, bI, cI, dI);
%  Entwurf der Zustandsrückführung durch Polverschiebung
K=place(AI, bI, [-1.4 -1.3 -1 -1.1 -1.2 ]);
Ag=AI-bI*K;
bg=[zeros(n, 1); -1];
Regelkreis=ss(Ag, bg, -K, 0);
%  Steuerung soll Last 2 m nach rechts bewegen
U=2*step(Regelkreis, T);
%  diese Steuerung wird als Eingang der Verladebrücke
%  verwendet, um die erzwungene Bewegung zu berechnen
subplot(2,1,2)
plot(T, U, 'b', [0 10], [0 0], 'k:');
latexylabel('$$u$$ in N');
rotateY;
axis([0 10 -300 500]);
xticks([0 2 4 6 8 10]);
yticks([0 400]);
%
subplot(2,1,1);
[Yerzw, T, X]=lsim(Verladebruecke, U, T);
plot(T, Yerzw, 'b', [0 10], [0 0], 'k:');
latexylabel('$$y_{\rm erzw}$$ in m');
rotateY;
latexxlabel('$$t$$ in s');
axis([0 10 -1 2.8]);
xleer;
yticks([0 2]);
latextitle('Erzwungene Bewegung');
hold off


%%    Überlagerung der freien und der erzwungenen Bewegung
%   
figure(3)
subplot(2,1,1)
plot(T, Yerzw+Yfrei, 'b', [0 10], [0 0], 'k:');
latexylabel('$$y$$  in m');
rotateY;
latexxlabel('$$t$$ in s');
latextitle('Freie Bewegung + erzwungene Bewegung');
axis([0 10 -1 2.8]);
xticks([0 2 4 6 8 10]);
yticks([0 2]);


%%   Übertragungsfunktion der Verladebrücke
%   
[zs, ns]=tfdata(Verladebruecke,'v');
printsys(zs, ns)

%%   Pole der Verladebrücke
%   
roots(ns)

%%  Verhalten der Verladebrücke
%  (Bodediagramm, PN-Bild)
%   
figure(4);
W=logspace(-2, 1, 1000);
[Betrag, Phase]=bode(Verladebruecke, W);
subplot(2,1,1)
semilogx(W, 20*log10(Betrag(:)), 'b');
grid on;
xleer;
hold on
%   Geradenapproximation
Betrag1=bode(Verladebruecke, [0.00175]);
semilogx([0.00175 1.75 17.5],...
    [20*log10(Betrag1), 20*log10(Betrag1)-3*40, 20*log10(Betrag1)-3*40-80], 'b--');
latexylabel('$$|G|$$ in dB');
rotateY;
latextitle('Verladebr\"ucke');
axis([0.01 10 -120 10]);
xleer;
yticks([-100 -50 0 ]);
%
subplot(2,1,2);
semilogx(W, Phase(:), 'b');
axis([0.01 10 -400 0]);
latexylabel('$$\phi$$ in Grad');
rotateY;
yticks([-360  -180  0]);
latexxlabel('$$\omega$$ in rad/s');
xticks([0.01 0.1 1 10]);
grid on;


%%   Pole und Nullstellen der Verladebrücke
%   
figure(5)
subplot(3,3,[1, 2, 4, 5]);
P=pzmap(Verladebruecke);
for i=1:length(P)
    plot(real(P(:)), imag(P(:)), 'bx');
    hold on
end
latexxlabel('Re');
latexylabel('Im');
rotateY;
plot([-2 2],[0 0],'k:', [0 0],[-2 2],'k:');
axis('square');
latextitle('PN-Bild der Verladebr\"ucke');
axis([-2 2 -2 2]);
xticks([-1 0 1]);
yticks([-1 0 1]);
hold off


%%    Wurzelortskurve der Verladebrücke mit P-Regelung
%   
figure(6)
subplot(3,3,[1, 2, 4, 5]);
rlocprintblue(Verladebruecke);
axis([-4 4 -4 4]);
hold on
plot([-5 5],[-5 5],'k:', [-5 5],[5 -5],'k:');
latextitle('Wurzelortskurve der Verladebr\"ucke mit P-Regler');
rotateY;
yticks([-3 0 3]);
xticks([-3 0 3]);


%% Herstellung der Bilddateien *.eps
%
Epsbildc15('verhkr');
