Федеральное агентство по образованию Российской Федерации
Государственное образовательное учреждение высшего профессионального образования
Санкт-Петербургский Государственный Технологический Университет Растительных Полимеров
Кафедра АТЭП
КУРСОВАЯ РАБОТА
по дисциплине: «МОДЕЛИРОВАНИЕ СИСТЕМ»
на тему: «Имитационное моделирование системы управления с учетом нелинейности «Зона нечувствительности».
Выполнил: студент группы 542
Проверил:
Санкт – Петербург
2005г.
Содержание.
1. Структурная схема моделируемой системы ……………………...…………….
2. Математическое описание исходных данных…………………………………...
3. Определение дискретной модели заданной непрерывной части системы и соответствующего разностного уравнения……………………………………...
4. Определение непрерывной и дискретной модели нелинейной характеристики заданного элемента системы………………………………………..…………….
5. Составление системы разностных уравнений, описывающих работу замкнутой системы управления…………………………………………………..
6. Эскиз формы ввода, редактирования данных, вывода результатов моделирования в табличном, графическом виде и запись их в текстовый файл в программной среде Delphi………………………………………………
7. Распечатка текста основного программного модуля …….…………………...
8. Распечатка текстового файла результатов моделирования…………………...
1.Структурная схема моделируемой системы.
Рис.1 Структурная схема системы.
W1 – передаточная функция по каналу возмущения
Wo - передаточная функция объекта
f1(t) – возмущающее воздействие
G(t) - задающее воздействие
Х(t) – входной параметр
Y(t) - выходной параметр (выход системы)
R – сигнал с выхода дискретного регулятора
U – управляющее воздействие.
Таблица переменных системы
G(t) |
Сигнал задания |
X(t) |
Ошибка управления |
R |
Сигнал с выхода дискретного регулятора |
U |
Управляющее воздействие |
Y(t) |
Выходной сигнал |
f1(t) |
Входной сигнал возмущение |
Yf |
Выходной сигнал возмущения |
Y1(t) |
Сигнал с датчика |
2. Математическое описание исходных данных
1.Элементы моделируемой системы
2 Описание нелинейного элемента.
В моделируемой системе нелинейная характеристика присутствует в датчике. Вид нелинейности – «зона нечувствительности».
Рис.2. Вид нелинейности - «зона нечувствительности»
3. Описание входных сигналов
По каналу передачи управляющего воздействия:
По каналу передачи возмущающего воздействия:
4. Определение непрерывной и дискретной модели нелинейной характеристики
Входом нелинейного элемента является выход системы - Y.
Выходом – переменная нелинейного элемента - y1(t).
Для программирования данной системы необходимо перейти от дискретных функций элементов системы к разностным уравнениям.
Получим разностное уравнение для ПИ – регулятора:
Делим на высшую степень z
Объединив выведенные ранее разностные уравнения, можно получить систему разностных уравнений для описания работы одного такта расчета:
6.Эскиз формы ввода, редактирования данных, вывода результатов моделирования в табличном, графическом виде и запись их в текстовый файл в программной среде Delphi
Рис. 3. Титульный лист программы
Рис.4. Схема системы
Рис.5. Ввод исходных данных
Рис.6. «Нелинейность»
Рис.7. Выход линейной системы при задающем воздействии
Рис.8. Выход линейной системы при возмущающем воздействии
Рис.9. Выход нелинейной системы при задающем воздействии
Рис.10. Выход нелинейной системы при возмущающем воздействии
Рис.11. Сохранение результатов
7. Распечатка текста основного программного модуля
Простые переменные (real): y – выход системы,
y1 - выход датчика,
yf1 – выход объекта по каналу возмущения,
Со – задающее воздействие,
Сf1 – возмущающее воздействие
Массив (array of real – динамический массив реальной переменной):
R – выход регулятора,
U – управляющее воздействие,
Y0 – выход объекта по каналу управления,
X – сигнал ошибки
Целочисленные (integer): N1 – число точек расчета
m – целочисленная переменная, применяемая в расчетах.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, QuickRpt, QRCtrls, ComCtrls, StdCtrls, ExtCtrls, Grids,
TeEngine, Series, TeeProcs, Chart, Psock, NMDayTim;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Button1: TButton;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
TabSheet3: TTabSheet;
GroupBox1: TGroupBox;
Image2: TImage;
Label6: TLabel;
Edit1: TEdit;
Label7: TLabel;
Edit2: TEdit;
Label8: TLabel;
Edit3: TEdit;
GroupBox2: TGroupBox;
Label9: TLabel;
Edit4: TEdit;
Edit5: TEdit;
Label10: TLabel;
Image3: TImage;
Image4: TImage;
GroupBox3: TGroupBox;
Label11: TLabel;
Edit6: TEdit;
GroupBox4: TGroupBox;
Label12: TLabel;
Edit7: TEdit;
GroupBox5: TGroupBox;
Label13: TLabel;
Edit8: TEdit;
GroupBox6: TGroupBox;
Label14: TLabel;
Edit9: TEdit;
Image5: TImage;
Label15: TLabel;
GroupBox7: TGroupBox;
Label16: TLabel;
Edit10: TEdit;
Image6: TImage;
Label17: TLabel;
Label18: TLabel;
Edit11: TEdit;
Image7: TImage;
Edit12: TEdit;
Label19: TLabel;
Label20: TLabel;
Edit13: TEdit;
TabSheet4: TTabSheet;
Panel1: TPanel;
Label21: TLabel;
Image9: TImage;
Label23: TLabel;
Edit14: TEdit;
Label24: TLabel;
Edit15: TEdit;
TabSheet6: TTabSheet;
Chart2: TChart;
StringGrid1: TStringGrid;
Button3: TButton;
TabSheet7: TTabSheet;
Panel3: TPanel;
Series3: TLineSeries;
Series4: TLineSeries;
Series5: TLineSeries;
Label29: TLabel;
ComboBox2: TComboBox;
Series7: TLineSeries;
GroupBox10: TGroupBox;
Label30: TLabel;
Label31: TLabel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
Series8: TLineSeries;
OpenDialog1: TOpenDialog;
Button4: TButton;
Button5: TButton;
Label32: TLabel;
Label33: TLabel;
Label34: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//выход из программы
procedure TForm1.Button1Click(Sender: TObject);
begin
//messagedlg(' Вы хотите '#13+' '#13+' В Ы Й Т И?',mtConfirmation, mbOKCancel, 3);
//if mrcancel =2 then exit;
//if mrok =1 then close;
close;
end;
//Загрузка формы
procedure TForm1.FormCreate(Sender: TObject);
begin
With StringGrid1 Do
begin
Cells[0,0]:='Такт N';
Cells[1,0]:=' Задание'; //Co
Cells[2,0]:=' Регулятор'; //R[i]
Cells[3,0]:=' Упр.возд'; //U[i]
Cells[4,0]:=' Система'; //y
Cells[5,0]:='Выход датч'; //y1
rowcount:=2;
end;
end;
//Очистка графиков и таблицы расчета при вводе данных
procedure TForm1.ComboBox2Change(Sender: TObject);
var
i,N1:integer;
begin //очистка
N1:=strtoint(combobox2.Text);
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]:='';
cells[5,i]:='';
rowcount:=2;
end;//1
series3.Clear;
series4.Clear;
series5.Clear;
series7.Clear;
series8.Clear;
end; // очистки
//***************Расчет системы****************
procedure TForm1.Button3Click(Sender: TObject);
Label L1;//описание меток
Label L2;
var
//описание параметров системы
tau,K1,K2,Kim,Kro,Kdat,Kob,Tob,Co,Kf1,Tf1,Cf1,b1,b2,diskr,d: real;
//описание сигналов
y,yf1,y1:real;
U:array of real;
R:array of real;
y0:array of real;
x:array of real;
//описание целочисл. переменых
m,i,N1:integer;
begin//расчёт переходного процессов
//считывание данных с визуальных элементов
N1:=strtoint(combobox2.Text);
K1:=strtofloat(edit4.text);
K2:=strtofloat(edit5.text);
Kim:=strtofloat(edit7.text);
Kro:=strtofloat(edit6.text);
Tob:=strtofloat(edit2.text);
Kob:=strtofloat(edit1.text);
Kdat:=strtofloat(edit8.text);
Co:=strtofloat(edit9.text);
Cf1:=strtofloat(edit10.text);
Kf1:=strtofloat(edit12.text);
Tf1:=strtofloat(edit13.text);
diskr:=strtofloat(edit1.text);
b1:=strtofloat(edit14.text);
b2:=strtofloat(edit15.text);
tau:=strtofloat(edit3.text);
//обнуление при нажатии кнопки расчет
for i:=1 to N1 do
with stringgrid1 do
begin//обнул
cells[0,i]:='';
cells[1,i]:='';
cells[2,i]:='';
cells[3,i]:='';
cells[4,i]:='';
cells[5,i]:='';
end;//обнул
series3.Clear;
series4.Clear;
series5.Clear;
series7.Clear;
series8.Clear;
//задание размерности массива
For i:=1 To n1 do
begin//мас
setlength(U,n1+1);
setlength(R,n1+1);
setlength(y0,n1+1);
setlength(x,n1+1);
end;//мас
//Рассчет линейной системы
begin
if RadioButton1.Checked=true then
begin//линейная по заданию
b1:=0;
b2:=0;
Cf1:=0;
With StringGrid1 Do
begin //1
Cells[1,0]:='Задание';
end; //1
goto L1; //переход к метке
end//линейная по заданию
else
if RadioButton2.Checked=true then
begin//линейная по возм
b1:=0;
b2:=0;
Co:=0;
With StringGrid1 Do
begin //1
Cells[1,0]:='Возмущ.';
end; //1
end;//линейная по возм
L1:
//расчет постоянных переменных
m:=trunc(Tau/diskr);
d:=exp(-diskr/Tob);
//обнуление массивов
For i:=1 To n1 do
begin//обнуление
R[i]:=0;
X[i]:=0;
U[i]:=0;
Y0[i]:=0;
end;//обнуление
//основной цикл расчета ЛИН. СИСТ
for I:=0 to N1 do
begin // цикл расчета
y0[i]:=U[i-m-1]*Tob*kob-U[i-m-2]*diskr*kob*d-U[i-m-1]*Tob*kob+U[i-m-1]*d*kob*Tob+U[i-m-2]*Tob*kob-U[i-m-2]*d*kob*Tob+y0[i-1]*d+y0[i-1]-y0[i-2]*d;
Yf1:=Cf1*Kf1*(1-exp(-I*diskr/Tf1));
Y:=Y0[i]+Yf1;
if (y>b2) and (y<b1) then
begin //1
y1:=0;
end; //1
if y>b1 then y1:=Kdat*(y-b1);
if y<b2 then y1:=Kdat*(y-b2);
x[i]:=Co*kdat-y1;
R[i]:=k1*x[i]-k2*x[i-1]+R[i-1];
U[i]:=Kim*Kro*R[i];
//отражение расчета в таблице
With StringGrid1 do
begin//запись в табл
cells[0,i+1]:=FloatToStrF(i,ffFixed,3,0);
if RadioButton1.Checked=true then
begin//1
With StringGrid1 Do
begin //2
cells[1,i+1]:=FloatToStrF(Co,ffFixed,8,4);
end; //2
end //1
else
if RadioButton2.Checked=true then
begin //3
With StringGrid1 Do
begin //4
cells[1,i+1]:=FloatToStrF(Cf1,ffFixed,8,4);
end; //4
end; //3
cells[2,i+1]:=FloatToStrF(R[i],ffFixed,8,4);
cells[3,i+1]:=FloatToStrF(U[i],ffFixed,8,4);
cells[4,i+1]:=FloatToStrF(Y,ffFixed,8,4);
cells[5,i+1]:=FloatToStrF(Y1,ffFixed,8,4);
end;//запись в табл
//построение графиков
if RadioButton1.Checked=true then
Begin //1
Series3.AddXY(i,Y); //вых.сист - лин
Series4.AddXY(i,Co); //задание
End; //1
if RadioButton2.Checked=true then
begin//2
Series5.AddXY(i,Cf1); //возмущение
Series3.AddXY(i,Y); //вых.сист - лин
end;//2
end;//перех.пр.по заданию
end; // цикл расчета
//основной цикл расчета НЕЛИН. СИСТЕМЫ
begin
if RadioButton3.Checked=true then
begin//2
Cf1:=0;
With StringGrid1 Do
begin //1
Cells[1,0]:='Задание';
end;//1
goto L2;
end//2
else
if RadioButton4.Checked=true then
begin //3
Co:=0;
With StringGrid1 Do
begin //4
Cells[1,0]:='Возмущ.';
end; //4
end; //3
L2:
//расчет постоянных вспомогателных переменных
m:=trunc(Tau/diskr);
d:=exp(-diskr/Tob);
//обнуление массивов
For i:=1 To n1 do
begin//обнуление
R[i]:=0;
X[i]:=0;
U[i]:=0;
Y0[i]:=0;
end;//обнуление
for I:=0 to N1 do
begin//цикл расчета
y0[i]:=U[i-m-1]*Tob*kob-U[i-m-2]*diskr*kob*d-U[i-m-1]*Tob*kob+U[i-m-1]*d*kob*Tob+U[i-m-2]*Tob*kob-U[i-m-2]*d*kob*Tob+y0[i-1]*d+y0[i-1]-y0[i-2]*d;
Yf1:=Cf1*Kf1*(1-exp(-I*diskr/Tf1));
Y:=Y0[i]+Yf1;
if (y<b1) and (y>b2) then
begin//1
y1:=0;
end; //1
if y>b1 then y1:=Kdat*(y-b1);
if y<b2 then y1:=Kdat*(y-b2);
x[i]:=Co*kdat-y1;
R[i]:=k1*x[i]-k2*x[i-1]+R[i-1];
U[i]:=Kim*Kro*R[i];
//отражение расчета в таблице
With StringGrid1 do
begin //табл
cells[0,i+1]:=FloatToStrF(i,ffFixed,3,0);
if RadioButton3.Checked=true then
begin //1
With StringGrid1 Do
begin //2
cells[1,i+1]:=FloatToStrF(Co,ffFixed,8,4);
end; //2
end //1
else
if RadioButton4.Checked=true then
begin //4
With StringGrid1 Do
begin //3
cells[1,i+1]:=FloatToStrF(Cf1,ffFixed,8,4);
end; //3
end; //4
cells[2,i+1]:=FloatToStrF(R[i],ffFixed,8,4);
cells[3,i+1]:=FloatToStrF(U[i],ffFixed,8,4);
cells[4,i+1]:=FloatToStrF(Y,ffFixed,8,4);
cells[5,i+1]:=FloatToStrF(Y1,ffFixed,8,4);
RowCount:=RowCount+1;
end;//табл
//построение графиков
if RadioButton3.Checked=true then
Begin // 1
Series7.AddXY(i,Y); //вых. нелин.сист
Series4.AddXY(i,Co); //задание
Series8.AddXY(i,Y1); //выход датч
End; // 1
if RadioButton4.Checked=true then
begin//2
Series5.AddXY(i,Cf1); //возмущение
Series7.AddXY(i,Y); //вых. нелин.сист
Series8.AddXY(i,Y1); //выход датч
end;//2
end;//цикл расчета
end;//перех.пр.по возмущению
end;//расчёт переходного процессов
//***********************************************************
//запись в файл переходных процессов по заданию
procedure TForm1.Button4Click(Sender: TObject);
label LinSyst,NelinSyst;//описание меток
Var
f:TextFile;
NameFile:string;
I,N1:Integer;
begin//1
//проверка существования расчета
if stringgrid1.Cells[0,1]='' then
begin//2
messagedlg('Нет расчета переходного процесса по заданию!',mtError,[mbOK],0);
exit;
end;//2
if (RadioButton1.Checked=false) and (RadioButton3.Checked=false) then
begin//3
messagedlg('Нет расчета переходного процесса по заданию!',mtError,[mbOK],0);
exit;
end;//3
N1:=StrToInt(ComboBox2.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 RadioButton3.Checked=true then//нелинейная система
begin//nelin
writeln(f,' ПО ЗАДАЮЩЕМУ ВОЗДЕЙСТВИЮ');
writeln(f,' *НЕЛИНЕЙНАЯ СИСТЕМА*');
end;//nelin
Writeln(f);
Writeln(f,' Передаточная функция объекта:');
Writeln(f);
Writeln(f,' K*exp(-pTau) ');
Writeln(f,' Wo(p)=------------------------');
Writeln(f,' p(1+Tp)');
Writeln(f);
Writeln(f,' где:');
Writeln(f,' коэффициент передачи К=',Edit1.text);
Writeln(f,' постоянная времени Т=',Edit2.text);
Writeln(f,' запаздывание Тau=',Edit3.text);
Writeln(f);
Writeln(f,'*********************************************************');
Writeln(f);
Writeln(f,' Передаточная функция звена по каналу возмущения:' );
Writeln(f);
Writeln(f,' Kf ');
Writeln(f,' Wf1(p)=------');
Writeln(f,' (1+Tfp)');
Writeln(f);
Writeln(f,' где:');
Writeln(f,' коэффициент передачи Кf=',Edit12.text);
Writeln(f,' постоянная времени Тf=',Edit13.text);
Writeln(f);
Writeln(f,'*********************************************************');
Writeln(f);
Writeln(f,' Настройки ПИ-регулятора:');
Writeln(f,' К1=',Edit4.text);
Writeln(f,' К2=',Edit5.text);
Writeln(f);
Writeln(f,'*********************************************************');
Writeln(f);
Writeln(f,' Задающее воздействие - ступенчатеое = ',edit9.text);
Writeln(f);
Writeln(f,'*********************************************************');
Writeln(f);
Writeln(f,' Коэффициенты передачи элементов системы:');
Writeln(f,' регулирующий орган Кро=',Edit6.text);
Writeln(f,' исполнительный механизм Ким=',Edit7.text);
Writeln(f,' датчик Кдат=',Edit8.text);
Writeln(f);
Writeln(f,'*********************************************************');
Writeln(f);
Writeln(f,' Дискретность работы системы Тo=',Edit11.text);
Writeln(f);
Writeln(f,'*********************************************************');
if RadioButton1.Checked=true then//линейная система
begin
writeln(f,' Переходный процесс по задающему воздействию (линейная система)');
goto LinSyst;
end;
if RadioButton3.Checked=true then//нелинейная система
begin
writeln(f,' Переходный процесс по задающему воздействию (нелинейная система)');
goto NelinSyst;
end;
//запись линейной системы
LinSyst:
Writeln(f);
Writeln(f,' Такт Задание Выход рег-ра Упр.возд Система Вых. датчик');
With StringGrid1 do
For I:=1 to N1 do
Writeln(f,' ',cells[0,I],' ',cells[1,I],' ',cells[2,I],' ',cells[3,I],' ',cells[4,I],' ',cells[5,I]);
CloseFile(f);
MessageDlg('Расчет переходного процесса лин. системы'#13+
' по задающему воздействию записан !',mtInformation,[mbOK],0);
exit;
//запись нелинейной системы
NelinSyst:
Writeln(f);
Writeln(f,' Такт Задание Выход рег-ра Упр.возд Система ');
With StringGrid1 do
For I:=1 to N1 do
Writeln(f,' ',cells[0,I],' ',cells[1,I],' ',cells[2,I],' ',cells[3,I],' ',cells[4,I]);
Writeln(f);
Writeln(f,' Коэффициенты нелинейности датчика:');
Writeln(f);
Writeln(f,' B1=',Edit14.text);
Writeln(f,' B2=',Edit15.text);
Writeln(f);
Writeln(f,' Такт Вх.дат(Вых.сист.) Выход датчика');
With StringGrid1 do
For I:=1 to N1 do
Writeln(f,' ',cells[0,I],' ',cells[4,I],' ',cells[5,I]);
CloseFile(f);
MessageDlg('Расчет переходного процесса нелин. системы'#13+
' по задающему воздействию записан !',mtInformation,[mbOK],0);
exit;
end;//3
end;//1
//запись в файл переходных процессов по возмущению
procedure TForm1.Button5Click(Sender: TObject);
label LinSyst,NelinSyst;//описание меток
Var
f:TextFile;
NameFile:string;
I,N1:Integer;
begin//1
//проверка существования расчета
if (stringgrid1.Cells[0,1]='') then
begin//2
messagedlg('Нет расчета переходного процесса по возмущению !',mtError,[mbOK],0);
exit;
end;//2
if (RadioButton2.Checked=false) and (RadioButton4.Checked=false) then
begin//3
messagedlg('Нет расчета переходного процесса по возмущению!',mtError,[mbOK],0);
exit;
end;//3
N1:=StrToInt(ComboBox2.text);
if OpenDialog1.execute then
begin//3
NameFile:=OpenDialog1.FileName;
AssignFile(f,NameFile);
Rewrite(f);
Writeln(f,' РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ ПЕРЕХОДНОГО
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.