function rav=urlaz(rev,UVA)
%URLAZ    conversion of controller parameters inside Laplace(s) and z-domain(z)
%         rav=urlaz resp. rav=urlaz(rev(,UVA))
% conversion based on approximations - >>>optionally menu driven<<<
%         input  vector: rev=[T Ri Bp Sz Fo x1 x2 x3 x4]
%         output vector: rav=[y1,y2,y3,y4]
%         (,UVA)=optionally switch off of warnings: any=no/1=yes; default: 0
% Applicable to impart quasi-continuous knowledge of controllers designed by
% means of the Discontinuous Amplitude Optimum (BOD=BetragsOptimumDigital)
%  T: sampling time (precondition: same time unit for all time quantities)
% Ri: direction of the conversion (0) z to s or (1) s to z
%
%                                               x1,y1  x2,y2  x3,y3   x4,y4
% Bp: modelling in s-domain (recommendation: 0)
%     (0) additive: Kp(gamma+1/pTN+pTV/(1+pTZ))   Kp     TN     TV     TZ
%         (I-type structure: gamma=0, otherwise gamma=1)
%     (1) multiplicative:(1+sT1)(1+sT2)/sT0       T1     T2     T0      0
%
%     correlation in z-domain:                    Vr     d1     d2   d3,b1,d0
%     Vr(beta+d1(z^-1)+d2(z^-2)+d3(z^-3))/((1+alpha(z^-1))(1+b1(z^-1)))
%
% Sz: controller structure
%            z-domain:                  s-domain:
%     (0) alpha=-1; beta=1; x4=d3     PID-type and PI-type structure
%     (1) alpha=-1; beta=0; x4=d0     I-type structure
%     (2) alpha= 0; beta=1; x4=0      PD-type structure
%     (3) alpha=-1; beta=1; x4=b1     PID-type structure + delayed derivative part
%     (4) alpha= 0; beta=1; x4=b1     PD-type  structure +    "        "       "
%
% Fo: Choice of an approximation (recommendation: 4 resp. 8)
%     (1) DIFF of 1. order       - OR - INT using RF and positive error
%     (2) TRANS via 0. order SH  - OR -  "    "   RF  "  negative   "
%     (3) DIFF: first differentiation 2. order, second differentiation 1. order
%     (4) INT using TF and DIFF of 1. order
%     (8) such as (4) but additional delay of the derivative part: 1/(1+pTZ)
%
%   S P E C I A L   C A S E S (not recommended due to an over-determined order in
%                              z-domain - use for comparison only):
%     (5) DIFF of 2.Ordnung
%     (6) INT using TF and DIFF of 2. order
%     (7) TRANS via 1. order SH
%
% applied abbreviations:
%            DIFF  - approximation of differentiation
%            INT   - approximation of integration
%            RF    - rectangular formula
%            TF    - trapezoid formula
%            TRANS - z-transform of a controller
%            SH    - sample & hold
% Attention: an error message will be generated in case of illegal combinations

% KEY WORDS: Quasi-continuous approximation, trapezoid formula, rectangular formula
%            approximation of differentiation, approximation of integration
%            delay of the derivative part, quasi-continuous knowledge
%            discontinuous controller

%  Copyright (c) 1997-2018. All Rights Reserved.
%                     Dr. Gert-Helge Geitner; TU Dresden, Fak. ET,
%                     Elektrotechnisches Institut (ETI); Mommsenstr. 13;
%                     D-01062 Dresden, Germany;
%                     http://eeiwzg.et.tu-dresden.de/ae2_files/ae_1.htm
%  Reference regarding Discontinuous Amplitude Optimum: Geitner, G.-H.:
%                     Entwurf digitaler Regler für elektrische Antriebe.
%                     publisher: VDE-Verlag GmbH Berlin und Offenbach 1996
%                     ISBN 3-8007-1847-2

