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;
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.