船舶航向实验系统及航向控制器的设计与仿真课设报告.docx
- 文档编号:11672080
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:14
- 大小:73.16KB
船舶航向实验系统及航向控制器的设计与仿真课设报告.docx
《船舶航向实验系统及航向控制器的设计与仿真课设报告.docx》由会员分享,可在线阅读,更多相关《船舶航向实验系统及航向控制器的设计与仿真课设报告.docx(14页珍藏版)》请在冰豆网上搜索。
船舶航向实验系统及航向控制器的设计与仿真课设报告
课程设计报告
船舶航向实验系统及航向控制器的设计与仿真
姓名:
XXX
专业班级:
学号:
*******
2012年12月21日
摘要
本课程设计利用Matlab环境中的Simulink仿真工具箱和友好的GUI界面,设计了船舶航向实验系统所需的航向控制器。
该航向控制器通过实物仿真,帮助学生更直观地理解航向控制的过程,增强感性认识,培养学生的研究能力、综合应用能力和创新能力;同时本课程设计所设计的船舶航向控制器是一个开放的平台,有兴趣的同学可以根据需要添加相应的程序来实现所需功能。
文中基于Matlab/GUI的串口通信功能的编程实现表明利用Matlab/GUI可以进行包含一般界面元素的界面开发,在此基础上,加入串口通信功能,实现数据的实时采集与分析处理,并进行图形化显示。
在实物仿真中通过串口将计算机与船舶模型连接构成闭环船舶航向控制系统,利用Simulink中的控制器控制船舶模型,此控制器可直接使用工具箱中的控制器和也可使用设计好的控制器,更换方便,操作简单,易于实现。
图形用户界面(GraphicalUserInterface,简称GUI)是提供人机交互的工具和方法。
Matlab用一个包含多种不同风格用户控件对象的图形窗口代表用户界面。
用户必须对每一个对象进行编程,使用户在GUI中的行为能够达到相应的目的。
Matlab/GUI是一种新型的图形用户界面开发方式,特别适合能够熟练运用Matlab语言进行仿真但是对VC界面开发了解不够深入的科技工作者。
本课程设计所设计航向控制器为PID自整定控制器,控制器部分是利用Matlab逻辑工具箱进行设计,此方法设计步骤简单,易于实现,可直接与Simulink工具箱连接进行仿真,并且以该控制器为核心的仿真图也可与仿真实验平台进行完美的连接,因此可以通过仿真实验平台验证控制器的性能。
关键词:
GUI航向控制PID实物仿真
第一章概论
1.1引言
本课程设计所设计的船舶航向控制器采用Matlab环境中的Simulink仿真工具箱和GUI界面。
Matlab是Mathworks公司推出的一款功能强大的数学软件。
它集数值分析、矩阵计算、信号处理和图形显示于一身,包含大量高度集成的函数可供调用,命令语句功能强大为科学研究,工程设计及众多学科领域提供一种简洁、高效的编程工具,并在图像处理、控制设计、信号检测、金融建模设计等领域得到广泛应用。
因此在制作各种教学软件或信号处理软件时,在Matlab提供的GUI(GraphicalUserInterface)上利用Matlab语言编写核心代码并构建框架是一种不错的选择这不但减少了代码编写的工程量而且制作出的软件同时具有界面友好和能够方便进行各种数据处理及图像分析等特点。
随着信息社会的不断推进,具有不同功能的应用软件已成为人们生活、学习及工作中不可缺少的一部分。
比如,工作中经常用到的文字处理软件、图形图像软件等,对于这些软件的设计,程序员大多习惯于选择VC、Java、VB等高级编程语言编写代码,因为这些编程语言制作出的软件界面友好,功能强大。
然而在对大量数据进行各种复杂分析和处理时,相比于Matlab编程语言而言,这些高级语言则处于明显的劣势。
Matlab不仅具有强大的科学计算功能,还具有界面设计开发功能。
Matlab图形用户界面是有别于VC界面和Java界面的是一种新型界面开发方式。
对于熟悉Matlab而不想编写大量VC代码的科研人员来说,Matlab/GUI无疑是一个最佳选择。
它既能嵌入已有的仿真程序,又能把仿真的图形化结果以人机交互的动态方式展现给操作者,给人深刻的印象,同时仿真代码的不可见性为一些不熟悉Matlab的操作者提供了操作界面的可能。
在基于Matlab/GUI制作的软件中关键需要解决三大问题:
1、界面功能;2、界面外观的优化;3、不同GUI之间的调用。
因此,本课程设计给出一个利用Matlab/GUI制作的仿真控制器的实例。
此仿真控制平台是为了满足学生船舶控制实验的需要。
本课程设计在设计仿真控制平台中涉及到航向控制器的设计,航向控制器是仿真平台的基础,在航向控制器的基础之上实现仿真平台上的相关功能。
1.2图形用户界面概述
Matlab是一套高性能的数值计算和可视化软件,它作为新兴的逻辑语言和可视化工具,有着其他编程语言所不能比拟的优势,如Fortran语言是一种专门用于科学计算的语言,但其图形界面的功能比较弱,利用其开发的程序,用户界面不友好,使用起来不方便。
而VisualBasic,VisualC等可视化编辑语言开发出来的程序界面友好,但由于其不是专门用于科学计算的语言,因此其科学计算功能较弱。
由于Matlab强大的应用功能,用户越来越多。
Matlab的应用可让用户不再需要了解大量底层与开发无关的工作,极大地提高了开发效率。
Matlab为解决用户开发和客户交互的局限,提供了一个全新的GUI设计方案。
图形用户界面(GUI,GraphicalUserInterface)是提供人机交互的工具和方法。
GUI是使用图形对象(例如按钮、文本框、滚动条和菜单等)创建的用户界面,这些对象对计算机用户而言都有明确的含义,例如移动滚动条将会改变数值,按下OK按钮将完成并应用用户的设置,同时设置对话框消失。
当然用户必须保证这些不同对象间能够协调地工作。
Matlab用一个包含多种不同风格的图形窗口代表用户界面。
用户必须对每一个对象进行编程,使用户在GUI中的行为能够达到相应的目的。
Matlab的GUI为开发者提供了一个不脱离Matlab的开发环境,更有益与Matlab程序的GUI集成。
在Matlab6.5中,图形用户界面是一种包含多种图形对象的界面,典型的图形界面包括图形显示区域、功能按钮空间以及用户自定义的功能菜单等。
为了让界面实现各种功能,需要对各个图形对象进行布局和编程。
这样,当用户激活对应的GUI对象时,就能执行相应的行为。
最后,必须保存自己创建的GUI,使得用户可以应用GUI对象。
在Matlab中,所有对象都可以使用M文件进行编写。
GUI也是一种Matlab对象,因此,可以使用M文件来创建GUI。
使用M文件创建GUI的方法也是最基础的,使用其他方法创建GUI图形界面时,实现图形控件的各种功能时,也需要编写相应的程序代码。
除了使用M文件来创建GUI对象之外,Matlab还为用户开发图形界面提供了一个方便高效的集成开发环境:
Matlab图形用户界面开发环境(Matlabgraphicaluserinterfacedevelopmentenvironment)简称GUIDE,其主要是一个界面设计工具集。
Matlab6.5将所有GUI所支持的用户控件都集成起来,同时提供界面外观、属性和行为响应方法的设置方法。
除了可以使用GUIDE创建GUI之外,还可以将设计好的GUI界面保存为一个FIG资源文件,自动生成对应的M文件。
该M文件包含了GUI初始化代码和组建界面布局的控制代码。
使用GUIDE创建GUI对象执行效率高,可以交互式地进行组件布局,还能生成保存和发布GUI的对应文件。
本课程设计选择用Matlab的图形用户界面设计是因为不需要编写大量的代码,它既能嵌入已有的仿真程序,又能与仿真环境相结合。
第二章GUI的创建
从MatlabS.X版本开始,为了方便用户制作图形界面Matlab提供了一个交互式的设计工具GUIDE。
但是从Matlab6.X以来,GUIDE的设计界面己经发生变化,本论文采用的是Matlab6.5的GUIDE。
GUIDE实际上是一套Matlab的工具集,它由版面设计工具、属性编辑器、菜单编辑器、调整工具、对象浏览器、TAB次序编辑器六部分组成。
2.1GUI设计概述
在GUI设计程序前,首先考虑设计对象的结构和开发流程。
不同的要求设计出来的GUI也不同。
一个优秀的界面基本符合易用性、统一性、规范性和合理性的标准。
为了高效率的开发一个GUI,必须按照一定的开发步骤,下面给出一般步骤图(如图2.1):
图2.1GUI设计步骤图
2.2GUI实现
GUI编程实现主要分为三大块:
组件的布局、属性的编辑和回调函数的编辑。
1、组件的布局
在GUIDE的界面设计区添加组件的方法很简单,只要用鼠标从组件面板里点击并拖拉组件即可实现。
添加菜单有专门的菜单编辑器来完成。
完成添加后可使用GUIDE的特征工具调整组件的位置和使用TAB次序编辑器调整TAB次序达到最优化配置,来完成布局。
2、属性编辑
通过属性编辑可以改变当前组件的属性值,在菜单编辑里可改变菜单的属性值。
当改变组件属性值时,可能会影响到界面的整体效果,因此在改完属性值滞后还要对组件的布局进行优化。
GUI实现的关键还在于回调函数的处理。
3、回调函数
在Matlab6.5里回调函数直接在M文件中编辑,这样的事件管理模式,便于用户的理解和编辑。
当一个图形对象发生特殊事件时,GUI传递要执行的子函数名到M文件中,该子函数称为回调函数(也称callback函数)。
用户对控件操作(如鼠标单击、双击或移动、键盘输入等)的时候,控件对该操作进行响应,指定执行的函数,就是该控件的回调函数。
该函数不会主动运行,只在用户对控件执行特定操作时执行。
2.3采用GUIDE创建GUI
采用GUIDE创建一个完整的GUI图形界面,步骤如下:
1,GUI对象布局
2、设置对象的相应属性
3、编写回调函数
2.3.1GUI组件介绍
1、触控按钮(PushButton)
在PushButton双击,调用属性查看器,可以设置PushButton的属性。
2、静态文本(StaticText)
StaticText通常用于显示其他对象的数值、状态等。
3、可编辑文本框(EditText)
EditText允许用户修改文本内容,用于数据的输入显示。
4、单选按钮(RadioButton)
RadioButton用于显示一组互斥的状态。
其对象之多只有一个的value值为l。
5、坐标轴(Axes)
Axes用于数据的可视化,即显示图形或者图像。
Axes是核心图形对象的容器,它包含下列GUI核心图形对象:
image,light,lint,patche,rectangle,surface和text对象。
2.3.2菜单编辑器
菜单编辑器生成可以为每个菜单选项生成空回调函数的子函数,包括菜单名,其主要用于建立菜单栏(MenuBar)和右键菜单(ContextMenus。
若窗口的MenuBar属性值为none,则只显示用户设计的菜单;若MenuBar属性值为Figure则用户设计的菜单出现在标准菜单之后。
2.3.3创建GUI模型
图2.3为GUI模型图。
图2.3GUI模型图
界面有两个发送单元,分别为航令和航向发送,航令为控制船舶转速的大小,航向为设定的角度,输入相应的数值,点击发送,则船舶模型会相应的转动。
建立一个GUI模型之后,相应的会出现源程序代码,以下为其中的发送接收程序:
functionpushbutton1_Callback(hObject,eventdata,handles)
globalcount;
count=0;
s=serial('COM1')%建立串口
s.BytesAvailableFcnMode='terminator';%'byte'
s.BytesAvailableFcnCount=22
s.BytesAvailableFcn=@rxd_mycallback;%{'mycallback'};
fopen(s);%打开串口
a=get(handles.edit1,'String');
b=strcat('$AGHSC,01,',a);
AGHSC=strcat(b,',S*HH');
AGHSC(20)=13;AGHSC(21)=0;
fprintf(s,AGHSC,'async');
state=s.TransferStatu
while(state
(1)~='i')
state=s.TransferStatus
end
while(count<10)
pause(0.25);
end
stopasync(s);
fclose('all');
delete(s);
clearall;
functionrxd_mycallback(hObject,event)%接收中断程序
globalcount;
count=count+1;
在实现控制的过程中,串口时常会堵塞,所以需要不时的清零一下串口,需要用到一下程序:
functionscom_cls
s=serial('COM1')
%s.BaudRate=9600
fopen(s);
fprintf(s,'test','async');
state=s.TransferStatus
while(state
(1)~='i')
state=s.TransferStatus
end
stopasync(s);
fclose('all');
delete(s);
clearall;
第三章控制器的设计
3.1串口的基本操作
实物仿真需要将计算机与船舶模型连接,它们之间的连接是通过串口通信完成的。
因此需要在Matlab下进行串口编程。
用户要与连接到串口上的设备通信时,基本步骤:
(1)创建串口并设置串口属性
一般情况下创建串口对象时应配置以下属性:
通信参数配置:
BaudRate,DataBits,Parity,StopBits和Terminator。
回调参数配置:
TimerFcn和TimerPeriod。
(2)连接串口对象与外围设备
用fopen函数打开串口,命令:
fopen(scom);
(3)串口读写数据
用印rintf或fwrite函数写数据到设备中,用fgets,fread或readasync函数读
取数据到串口。
(4)断开串口连接和清除串口对象
当不再使用串口时要使用fclose函数断开串口与设备的连接,命令:
fclose(scorn);检查串口对象是否连接可查看其status属性。
将串口对象从内存中清除用delete函数。
最后可使用clear函数从Matlab工作空间将其清除。
3.2实物仿真
图4.19中所示为仿真框图。
在闭环实物仿真时,船舶模型是包含在下载到单片机的程序中的,通过串口与上微机的控制器连接,构成闭环的航向控制系统。
图4.19实物仿真框图
图4.19中Step为设定航向,其与实际航向的差值作为PID控制器的输入,通过控制器后得到输出,即舵令,将设定航向和舵令通过串口发送给船舶模型,船舶模型接收到便进行相应的运动,在运动时模型有实际的航向,通过串口不断的将实际航向发送到上微机,与设定航向运算,将运算结果作为PID控制器的输入。
3.3S-FUNCTION函数
s-function也就是system-function的缩写。
说得简单,s-function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口,建立自己的simulink仿真模块。
simulink的仿真有两个阶段:
第一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。
在matlab的workspace里打editsfuntmpl,就会出现matlab自己提供的s函数模板了。
本课程设计所封装的实验程序(S-Function)如下:
function[sys,x0,str,ts]=scom_1(t,x,u,flag)
switchflag,
case0,
[sys,x0,str,ts]=mdlInitializeSizes;
case1,
sys=mdlDerivatives(t,x,u);
case2,
sys=mdlUpdate(t,x,u);
case3,
sys=mdlOutputs(t,x,u);
case4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case9,
sys=mdlTerminate(t,x,u);
otherwise
error(['Unhandledflag=',num2str(flag)]);
end
function[sys,x0,str,ts]=mdlInitializeSizes
globalst;
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=2;
sizes.NumInputs=2;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;%atleastonesampletimeisneeded
sys=simsizes(sizes);
x0=[];
str=[];
ts=[00];
st=serial('COM1');
st.BaudRate=9600;
st.DataBits=8;
st.Stopbits=1;
st.Parity='none';
st.Terminator='LF';%'CR''LF';
st.InputBufferSize=1024;
st.OutputBufferSize=2048;
s.Timeout=1;
s.ReadAsyncMode='continuous';%'manual';
functionsys=mdlDerivatives(t,x,u)
sys=[];
functionsys=mdlUpdate(t,x,u)
sys=[];
functionsys=mdlOutputs(t,x,u)
globalst;
fopen(st);
if(u
(2)>32)u
(2)=32;
end
if(u
(2)<-32)u
(2)=-32;
end
u
(1)=u
(1)+0.001;
u
(2)=u
(2)+0.001;
if(u
(1)<=-10)a='$AGHSC,04,';b=num2str(u
(1));b=b(1:
5);
elseif(u
(1)<0)a='$AGHSC,04,-0';u
(1)=-u
(1);b=num2str(u
(1));b=b(1:
3);
elseif(u
(1)==0)a='$AGHSC,04,';b='00.0';
elseif(u
(1)<=10)a='$AGHSC,04,+0';b=num2str(u
(1));b=b(1:
3);
elsea='$AGHSC,04,+';b=num2str(u
(1));b=b(1:
4);
end
if(u
(2)<=-10)e=',S,';d=num2str(u
(2));d=d(1:
5);
elseif(u
(2)<0)e=',S,-0';u
(2)=-u
(2);d=num2str(u
(2));d=d(1:
3);
elseif(u
(2)==0)e=',S,';d='00.0';
elseif(u
(2)<=10)e=',S,+0';d=num2str(u
(2));d=d(1:
3);
elsee=',S,+';d=num2str(u
(2));d=d(1:
4);
end
c='*HH';
AGHSC=strcat(e,strcat(d,c));
AGHSC=strcat(a,strcat(b,AGHSC));
AGHSC(27)=13;
AGHSC(28)=0;
AGHSC
fprintf(st,AGHSC,'async');
state=st.TransferStatus;
while(state
(1)~='i')
state=st.TransferStatus;
end
[out,ak]=fscanf(st,'uint8');
[out,ak]=fscanf(st,'uint8')
if(ak==36)
sys
(1)=str2double(out(11:
15));
sys
(2)=str2double(out(27:
31));
else
[out,ak]=fscanf(st,'uint8');
[out,ak]=fscanf(st,'uint8');
sys
(1)=str2double(out(11:
15));
sys
(2)=str2double(out(27:
31));
end
stopasync(st);
fclose(st);
functionsys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime=1;%Example,setthenexthittobeonesecondlater.
sys=t+sampleTime;
functionsys=mdlTerminate(t,x,u)
globalst;
sys=[];
delete(st);
clearst;
结果
本课程设计所设计的船舶航行控制器填补了学生缺少船舶控制实验课所需要的具有针对性的教学工具的空缺,此船舶航向控制器操作方便、可开发性强、满足船舶控制课时的需要。
船舶航向控制器能满足以下功能:
1、基于Matlab-Simulink环境的船舶航向保持控制仿真;在Matlab-Simulink环境下建立仿真图,分析仿真结果。
改变船舶参数进行相同的仿真实验,观察不同船舶间的仿真结果有何不同,并分析原因。
2、基于Matlab-Simulink环境的实物船舶的航向保持控制。
通过实验验证,以上功能均已实现。
本文中基于Matlab/GUI的串口通信功能的编程实现表明利用MatlabGUI可以进行包含一般界面元素的界面开发,在此基础上,加入串口通信功能,实现数据的实时采集与分析处理,并进行图形化显示。
文中设计基于PID自整定的船舶航向控制器,为船舶航向控制提供了一种有效方法。
仿真研究的结果表明,自整定PID控制可以有效的调整PID参数,且控制系统的响应速度快,具有良好的稳定性。
参考文献
[1]MATLAB接口技术程序设计实例教程.赵书兰主编.化学工业出版社.2009
[2]MATLAB仿真技术与实例应用教程.张淼张正亮编著.机械工业出版社.2004
[3]基于Matlab/GUI的新型界面开发方式.邱金蕙主编.河北工业科技.2008
[4]MATLABN个实用技巧.刘焕进王辉李鹏编著.北京航空航天大学出版社.2011
致谢
在这次课程设计过程中,我及小组同学得到了许多人的帮助。
首先,我要感谢我的老师颜德文老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。
在此期间,我不仅学到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 船舶 航向 实验 系统 控制器 设计 仿真 报告