%--------------------------------German------------------------------------------
%URLAZ    Umrechnung von Reglerparametern zwischen Laplace- und Z-Bereich
%         rav=urlaz bzw. rav=urlaz(rev(,UVA))
% Umrechnung auf Grundlage von Näherungen - >>>wahlweise menügeführt<<<
%         Belegung des Eingangsvektors: rev=[T Ri Bp Sz Fo x1 x2 x3 x4]
%             "     "  Ausgangs   "     rav=[y1,y2,y3,y4]
%         (,UVA)=wahlweise Unterdrückung von Warnungen
%                (bel.=nein/1=ja); default: 0
% Einsetzbar zum quasikontinuierlichen Verständnis für mit dem Digitalen
% Betragsoptimum (BOD) entworfene digitale Regler
%
%  T: Abtastzeit (alle Zeitgrößen müssen die gleiche Zeiteinheit besitzen)
% Ri: Umrechnungsrichtung (0) z in p oder (1) p in z
%
%                                               x1,y1  x2,y2  x3,y3   x4,y4
% Bp: Beschreibung im p-Bereich (Empfehlung: 0)
%     (0) additiv:  Kp(gamma+1/pTN+pTV/(1+pTZ))   Kp     TN     TV     TZ
%         (I-Struktur: gamma=0, sonst gamma=1)
%     (1) multiplikativ:(1+pT1)(1+pT2)/pT0        T1     T2     T0      0
%
%     Im Z-Bereich gilt der Zusammenhang:         Vr     d1     d2   d3,b1,d0
%     Vr(beta+d1(z^-1)+d2(z^-2)+d3(z^-3))/((1+alpha(z^-1))(1+b1(z^-1)))
%
% Sz: Struktureinstellung
%            Z-Bereich:                  p-Bereich:
%     (0) alpha=-1; beta=1; x4=d3     PID- und PI-Struktur
%     (1) alpha=-1; beta=0; x4=d0     I -Struktur
%     (2) alpha= 0; beta=1; x4=0      PD-Struktur
%     (3) alpha=-1; beta=1; x4=b1     PIDTZ-Struktur mit verz. D-Anteil
%     (4) alpha= 0; beta=1; x4=b1     PDTZ -    "     "    "      "
%
% Fo: Auswahl einer Näherung (Empfehlung: 4 bzw. 8)
%     (1) Diff mit 1.Ordnung     - oder - Int mit RF bei positivem Fehler
%     (2) Trans mit HG 0.Ordnung - oder -  "   "  RF  "  negativem   "
%     (3) Diff erste Ableitung 2.Ordnung, zweite Ableitung 1.Ordnung
%     (4) Int mit TF und Diff mit 1.Ordnung
%     (8) wie (4) aber mit Verzögerung des D-Anteiles: 1/(1+pTZ)
%
%   S O N D E R F Ä L L E (Wegen überbestimmter Ordnung im Z-Bereich
%                          nicht zu empfehlen! - nur für Vergleiche):
%     (5) Diff mit 2.Ordnung
%     (6) Int mit TF und Diff mit 2.Ordnung
%     (7) Trans mit HG 1.Ordnung
%
% verwendete Abkürzungen:
%            Diff  - Differentationsnachbildung
%            Int   - Integrationsnachbildung
%            RF    - Rechteckformel
%            TF    - Trapezformel
%            Trans - Z-Transformation des Reglers
%            HG    - Halteglied
% ACHTUNG: Bei nicht sinnvollen Kombinationen erfolgt Fehlermeldung

% SCHLÜSSELWORTE: Quasianaloge Näherung, Trapezformel, Rechteckformel,
%                 Differentationsnachbildung, verzögerter D-Anteil,
%                 Quasikontinuierliches Verständnis digitaler Regler,

%  Copyright (c) 1997-2018. All Rights Reserved.
%                     Dr. Gert-Helge Geitner; TU Dresden, Fak. ET,
%                     Elektrotechnisches Institut (ETI); Mommsenstr. 13;
%                     D-01062 Dresden, Germany;
%                     http://eeiwzg.et.tu-dresden.de/ae2_files/ae_1.htm
%  Literatur zum Digitalen Betragsoptimum: Geitner, G.-H.:
%                     Entwurf digitaler Regler für elektrische Antriebe.
%                     VDE-Verlag GmbH Berlin und Offenbach 1996
%                     ISBN 3-8007-1847-2
%------------------End German-------------------------------------------------

