unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TeEngine, ExtCtrls, TeeProcs, Chart, Series; type TController = class; TStorage = class; TForm1 = class(TForm) Chart1: TChart; Button1: TButton; Series1: TLineSeries; b1: TEdit; b3: TEdit; treg: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button2: TButton; sd1: TSaveDialog; Button3: TButton; procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; // Border TmyBord = class(TForm1) private /// True fController: TController; function getController(): TController; procedure setController(c: TController); public /// True property controller: TController read getController write setController; procedure drawGraph(); procedure saveData(); end; // Controller TController = class private /// True fBorder: TmyBord; fStorage: TStorage; function getStorage(): TStorage; procedure setStorage(s: TStorage); function geTmyBord(): TmyBord; procedure seTmyBord(b: TmyBord); public /// True procedure getDataFromBorder(); procedure Calculate(); /// True property storage: TStorage read getStorage write setStorage; /// True property border: TmyBord read geTmyBord write seTmyBord; end; // Storage TStorage = class private /// True fController: TController; b1, b3, treg, mue, ie, nue: real; gamma: array [1 .. 1000] of real; function getController(): TController; procedure setController(c: TController); public procedure saveData(fname: string); property controller: TController read getController write setController; end; var myBord: TmyBord; myCont: TController; myStor: TStorage; implementation {$R *.dfm} procedure TmyBord.saveData; begin if sd1.Execute then begin controller.storage.saveData(sd1.FileName); end; end; procedure TStorage.saveData(fname: string); var s: Tstrings; j: integer; begin s := TStringList.Create; try for j := 1 to 1000 do begin s.Add(FloatToStr(0.01 * (j - 1)) + ' ' + FloatToStr (gamma[j])) end; except ShowMessage('Error saving, exit'); end; s.SaveToFile(fname); end; procedure TController.getDataFromBorder; begin storage.b1 := StrToFloat(border.b1.Text); storage.b3 := StrToFloat(border.b3.Text); storage.treg := StrToFloat(border.treg.Text); end; procedure TController.Calculate; { 1. расчет передаточных чисел автопилота 2. интегрирование уравнений движения численным методом и получение значений графика переходного процесса системы ЛА-АП крена } var i: integer; t1, t2, n, h: real; wx, wxl, wxpr, x, xpr, gammazad, gammaprev, ksi: real; b1, b3, treg: real; begin b1 := storage.b1; ShowMessage(FloatToStr(b1)); b3 := storage.b3; treg := storage.treg; // 1. расчет передаточных чисел автопилота storage.mue := (18 - b1 * treg) / (b3 * treg); storage.ie := 108 / (b3 * treg * treg); storage.nue := 216 / (b3 * treg * treg * treg); gammazad := 1; t2 := 10; t1 := 0; n := 1000; // кол-во шагов h := (t2 - t1) / n; // шаг по времени storage.gamma[1] := 0; gammaprev := storage.gamma[1]; wx := 0; // omega x - угл скорость по крену wxl := 0; // производная угл скорости x := 0; // gamma, угол крена, получаемый интегрированием // 2. интегрирование уравнений движения численным методом // и получение значений графика переходного процесса for i := 2 to 1000 do begin ksi := gammaprev - gammazad; wxpr := wx; xpr := x; wxl := b1 * wx - b3 * (storage.mue * wx + storage.ie * gammaprev / 180 * pi + storage.nue * ksi); wx := wxpr + h * wxl; // x := xpr + h * wx; storage.gamma[i] := x; gammaprev := storage.gamma[i]; end; end; procedure TmyBord.drawGraph(); var j: integer; begin Series1.Clear; for j := 1 to 1000 do Series1.AddXY(0.01 * (j - 1), controller.storage.gamma[j], '', clRed); end; procedure TForm1.Button2Click(Sender: TObject); begin TmyBord(self).saveData; end; procedure TForm1.Button3Click(Sender: TObject); begin Close; end; procedure TForm1.FormCreate(Sender: TObject); begin // creating variables myCont := TController.Create(); myStor := TStorage.Create(); // connecting them myBord.controller := myCont; myStor.controller := myCont; myCont.border := myBord; myCont.storage := myStor; // trying to change myCont.border.Caption := 'Lab'; end; procedure TForm1.Button1Click(Sender: TObject); begin try TmyBord(self).controller.getDataFromBorder; except ShowMessage('Error: incorrect input data'); exit; end; TmyBord(self).controller.Calculate; TmyBord(self).controller.border.drawGraph(); end; // border, connect controller procedure TmyBord.setController(c: TController); begin if c = nil then begin ShowMessage('error: Controller is nill'); exit; end; fController := c; end; function TmyBord.getController(): TController; begin if fController = nil then ShowMessage('error: Controller is not assigned to Border'); result := self.fController; end; // controller, connect border procedure TController.seTmyBord(b: TmyBord); begin if b = nil then ShowMessage('error: Border is nill'); self.fBorder := b; end; function TController.geTmyBord(): TmyBord; begin if fBorder = nil then ShowMessage('error: Border is not assigned to Controller'); result := self.fBorder; end; // controller, connect storage procedure TController.setStorage(s: TStorage); begin if s = nil then begin ShowMessage('error: Storage is nill'); exit; end; fStorage := s; end; function TController.getStorage(): TStorage; begin if fStorage = nil then begin ShowMessage('error: Storage is not assigned to Controller'); end; result := fStorage; end; // storage, connect controller procedure TStorage.setController(c: TController); begin if c = nil then begin ShowMessage('error: Controller is nill'); exit; end; fController := c; end; function TStorage.getController(): TController; begin if fController = nil then begin ShowMessage('error: Controller is not assigned to Storage'); end; result := self.fController; end; end.