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

N2:=StrToInt(ComboBox4.Text);

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

if Kdat=0 then

begin//Kdat

messagedlg('Коэффициент датчика не должен быть,'#13+

'                  равен нулю!',mtError,[mbOK],0);

Exit;

end;//Kdat

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

if Kim=0 then

begin//Kim

messagedlg('Коэффициент ИМ не должен быть,'#13+

'            равен нулю!',mtError,[mbOK],0);

Exit;

end;//Kim

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

if Kro=0 then

begin//Kro

messagedlg('Коэффициент РО не должен быть,'#13+

'            равен нулю!',mtError,[mbOK],0);

Exit;

end;//Kro

//учет или неучет нелинейности РО

if RadioButton3.Checked=true then

begin//lin

C1:=1000;

C2:=-1000;

B1:=0;

B2:=0;

goto L2;

end//lin

else

if RadioButton4.Checked=false then goto L2;

L2:

//расчет постоянных вспомогателных переменных

m:=round(Tau/T0);

mmax:=m;

Vr:=-T0;

d:=exp(-T0/T);

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

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

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

n:=mmax;

R:=0;

C0:=0;

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

For I:=1 To n do

begin//nul

X[I]:=0;

U[I]:=0;

Y0[I]:=0;

end;//nul

n:=n+1;

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

With StringGrid2 do

begin//zag_tabl_1

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

Cells[1,0]:='Возмущение Сf1';

Cells[2,0]:='Выход системы';

RowCount:=2;

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

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

Vr:=Vr+T0;

for I:=0 to N2 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 StringGrid2 do

begin//1

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

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

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

RowCount:=RowCount+1;

end;//1

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

if RadioButton3.Checked=true then

Begin

Series4.AddXY(Vr,Y);

Series5.AddXY(Vr,Cf1);

End;

if RadioButton4.Checked=true then

begin//in & out

Series6.AddXY(Vr,Y);

Series5.AddXY(Vr,Cf1);

end;//in & out

Vr:=Vr+T0;

n:=n+1;

end;//rab_cikl

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

procedure TForm1.DChange(Sender: TObject);

var

I,N1,N2: integer;

begin//0

N1:=StrToInt(ComboBox2.Text);

N2:=StrToInt(ComboBox4.Text);

Series1.Clear;

Series2.Clear;

Series3.Clear;

Series4.Clear;

Series5.Clear;

Series6.Clear;

For I:=1 To N1 do

With StringGrid1 do

begin//1

Cells[0,I]:='';

Cells[1,I]:='';

Cells[2,I]:='';

Cells[3,I]:='';

Cells[4,I]:='';

RowCount:=2;

end;//1

For I:=1 To N2 do

With StringGrid2 do

begin//2

Cells[0,I]:='';

Cells[1,I]:='';

Cells[2,I]:='';

Cells[3,I]:='';

Cells[4,I]:='';

RowCount:=2;

end;//2

end;//0

procedure TForm1.Button3Click(Sender: TObject);

label LSys,NelSys;//описание меток

Var

f:TextFile;

NameFile:string;

I,N1:Integer;

begin//1

//проверка существования расчета

if stringgrid2.Cells[0,1]=''then

begin//2

messagedlg('Нет расчета переходного процесса по заданию !',mtError,[mbOK],0);

exit;

end;//2

N1:=StrToInt(ComboBox1.text);

if OpenDialog1.execute then

begin//3

NameFile:=OpenDialog1.FileName;

AssignFile(f,NameFile);

Rewrite(f);

Writeln(f,' РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ ПЕРЕХОДНОГО ПРОЦЕССА');

if RadioButton1.Checked=true then//если система линейная

begin//lin

writeln(f,'               ПО ЗАДАЮЩЕМУ ВОЗДЕЙСТВИЮ');

writeln(f,'                  Линейная система');

end;//lin

if RadioButton1.Checked=false then//если система нелинейная

begin//nelin

writeln(f,'               ПО ЗАДАЮЩЕМУ ВОЗДЕЙСТВИЮ');

writeln(f,'                  Нелинейная система');

end;//nelin

Writeln(f);

Writeln(f,'            Передаточная функция объекта:');

Writeln(f);

Writeln(f,'                           -Tau*p');

Writeln(f,'                        K*e      ');

Writeln(f,'              Wo(p)=-------------');

Writeln(f,'                       p(1+Tp)');

Writeln(f);

Writeln(f,'              где:');

Writeln(f,'               коэффициент передачи К=',Edit7.text);

Writeln(f,'               постоянная времени   Т=',Edit8.text);

Writeln(f,'                    запаздывание  Tau=',Edit9.text);

Writeln(f);

Writeln(f,'*********************************************************');