FT01='Dimension error: input vector: ';
FT02='Sampling time: not useful';
FT03='Error: controller parameter input';
FT04='Gain=0: not useful!';
FT05='No conversion for P-type controller!';
FT06='Input switches: illegal setting!';
FT07='No calculation for selected combination: structure/approximation!';
FT08='Selected structure forces x4=0!';
FT09='Valid only in case of d1=-(4*d2+11*d3)';
FT10='Valid only in case of d2=-5*d3';
FT11='Valid only in case of d1=-(1+3*d2+9*d3)';
FT12='Selected structure forces TV=0!';
FT13='Approximation 1 valid only in case of d0=1 and d1=0 (d2=0)';
FT14='Approximation 2 valid only in case of d0=0 and d1=1 (d2=0)';
FT15='Approximation 4 valid only in case of d0=d1=1 (d2=0)';
FT16='Approximation 7 valid only in case of d0=0, d1=3 and d2=-1';
FT17='Selected structure forces TN=0!';
FT18='Valid only in case of d1=-4*d2';
FT19='Valid only in case of d1=-3*d2';
FT20='No real multiplicative solution!';
WT01='Warning: negative gain in fact?';
WT02='Warning: proper absolute value of the polynomial coefficient in fact?';
WT03='Warning: special case d0=0 results!';

narginchk(0,2);  % obsolete versions: error(nargchk(0,2,nargin));
if nargin==2 if UVA~=1; UVA=0; end
else UVA=0; end                      %keine Unterdrückung von Ausgabetexten
if nargin>0
   [me,ne]=size(rev); if ((ne~=9)|(me>1)) error(FT01); end
else
ans=input('sampling_time =');
     if isempty(ans)|ans<=0 error(FT02); else rev(1)=ans; end
ans=input('conversion direction: z2s(any)/s2z(1) =');
     if isempty(ans)|ans~=1; ans=0; end; rev(2)=ans;
ans=input('modelling in s-domain: add(any)/mul(1) =');
     if isempty(ans)|ans~=1; ans=0; end; rev(3)=ans;
ans=input('structure type: PID/PI(any),I(1),PD(2),PIDTZ(3),PDTZ(4) =');
     if isempty(ans)|~(ans==1|ans==2|ans==3|ans==4) ans=0; end; rev(4)=ans;
ans=input('approximation formula (1...8) ='); h4=0;
     if isempty(ans)|ans<1|ans>8 ans=0; end; rev(5)=ans;
       if rev(2)==1
          if rev(3)==1
     h1=input('numerator time constant T1(enter=0) ='); if isempty(h1) h1=0; end;
     h2=input('numerator time constant T2(enter=0) ='); if isempty(h2) h2=0; end;
     h3=input('denominator time constant T0(enter=0) ='); if isempty(h3) h3=0; end;
             if h1<0|h2<0|h3<0 error(FT03); end
          else
             h1=input('controller gain Kp(enter=0) ='); if isempty(h1) h1=0; end;
             h2=input('reset time TN(enter=0) =');        if isempty(h2) h2=0; end;
             h3=input('rate time TV(enter=0) =');         if isempty(h3) h3=0; end;
             if rev(5)==8
           h4=input('delay time constant TZ(enter=0) ='); if isempty(h4) h4=0; end;
             end
             if h2<0|h3<0|h4<0 error(FT03); end %Verstärkungsprüfung weiter unten
          end
       else
          h1=input('gain Vr(enter=0) ='); if isempty(h1) h1=0; end;
          h2=input('d1(enter=0) =');          if isempty(h2) h2=0; end;
          h3=input('d2(enter=0) =');          if isempty(h3) h3=0; end;
          if rev(5)==8
             h4=input('b1(enter=0) =');       if isempty(h4) h4=0; end;
          elseif rev(5)==5|rev(5)==6|rev(5)==7
             h4=input('d3(enter=0) =');       if isempty(h4) h4=0; end;
          elseif rev(4)==1
             h4=input('d0(enter=0) =');       if isempty(h4) h4=0; end;
          end
       end
