
- •Аннотация
- •Содержание
- •Список обозначений
- •Введение
- •1.Формирование математической и программной моделей движения нк и кпк
- •1.1.Моделирование движения надводного корабля
- •1.2.Моделирование движения катера
- •1.3.Моделирование движения корабля на подводных крыльях
- •1.4.Режим управления скоростью хода
- •2.Разработка приложения с графическим интерфейсом
- •Заключение
- •Список использованных источников
- •Приложение а Программная реализация приложения
Заключение
В ходе данной работы были освоены базовые умение и практические навыки составления и написания программных моделей для исследования в среде 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