Имитационное моделирование системы управления с учетом нелинейности «Зона нечувствительности с ограничениями», страница 2

procedure Button4Click(Sender: TObject);

procedure DChange(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);

Label L1;//описание меток

Var//описание переменных

//описание параметров системы

d,C0,Cf1,K,T,Tau,Kf1,Tf1,K1,K2,Kro,Kim,Kdat,C1,C2,B1,B2,B11,B22: real;

//описание сигналов

Yf1,Y,Y1,R,f2,S: real;

X,U,Y0: array[1..100] of real;

//описание режимных показателей

T0,Vr: real;

N1,m,mmax,I,n: integer;

begin//перех.пр.по заданию

//считывание данных с визуальных элементов

C0:=StrToFloat(Edit5.Text);

Cf1:=StrToFloat(Edit6.Text);

K:=StrToFloat(Edit7.Text);

T:=StrToFloat(Edit8.Text);

Tau:=StrToFloat(Edit9.Text);

Kf1:=StrToFloat(Edit10.Text);

Tf1:=StrToFloat(Edit11.Text);

K1:=StrToFloat(Edit12.Text);

K2:=StrToFloat(Edit13.Text);

Kro:=StrToFloat(Edit16.Text);

Kim:=StrToFloat(Edit14.Text);

Kdat:=StrToFloat(Edit15.Text);

C1:=StrToFloat(Edit1.Text);

C2:=StrToFloat(Edit2.Text);

B1:=StrToFloat(Edit3.Text);

B2:=StrToFloat(Edit4.Text);

T0:=StrToInt(ComboBox1.Text);

N1:=StrToInt(ComboBox2.Text);

//проверка коэффициента датчика

if Kdat=0 then

begin//Kdat

messagedlg('Введите К датчика!',mtError,[mbOK],0);

Exit;

end;//Kdat

//проверка коэффициента исполнительного механизма

if Kim=0 then

begin//Kim

messagedlg('Введите К исполнительного механизма!',mtError,[mbOK],0);

Exit;

end;//Kim

//проверка коэффициента регулирующего органа

if Kro=0 then

begin//Kro

messagedlg('Введите К регулирующего органа',mtError,[mbOK],0);

Exit;

end;//Kro

//Рассчет линейной или нелинейной системы

if RadioButton1.Checked=true then

begin//lin

C1:=1000;

C2:=-1000;

B1:=0;

B2:=0;

goto L1;

end//lin

else

if RadioButton1.Checked=false then goto L1;

L1:

//расчет переменных

m:=round(Tau/T0);

mmax:=m;

d:=exp(-T0/T);

B11:=(C1+B1*Kro)/Kro;

B22:=(C2+B2*Kro)/Kro;

//задание начальных условий

n:=mmax;

R:=0;

Cf1:=0;

Vr:=-T0;

//обнуление массивов

For I:=1 To n do

begin//nul

X[I]:=0;

U[I]:=0;

Y0[I]:=0;

end;//nul

n:=n+1;

//заголовок таблицы

With StringGrid1 do

begin//Заголовок таблицы

Cells[0,0]:='Время';

Cells[1,0]:='Задание';

Cells[2,0]:='Система';

RowCount:=2;

end;//zag_tabl_1

//основной цикл расчета

Vr:=Vr+T0;

for I:=0 to N1 do

begin//rab_cikl

y0[n]:=U[n-m-1]*T*k-U[n-m-2]*T0*k*d-U[n-m-1]*T*k+U[n-m-1]*d*k*T+U[n-m-2]*T*k-U[n-m-2]*d*k*T+y0[n-1]*d+y0[n-1]-y0[n-2]*d;

Yf1:=Cf1*Kf1*(1-exp(-I*T0/Tf1));

Y:=Y0[n]+Yf1;

Y1:=Kdat*Y;

X[n]:=Kdat*C0-Y1;

R:=R+X[n]*K1-X[n-1]*K2;

S:=Kim*R;

if S<B22 then U[n]:=C2

else

if S>B11 then U[n]:=C1

else

if (S>B22) and (S<B2) then U[n]:=Kro*(S-B2)

else

if (S>B1) and (S<B11) then U[n]:=Kro*(S-B1)

else

U[n]:=0;

//отражение расчета в таблице

With StringGrid1 do

begin//1

cells[0,I+1]:=FloatToStrF(Vr,ffFixed,3,0);

cells[1,I+1]:=FloatToStrF(C0,ffFixed,8,4);

cells[2,I+1]:=FloatToStrF(Y,ffFixed,8,4);

RowCount:=RowCount+1;

end;//1

//построение графиков

if RadioButton1.Checked=true then

Begin

Series3.AddXY(Vr,Y);

Series2.AddXY(Vr,C0);

End;

if RadioButton2.Checked=true then

begin//in & out

Series1.AddXY(Vr,Y);

Series2.AddXY(Vr,C0);

end;//in & out

Vr:=Vr+T0;

n:=n+1;

end;//rab_cikl

end;//перех.пр.по заданию

procedure TForm1.Button1Click(Sender: TObject);

begin

Close;

end;

procedure TForm1.Button4Click(Sender: TObject);

Label L2;

Var//описание переменных

//описание параметров системы

d,C0,Cf1,K,T,Tau,Kf1,Tf1,K1,K2,Kro,Kim,Kdat,C1,C2,B1,B2,B11,B22: real;

//описание сигналов

Yf1,Y,Y1,R,S: real;

X,U,Y0: array[1..100] of real;

//описание режимных показателей

T0,Vr: real;

N2,m,mmax,I,n: integer;

begin//перех.пр.по возмущению

//считывание данных с визуальных элементов

C0:=StrToFloat(Edit5.Text);

Cf1:=StrToFloat(Edit6.Text);

K:=StrToFloat(Edit7.Text);

T:=StrToFloat(Edit8.Text);

Tau:=StrToFloat(Edit9.Text);

Kf1:=StrToFloat(Edit10.Text);

Tf1:=StrToFloat(Edit11.Text);

K1:=StrToFloat(Edit12.Text);

K2:=StrToFloat(Edit13.Text);

Kro:=StrToFloat(Edit16.Text);

Kim:=StrToFloat(Edit14.Text);

Kdat:=StrToFloat(Edit15.Text);

C1:=StrToFloat(Edit1.Text);

C2:=StrToFloat(Edit2.Text);

B1:=StrToFloat(Edit3.Text);

B2:=StrToFloat(Edit4.Text);

T0:=StrToInt(ComboBox3.Text);