rev(6)=h1; rev(7)=h2; rev(8)=h3; rev(9)=h4;
end
if (rev(6)==0)&((rev(2)==0)|(rev(3)==0)) error(FT04); end
if ((rev(7)==0)&(rev(8)==0)&(rev(9)==0))&((rev(2)==0)|(rev(3)==0)) error(FT05); end
T=rev(1); Ri=rev(2); Bp=rev(3); Sz=rev(4); Fo=rev(5);
if ~((Ri==0)|(Ri==1))|~((Bp==0)|(Bp==1))|(Sz<0)|(Sz>4)|(rem(Sz,1)~=0)...
    |(Fo<1)|(Fo>8)|(rem(Fo,1)~=0)|((Bp==1)&(Sz>1)) error(FT06); end
if ~(((Fo==8)&((Sz==3)|(Sz==4))&(Bp==0))|((Sz==0)&(Fo~=8))|...
   ((Sz==1)&~((Fo==3)|(Fo==5)|(Fo==6)|(Fo==8)))|...
   (((Sz==4)|(Sz==2))&~((Fo==4)|(Fo==6)))) error(FT07); end
if (rev(9)~=0)&(((Bp==1)&((Ri==1)|((Ri==0)&(Sz>1))))|...
   ((Bp==0)&(((Ri==1)&(Fo~=8))|((Ri==0)&(Fo<5)&(Sz~=1))))) error(FT08); end
if (~(Ri==1&Bp==1))&rev(6)<0&UVA~=1 disp(WT01); end
if Ri==0&UVA~=1&(abs(rev(7))>5|abs(rev(8))>5|abs(rev(9))>5) disp(WT02); end
if Ri==1
   if Bp==1
      if Sz~=1   TN=rev(6)+rev(7); V=TN/rev(8); TV=rev(6)*rev(7)/TN;
      else       TN=rev(8); V=1; TV=0; end
   else          TN=rev(7); V=rev(6); TV=rev(8); end
   TZ=rev(9);
   d2=0; d3=0; b1=0;
else
   V=rev(6); d1=rev(7); d2=rev(8);
   if Fo==8  b1=rev(9);
   elseif    Sz==1 d0=rev(9);
   else      b1=0; d3=rev(9); end
   TN=0; TV=0; TZ=0;
end
if (Sz==0)|(Sz==3)                 % >>>PID- oder PI-Struktur<<<
  if Ri==1           b=T/TN; c=TV/T; d=TZ/T;
     if Fo==1        N=1+b+c;   d1=-(1+2*c); d2=c;
     elseif Fo==2    N=1+c;     d1=-1+b-2*c; d2=c;
     elseif Fo==3    N=1.5+b+c; d1=-2*(1+c); d2=0.5+c;
     elseif (Fo==4)|(Fo==8)
                    N=(1+d*b+b/2+c+d)/(1+d); d1=-(1+d*b-b/2+2*(c+d))/(1+d);
                    d2=(c+d)/(1+d);          b1=-d/(1+d);
     elseif Fo==5   N=1.5+b+2*c;   d1=-2-5*c;       d2=0.5+4*c; d3=-c;
     elseif Fo==6   N=1+b/2+3*c/2; d1=-1+b/2-7*c/2; d2=5*c/2;   d3=-c/2;
     elseif Fo==7   N=1+2*c;       d1=-1+3*b/2-5*c; d2=4*c-b/2; d3=-c;
     end
     V=V*N; d1=d1/N; d2=d2/N; d3=d3/N;
  else
     if Fo==1       N=-(d1+2*d2); TN=1+d1+d2; TV=-d2;
     elseif Fo==2   N=1-d2;       TN=1+d1+d2; TV=-d2;
     elseif Fo==3   N=-(d1+2*d2); TN=1+d1+d2; TV=-0.5*d1-2*d2;
     elseif (Fo==4)|(Fo==8)
                    N=0.5*(1+3*b1-d1*(1-b1)-d2*(3+b1))/((1+b1)^2);
                    TZ=-T*b1/(1+b1); TN=(1+d1+d2)/(1+b1);
                    TV=-((1+3*b1-d1*(1-b1))*b1+d2*(2+b1+b1^2))/(2*((1+b1)^3));
     elseif Fo==5   if ~(abs(d1+4*d2+11*d3)<1E-5) error(FT09); end
                    N=2*d2+8*d3; TN=1-3*d2-10*d3; TV=d3;
     elseif Fo==6   if ~(abs(d2+5*d3)<1E-5) error(FT10); end
                    N=(1-d1+10*d3)/2; TN=1+d1-4*d3; TV=2*d3;
     elseif Fo==7   if ~(abs(d1+1+3*d2+9*d3)<1E-5) error(FT11); end
                    N=1+2*d3; TN=-2*(d2+4*d3); TV=d3;
     end
     V=V*N; TN=N*T/TN; TV=-TV*T/N;
  end
