Скачиваний:
63
Добавлен:
10.02.2022
Размер:
801.79 Кб
Скачать

Заключение

В ходе данной работы были освоены базовые умение и практические навыки составления и написания программных моделей для исследования в среде MATLAB, создания интерфейсов для вывода результатов моделирования с использованием элементов MATLAB GUI.

В результате было разработано приложение с графическим интерфейсом, позволяющее моделировать движение корабля в соответствии с заданными параметрами и строить графики динамических процессов.

.

Список использованных источников

Математическое моделирование системы управления: методич. указания к курсовому проектированию / сост.: О. Ю. Лукомская, А. Г. Шпекторов. СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2014. 40 с.

Приложение а Программная реализация приложения

Файл MMOSU_KR_GUI.m

function varargout = MMOSU_KR_GUI(varargin)

gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @MMOSU_KR_GUI_OpeningFcn, ...

'gui_OutputFcn', @MMOSU_KR_GUI_OutputFcn, ...

'gui_LayoutFcn', [], ...

'gui_Callback', []);

if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

% --- Executes just before MMOSU_KR_GUI is made visible.

function MMOSU_KR_GUI_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);

set(handles.radiobuttonNVK,'Value', 1);

set(handles.sliderP,'Value', 0);

set(handles.textW, 'String', 253);

set(handles.textN, 'String', 400);

set(handles.textv, 'String', 9);

set(handles.textv1max, 'String', '-');

set(handles.textv2max, 'String', '-');

set(handles.editP,'String', 0);

set(handles.editx0,'String', 0);

set(handles.editv0,'String', 0);

set(handles.editdt,'String', 1);

set(handles.editTav,'String', 0);

set(handles.editTrev,'String', 0);

set(handles.editvn,'String', 0);

% радиокнопка выбора НВК

function radiobuttonNVK_Callback(hObject, eventdata, handles)

if get(hObject, 'Value') == 1

set(handles.textW, 'String', 253);

set(handles.textN, 'String', 400);

set(handles.textv, 'String', 9);

set(handles.textv1max, 'String', '-');

set(handles.textv2max, 'String', '-');

set(handles.radiobuttonKat, 'Value', 0);

set(handles.radiobuttonKPK, 'Value', 0);

elseif get(hObject, 'Value') == 0

set(hObject, 'Value', 1);

end

% радиокнопка выбора катера

function radiobuttonKat_Callback(hObject, eventdata, handles)

if get(hObject, 'Value') == 1

set(handles.textW, 'String', 25.5);

set(handles.textN, 'String', 1000);

set(handles.textv, 'String', 30);

set(handles.textv1max, 'String', '-');

set(handles.textv2max, 'String', '-');

set(handles.radiobuttonNVK, 'Value', 0);

set(handles.radiobuttonKPK, 'Value', 0);

elseif get(hObject, 'Value') == 0

set(hObject, 'Value', 1);

end

% радиокнопка выбора КПК

function radiobuttonKPK_Callback(hObject, eventdata, handles)

if get(hObject, 'Value') == 1

set(handles.textW, 'String', 9.4);

set(handles.textN, 'String', 400);

set(handles.textv, 'String', 11);

set(handles.textv1max, 'String', 13);

set(handles.textv2max, 'String', 32);

set(handles.radiobuttonNVK, 'Value', 0);

set(handles.radiobuttonKat, 'Value', 0);

elseif get(hObject, 'Value') == 0

set(hObject, 'Value', 1);

end

% ползунок силы тяги P

function sliderP_Callback(hObject, eventdata, handles)

set(handles.editP, 'String', get(hObject, 'Value'));

% кнопка запуска моделирования

function pushbuttonPusk_Callback(hObject, eventdata, handles)

global P v kp vn dPmax dt kd

% параметры корабля

M = str2double(get(handles.textW,'String')); % масса, т

N = str2double(get(handles.textN,'String')); % мощность ГЭУ, л.с.

vmax = str2double(get(handles.textv,'String')); % скорость, уз

v1max = str2double(get(handles.textv1max,'String')); % -//-

v2max = str2double(get(handles.textv2max,'String')); % -//-

% перевод единиц параметров в СИ

M = M*1000; % кг

N = N*735.5;% Вт

vmax = vmax*1852/3600; % м/с

v1max = v1max*1852/3600; % м/с

v2max = v2max*1852/3600; % м/с

Fmax = N/vmax; % максимальная сила тяги, Н

dFmax = 0.2*Fmax; % допустимая скорость изменения силы тяги, Н/с

dPmax = dFmax/Fmax*100;

Pn = str2double(get(handles.editP,'String')); % заданная отн. сила тяги

dt = str2double(get(handles.editdt,'String')); % шаг приращения, с

