unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TeEngine, ExtCtrls, TeeProcs, Chart, Series;
type
TController = class;
TStorage = class;
//
TFormBase = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Label1: TLabel;
Label2: TLabel;
Chart1: TChart;
SaveDialog1: TSaveDialog;
CalcPlot: TButton;
SaveExit: TButton;
Series1: TLineSeries;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
procedure CalcPlotClick(Sender: TObject);
procedure SaveExitClick(Sender: TObject);
private
/// True
_Controller: TController;
c1, c2, c3, c4, c5: real;
muv, nuv, iv, Tnu: real;
FileName: string;
procedure TakeData;
public
procedure ConnectController(var aController: TController);
end;
//
TController = class
private
/// True
_Border: TFormBase;
/// True
_Storage: TStorage;
c1, c2, c3, c4, c5: real;
muv, nuv, iv, Tnu: real;
teta: array [1 .. 1000] of real;
FileName: string;
procedure TransmitFromBorderToStorage;
procedure TransmitParamAPToStorage;
procedure PrepareData;
procedure CalcParam;
procedure Table;
public
procedure ConnectBorder(var aBorder: TFormBase);
procedure ConnectStorage(var aStorage: TStorage);
end;
//
TStorage = class
private
c1, c2, c3, c4, c5: real;
muv, nuv, iv, Tnu: real;
/// True
_Controller: TController;
FileName: string;
procedure SaveData;
public
procedure ConnectController(var aController: TController);
end;
//
var
FormBase: TFormBase;
Controller: TController;
Storage: TStorage;
implementation
{$R *.dfm}
procedure TFormBase.ConnectController(var aController: TController);
begin
Self._Controller := aController;
end;
//
procedure TController.ConnectBorder(var aBorder: TFormBase);
begin
Self._Border := aBorder;
end;
//
procedure TController.ConnectStorage(var aStorage: TStorage);
begin
Self._Storage := aStorage;
end;
//
procedure TStorage.ConnectController(var aController: TController);
begin
Self._Controller := aController;
end;
//
//
procedure TFormBase.TakeData;
begin
FormBase.c1 := StrToFloat(Edit1.Text);
FormBase.c2 := StrToFloat(Edit2.Text);
FormBase.c3 := StrToFloat(Edit3.Text);
FormBase.c4 := StrToFloat(Edit4.Text);
FormBase.c5 := StrToFloat(Edit5.Text);
FormBase.FileName := SaveDialog1.FileName;
end;
//
procedure TController.TransmitFromBorderToStorage;
begin
Controller._Storage.c1 := Controller._Border.c1;
Controller._Storage.c2 := Controller._Border.c2;
Controller._Storage.c3 := Controller._Border.c3;
Controller._Storage.c4 := Controller._Border.c4;
Controller._Storage.c5 := Controller._Border.c5;
Controller._Storage.FileName := Controller._Border.FileName;
end;
//
procedure TController.TransmitParamAPToStorage;
begin
Controller._Storage.muv := Controller.muv;
Controller._Storage.iv := Controller.iv;
Controller._Storage.nuv := Controller.nuv;
Controller._Storage.Tnu := Controller.Tnu;
end;
//
procedure TStorage.SaveData;
var
File1: TextFile;
str: string;
begin
AssignFile(File1, Storage.FileName);
ReWrite(File1);
str := 'Коэффициенты линейной модели ЛА:';
Writeln(File1, str);
str := 'c1 = ' + FloatToStr(Storage.c1);
Writeln(File1, str);
str := 'c2 = ' + FloatToStr(Storage.c2);
Writeln(File1, str);
str := 'c3 = ' + FloatToStr(Storage.c3);
Writeln(File1, str);
str := 'c4 = ' + FloatToStr(Storage.c4);
Writeln(File1, str);
str := 'c5 = ' + FloatToStr(Storage.c5);
Writeln(File1, str);
str := 'Передаточные числа автопилота:';
Writeln(File1, str);
str := 'muv = ' + FloatToStr(Storage.muv);
Writeln(File1, str);
str := 'iv = ' + FloatToStr(Storage.iv);
Writeln(File1, str);
str := 'nuv = ' + FloatToStr(Storage.nuv);
Writeln(File1, str);
str := 'Tnu = ' + FloatToStr(Storage.Tnu);
Writeln(File1, str);
Close(File1);
end;
//
procedure TController.PrepareData;
begin
Controller.c1 := Controller._Border.c1;
Controller.c2 := Controller._Border.c2;
Controller.c3 := Controller._Border.c3;
Controller.c4 := Controller._Border.c4;
Controller.c5 := Controller._Border.c5;
end;
//
procedure TController.CalcParam;
var
cp1, cp2, cp3, cp4, cp5: real;
OmegaA, TA, Tv, Kc, ash, bsh, Kcsh, TAsh: real;
begin
cp1 := Controller.c1;
cp2 := Controller.c2;
cp3 := Controller.c3;
cp4 := Controller.c4;
cp5 := Controller.c5;
OmegaA := sqrt(cp1 * cp4 + cp2);
TA := 1 / OmegaA;
Tv := 1 / cp4;
Kc := cp3 * cp4 / (cp1 * cp4 + cp2);
ash := 2 * (cp1 + cp5 - cp4) / cp3;
bsh := ((cp1 + cp4 + cp5) * (cp1 + cp4 + cp5) - 4 * (cp1 * cp4 + cp2)) /
(cp3 * cp3);
Controller.muv := abs(-ash / 2 + sqrt(ash * ash / 4 - bsh));
Kcsh := Kc / (1 + Controller.muv * Kc);
TAsh := TA / sqrt(1 + Controller.muv * Kc);
Controller.iv := 1 / (Kcsh * Tv);
Controller.nuv := 0.09 / (Kcsh * Tv * Tv);
Controller.Tnu := Controller.iv / Controller.nuv;
end;
//
procedure TController.Table;
var
i: integer;
CC1, CC2, CC3, CC4, CC5, mu, nu, ivC: real;
t1, t2, n, h: real;
al, alpr, wz, wzpr, x1, x1pr, x2, x2pr, tetazad: real;
begin
CC1 := Controller.c1;
CC2 := Controller.c2;
CC3 := Controller.c3;
CC4 := Controller.c4;
CC5 := Controller.c5;
mu := Controller.muv;
nu := Controller.nuv;
ivC := Controller.iv;
tetazad := 1;
t2 := 10;
t1 := 0;
n := 1000;
h := (t2 - t1) / n;
al := pi / 180;
Controller.teta[1] := pi / 180;
wz := 0;
x1 := 0;
x2 := -1;
for i := 2 to 1000 do
begin
wzpr := wz;
alpr := al;
x1pr := x1;
x2pr := x2;
wz := wzpr + h * (-wzpr * (CC1 + CC5 + CC3 * mu) - alpr * (CC2 - CC4 * CC5)
- CC3 * nu * x1pr - CC3 * ivC * x2pr);
x1 := x1pr + h * x2pr;
al := alpr + h * (wzpr - alpr * CC4);
x2 := x2pr + h * wzpr;
Controller.teta[i] := x2 + tetazad;
end;
end;
//
procedure TFormBase.CalcPlotClick(Sender: TObject);
var
j: integer;
begin
Controller._Border.TakeData;
Controller.PrepareData;
Controller.CalcParam;
Label7.Visible := True;
Label8.Visible := True;
Label9.Visible := True;
Label10.Visible := True;
Label11.Visible := True;
Edit6.Text := FloatToStr(Controller.muv);
Edit7.Text := FloatToStr(Controller.iv);
Edit8.Text := FloatToStr(Controller.nuv);
Edit9.Text := FloatToStr(Controller.Tnu);
Edit6.Visible := True;
Edit7.Visible := True;
Edit8.Visible := True;
Edit9.Visible := True;
Controller.Table;
Series1.Clear;
for j := 1 to 1000 do
Series1.AddXY(0.01 * (j - 1), FormBase._Controller.teta[j], '', clRed);
end;
//
procedure TFormBase.SaveExitClick(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
FormBase.TakeData;
Controller.TransmitFromBorderToStorage;
Controller.TransmitParamAPToStorage;
Controller._Storage.SaveData;
Close;
end;
end;
//
end.