elseif Sz==1                     % >>>I-Struktur<<<
  if Ri==1
     if TV~=0 error(FT12); end
     V=T*V/TN;
     if (Fo==1)|(Fo==2)
        if Fo==1 d0=1; d1=0;
        else     d0=0; d1=1; end
     elseif (Fo==4)|(Fo==7)
        if Fo==4 d0=1; d1=1;
        else     d0=0; d1=3; d2=-1; end
        V=V/2; end
  else
     TN=T/V;
     if (Fo==1)|(Fo==2)
        if ~((d0==1)&(d1==0)&(d2==0))&(Fo==1) error(FT13);          %Näherung 1
        elseif ~((d0==0)&(d1==1)&(d2==0))&(Fo==2) error(FT14); end  %Näherung 2
     elseif (Fo==4)|(Fo==7)
        if ~((d0==1)&(d1==1)&(d2==0))&(Fo==4) error(FT15);          %Näherung 4
        elseif ~((d0==0)&(d1==3)&(d2==-1))&(Fo==7) error(FT16); end %Näherung 7
        TN=TN/2; end
     V=1;
  end
  if d0==0&UVA~=1 disp(WT03); end
elseif (Sz==2)|(Sz==4)          % >>>PD-Struktur<<<
   if Ri==1
      if TN~=0 error(FT17); end
      c=TV/T; d=TZ/T;
      if (Fo==1)|(Fo==2)|(Fo==8) 
                                 N=(1+c+d)/(1+d); d1=-(c+d)/(N*(1+d)); 
                                                  b1=-d/(1+d);
      elseif (Fo==3)|(Fo==5)     N=1+3*c/2; d1=-2*c/N; d2=0.5*c/N;
      elseif Fo==7               N=1+2*c; d1=-3*c/N; d2=c/N; end
      V=V*N;
   else
      if (Fo==1)|(Fo==2)|(Fo==8)
         N=1+d1; V=V/(1+b1); TV=(d1-b1)/(1+b1); TZ=-b1*T/(1+b1);
      elseif (Fo==3)|(Fo==5)
         if ~(abs(d1+4*d2)<1E-5) error(FT18); end; N=1+3*d1/4; TV=0.5*d1;
      elseif Fo==7
         if ~(abs(d1+3*d2)<1E-5) error(FT19); end; N=1+2*d1/3; TV=d1/3;
      end
      V=V*N; TV=-TV*T/N; end
end
y1=V;
if Ri==1
   y2=d1; y3=d2;
      if     Sz==1   y4=d0;
      elseif Fo==8   y4=b1;
      else           y4=d3; end
else
   if Bp==0
   y2=TN; y3=TV; y4=TZ;
   else
     if Sz==0
        y3=TN/V; wu=sqrt(-TV*TN+(TN/2)^2);
        if imag(wu)~=0 error(FT20); end
        y1=TN/2+wu; y2=TN-y1;
     else
        y1=0; y2=0; y3=TN; end
   y4=0; end
end
rav=[y1 y2 y3 y4];