A0 = Fmax/vmax^2; % коэффициент сопротивления движению

A1 = Fmax/v1max^2; % -//-

A2 = Fmax/v2max^2; % -//-

T = []; % моменты времени

P = []; % относительная сила тяги

v = []; % скорость

x = []; % координата по x

T(1) = 0; % начальные условия

P(1) = 0; % -//-

v(1) = str2double(get(handles.editv0,'String'))*1852/3600; % -//-

x(1) = str2double(get(handles.editx0,'String'))*1852/3600; % -//-

% параметры ПД-регулятора скорости

vn = str2double(get(handles.editvn,'String')); % заданная скорость, уз

vn = vn*1852/3600; % заданная скорость в СИ, м/с

% выбор коэф. регулятора в зависимости от корабля

if get(handles.radiobuttonNVK,'Value') == 1

kp = 15;

kd = 200;

elseif get(handles.radiobuttonKat,'Value') == 1

kp = 15;

kd = 100;

elseif get(handles.radiobuttonKPK,'Value') == 1

kp = 50;

kd = 150;

end

Tav = str2double(get(handles.editTav,'String')); % время "Вперед", c

Trev = str2double(get(handles.editTrev,'String')); % время "Реверс", c

% цикл "Вперед"

for i = 1:1:ceil(Tav/dt)

if get(handles.radiobuttonNVK,'Value')==1 |...

get(handles.radiobuttonKat,'Value')==1

A = A0;

elseif get(handles.radiobuttonKPK,'Value')==1

if abs(v(i)) < vmax

A = A1;

end

if abs(v(i)) >= vmax && abs(v(i)) < v1max

A = A1 + (A2 - A1)/(v1max - vmax)*(v(i) - vmax);

end

if abs(v(i)) >= v1max

A = A2;

end

end

v(i+1) = v(i) + 1/M*(P(i)*Fmax/100 - A*v(i)*abs(v(i)))*dt;

x(i+1) = x(i) + v(i)*dt;

T(i+1) = i*dt;

if get(handles.radiobuttonReg, 'Value') == 0

P(i+1) = P(i) + dPmax*dt;

if(P(i) >= Pn)

P(i+1) = Pn;

end

else

P(i+1) = P(i) + v_regulator(i);

end

end

% цикл "Реверс"

for i = ceil(Tav/dt)+1:1:ceil((Trev+Tav)/dt)

if get(handles.radiobuttonNVK,'Value')==1 |...

get(handles.radiobuttonKat,'Value')==1

A = A0;

elseif get(handles.radiobuttonKPK,'Value')==1

if abs(v(i)) < vmax

A = A1;

end

if abs(v(i)) >= vmax

A = A2;

end

end

v(i+1) = v(i) + 1/M*(P(i)*Fmax/100 - A*v(i)*abs(v(i)))*dt;

x(i+1) = x(i) + v(i)*dt;

T(i+1) = i*dt;

P(i+1) = P(i) - dPmax*dt;

if(P(i) <= -100)

P(i+1) = -100;

end

end

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

axes(handles.axes1); cla;

plot(T, P); grid on; xlabel('t, c'); ylabel('P, %');

axes(handles.axes2); cla;

plot(T, v); grid on; xlabel('t, c'); ylabel('v, м/c');

axes(handles.axes3); cla;

plot(T, x); grid on; xlabel('t, c'); ylabel('x, м');

% радиокнопка регулятора скорости

function radiobuttonReg_Callback(hObject, eventdata, handles)

if get(hObject, 'Value') == 1

set(handles.textAv, 'Visible', 'off');

set(handles.textRev, 'Visible', 'off');

set(handles.editTrev, 'Visible', 'off');

set(handles.textTrevEdSi, 'Visible', 'off');

set(handles.editTrev, 'String', 0);

end

if get(hObject, 'Value') == 0

set(handles.textAv, 'Visible', 'on');

set(handles.textRev, 'Visible', 'on');

set(handles.editTrev, 'Visible', 'on');

set(handles.textTrevEdSi, 'Visible', 'on');

set(handles.editvn, 'String', 0);

end

function Exit_Callback(hObject, eventdata, handles)

close;

Файл v_regulator.m

function dP = v_regulator(i) % функция регулятора скорости

global P v kp vn dPmax dt kd

dP = kp*(vn - v(i)) + kd*((vn-v(i+1))-(vn-v(i)))/dt;

if dP/dt >= 20

dP = dPmax*dt; % ограничение на скорость изменения P

end

if dP/dt <= -20

dP = -dPmax*dt; % ограничение на скорость изменения P

end

if abs(P(i)) >= 100

dP = 0; % ограничение на величину P

end

end

4

Соседние файлы в предмете Математическое моделирование объектов и систем управления