function [ParMa,VarMa]=bran_aup(T,Tel,VTM,VTF,VTL)
%BRAN_AUP Zustandsregelstruktur 1; 3 Koeff.; Parametervar.: hier TM, TF, TL
%        [ParMa(,VarMa)] =bran_aup(T,Tel(,VTM,VTF,VTL))
% Berechnung der Koeffizienten eines digitalen Zustandsreglers fuer Beispiel
% nach Brandenburg at 35(1987)7, S. 275/83; mit BOD;  T=Abtastzeit;
% *** Hier: Variation von Motor-, Feder- und Lastzeitkonstante ***
% (,VTM,VTF,VTL):  Wahlweise koennen Vektoren mit den - gegebenenfalls nicht-
%                  linear unterteilten - Definitionsbereichen fuer die drei
%                  Zeitkonstanten extern vorgegeben werden.
% ParMa:       Parametermatrix mit berechneten Rueckfuehrkoeffizienten
%              1.Zeile: Kd; 2.Zeile: Km; 3.Zeile: Kn;
% (,VarMa):    Variablenmatrix mit zugehoerigen Zeitkonstanten
%              1.Zeile: TM; 2.Zeile: TF; 3.Zeile: TL - fuer graphische
%              Darstellung
% Hinweis: Soll bei menuegefuehrter Definitionsbereichsvorgabe ein Parameter
%          n i c h t variiert werden, dann Minimum=Maximum setzen.

% SCHLUESSELWORTE: Digitales Betragsoptimum, Zustandsregelstruktur,
%		   Parametervariation, Motor-, Feder-, Lastzeitkonstante

%  ***** Voraussetzungen: Vorhandensein von bran_au, branaug ****

%  Copyright (c) 1995 Dr. Gert-Helge Geitner; TU Dresden, Fak. ET,
%                     Elektrotechnisches Institut (ETI); Mommsenstr. 13;
%                     D-01062 Dresden, Germany;
%                     Tel./Fax (0351)-463-2917/7280
%                     e-mail: geitner@eeiwzb.et.tu-dresden.de
%  Literatur zum Digitalen Betragsoptimum: Geitner, G.-H.:
%                     Entwurf digitaler Regler fuer elektrische Antriebe.
%                     VDE-Verlag GmbH Berlin und Offenbach 1995

if nargin~=2&nargin~=5 error('Falsche Eingangsargumenteanzahl'); end;
if length(T)~=1|length(Tel)~=1
   error('Falsche Dimension in den ersten zwei Eingangswerten!'); end
if nargin==5  %Berechnung der Schleifenzaehler
   SZM=length(VTM); SZF=length(VTF); SZL=length(VTL);
else
   VTM=input('Motorzeitkonstante/ms [Minimalwert Maximalwert]=');
   VTF=input('Federzeitkonstante/ms [Minimalwert Maximalwert]=');
   VTL=input('Lastzeitkonstante/ms  [Minimalwert Maximalwert]=');
   if length(VTL)~=2|length(VTF)~=2|length(VTM)~=2 error('Falsche Werteanzahl'); end;
   if VTM(1)>VTM(2)|VTF(1)>VTF(2)|VTL(1)>VTL(2) error('Min/Max vertauscht'); end;
   if VTM(1)<0|VTM(2)<0|VTF(1)<0|VTF(2)<0|VTL(1)<0|VTL(2)<0
				error('Negative Werte sind nicht real'); end;
   if VTM(1)==VTM(2) SZM=1; VTM=VTM*[1 0]'; else
      input('Schrittweite fuer TM: Standard 50% (bel.) / Eingabe(0) ? =');
      if ans==0
	 swM=input('Vorgabe der Schrittweite fuer TM in % =');
	 if swM<=0|swM>100 error('Unzulaessiger Wert!'); end
      else swM=50; end
      SZM=ceil(100/swM)+1;          %Schleifenzaehler
      dTM=(VTM(2)-VTM(1))*swM/100;  %Definitionsbereiche
      for i=1:SZM-1 VTM(i+1)=VTM(1)+i*dTM; end
   end
   if VTF(1)==VTF(2) SZF=1; VTF=VTF*[1 0]'; else
      input('Schrittweite fuer TF: Standard 50% (bel.) / Eingabe(0) ? =');
      if ans==0
	 swF=input('Vorgabe der Schrittweite fuer TF in % =');
	 if swF<=0|swF>100 error('Unzulaessiger Wert!'); end
      else swF=50; end
      SZF=ceil(100/swF)+1;          %Schleifenzaehler
      dTF=(VTF(2)-VTF(1))*swF/100;  %Definitionsbereiche
      for i=1:SZF-1 VTF(i+1)=VTF(1)+i*dTF; end
   end
   if VTL(1)==VTL(2) SZL=1; VTL=VTL*[1 0]'; else
      input('Schrittweite fuer TL: Standard 50% (bel.) / Eingabe(0) ? =');
      if ans==0
	 swL=input('Vorgabe der Schrittweite fuer TL in % =');
	 if swL<=0|swL>100 error('Unzulaessiger Wert!'); end
      else swL=50; end
      SZL=ceil(100/swL)+1;          %Schleifenzaehler
      dTL=(VTL(2)-VTL(1))*swL/100;  %Definitionsbereiche
      for i=1:SZL-1 VTL(i+1)=VTL(1)+i*dTL; end
   end
end
disp('Anzahl der zu berechnenden Parameterkombinationen ='); disp(SZM*SZF*SZL);
input('Pro Berechnung ca. 10s: Start (bel.) / Abbruch (0) ? =');
if ans==0 error('Abbruch'); end
ii=0;
for i=1:SZM
    for j=1:SZF
	for k=1:SZL
	    erg=bran_au(T,Tel,VTM(i),VTF(j),VTL(k));
	    ii=ii+1;
	    ParMa(1,ii)=erg(1); ParMa(2,ii)=erg(2); ParMa(3,ii)=erg(3);
	    VarMa(1,ii)=VTM(i); VarMa(2,ii)=VTF(j); VarMa(3,ii)=VTL(k);
	end
    end
end
piep=ones(1,200); piep=piep*7; setstr(piep)
