(* Ermittlung von wichtigen Streckendaten nach dem T-Summen-Verfahren       *)
(* ==================================================================       *)

(* Für Erläuterungen bitte nachschlagen:                                    *)
(* http://proconsol.de                                                      *)
(* atp 5/95 und 12/95                                                       *)


(* Ausgangsdaten                                                            *)
(* =============                                                            *)
(* Die Messdaten liegen in :                                                *)
(* ul^[i]             Streckeneingang                                       *)
(* xl^[i]             Streckenausgang                                       *)
(*                                                                          *)
(* anzahl : integer;  Anzahl der Abtastpunkte im Datensatz                  *)
(* dt     : real;     Abtastzeit des Datensatzes                            *)

(*  A C H T U N G  ! ! !                                                    *)
(* Es folgen zwei unabhängige Algorithmen für verschiedene Streckentypen.   *)
(* Die Programmteile müssen in ein Gesamtprogramm eingebunden werden !      *)
(* ( Sie sind nicht direkt lauffähig ! )                                    *)




(* Algorithmus für Strecke mit Ausgleich *)

VAR
Ks,Offs,Tvzg : FLOAT;      (* Streckeneigenschaften *)

Tstart,Tend  : FLOAT;      (* Start- und Endzeitpunkt der Auswertung *)

i,i1,i2      : integer;
istart,iend  : integer;
ispan        : integer;

Ustart,Uend  : FLOAT;     (* Werte zum Start- und Endzeitpunkt der Auswertung *)
Xstart,Xend  : FLOAT;

Usum,Xsum    : FLOAT;
Uint,Xint    : FLOAT;


  begin

  (* Nummern der Datensätze für den Start- und Endzeitpunkt der Auswertung *)
  istart:=round(Tstart/dt);
  iend:=round(Tend/dt);
  if istart<1 then istart:=1;
  if iend>anzahl then iend:=anzahl;

  (* Bereich zur Mittelung der Anfangswerte festlegen *)
  ispan:=round((iend-istart)*0.02)+2;
  i1:=istart-ispan;
  if i1<1 then i1:=1;
  i2:=i1+2*ispan;

  (* Anfangswerte ermitteln *)
  Ustart:=0;
  Xstart:=0;
  for i:=i1 to i2 do
    begin
    Ustart:=Ustart+ul^[i];
    Xstart:=Xstart+xl^[i]
    end;
  Xstart:=Xstart/(2*ispan+1);
  Ustart:=Ustart/(2*ispan+1);

  (* Bereich zur Mittelung der Endwerte festlegen *)
  i2:=iend+ispan;
  if i2>anzahl then i2:=anzahl;
  i1:=i2-2*ispan;

  (* Endwerte ermitteln *)
  Uend:=0;
  Xend:=0;
  for i:=i1 to i2 do
    begin
    Uend:=Uend+ul^[i];
    Xend:=Xend+xl^[i]
    end;
  Xend:=Xend/(2*ispan+1);
  Uend:=Uend/(2*ispan+1);

  (* Streckenverstärkung *)
  Ks:=(Xend-Xstart)/(Uend-Ustart);

  (* Offset = Wert am Streckenausgang bei u=0 *)
  Offs:=Xstart-Ks*Ustart;

  (* Integrale über Ein- und Ausgangssignal rechnen *)
  usum:=0;
  xsum:=0;
  for i:=istart to iend do
    begin
    usum:=usum+ul^[i];
    xsum:=xsum+xl^[i];
    end;

  (* Grundblock abziehen *)
  Uint:=(usum-(iend-istart)*Ustart)*dt;
  Xint:=(xsum-(iend-istart)*Xstart)*dt;

  (* Summen-Zeitkonstante *)
  Tvzg:=abs((Uint-Xint/Ks)/(Uend-Ustart));

  end;

(* Ende Algorithmus für Strecke mit Ausgleich *)




(* Algorithmus für Strecke ohne Ausgleich *)

VAR
Ti,Offs,Tvzg : FLOAT;      (* Streckeneigenschaften *)

Tstart,Tend  : FLOAT;      (* Start- und Endzeitpunkt der Auswertung *)

i,i1,i2        : integer;
istart,iend    : integer;
ispan          : integer;

Ustart,Uend  : FLOAT;
Xend,Xstart  : FLOAT;
XPstart,XPend: FLOAT;      (* Steigungen zum Start- und Endzeitpunkt der Auswertung *)

Usum           : FLOAT;
Uint           : FLOAT;


  begin
  istart:=round(Tstart/dt);
  iend:=round(Tend/dt);
  if istart<1 then istart:=1;
  if iend>anzahl then iend:=anzahl;

  ispan:=round((iend-istart)*0.02)+2;
  i1:=istart-ispan;
  if i1<1 then i1:=1;
  i2:=i1+2*ispan;

  Ustart:=0;
  Xstart:=0;
  for i:=i1 to i2 do
    begin
    Ustart:=Ustart+ul^[i];
    Xstart:=Xstart+xl^[i]
    end;
  Ustart:=Ustart/(2*ispan+1);
  Xstart:=Xstart/(2*ispan+1);
  XPstart:=(xl^[i2]-xl^[i1])/(i2-i1)/dt;

  i2:=iend+ispan;
  if i2>anzahl then i2:=anzahl;
  i1:=i2-2*ispan;

  Uend:=0;
  Xend:=0;
  for i:=i1 to i2 do
    begin
    Uend:=Uend+ul^[i];
    Xend:=Xend+xl^[i]
    end;
  Uend:=Uend/(2*ispan+1);
  Xend:=Xend/(2*ispan+1);
  XPend:=(xl^[i2]-xl^[i1])/(i2-i1)/dt;

  (* Ermittlung der Integrationszeitkonstante in der Strecke *)
  if (XPend-XPstart)<>0 then Ti:=(Uend-Ustart)/(XPend-XPstart)
                        else Ti:=0;

  (* Steigung am Streckenausgang bei u=0 *)
  Offs:=XPstart*Ti-Ustart;

  (* Integral über dem Streckeneingangssignal *)
  usum:=0;
  for i:=istart to iend do
    usum:=usum+ul^[i]+Offs;
  Uint:=usum*dt;

  (* Summen-Zeitkonstante *)
  Tvzg:=abs((Uint-(Xend-Xstart)*Ti)/(Uend-Ustart));

  end;

(* Ende Algorithmus für Strecke ohne Ausgleich *)


