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 _Controller: TController; c1, c2, c3, c4, c5: real; muv, nuv, iv, Tnu: real; FileName: string; procedure TakeData; procedure PlotResult; public procedure ConnectController(var aController: TController); end; // TController = class private _Border: TFormBase; _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; _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.PlotResult; var j: integer; begin Series1.Clear; for j := 1 to 1000 do Series1.AddXY(0.01 * (j - 1), FormBase._Controller.teta[j], '', clRed); end; // procedure TFormBase.CalcPlotClick(Sender: TObject); 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; Controller._Border.PlotResult; 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.