您的当前位置:首页船舶航向实验系统及航向控制器的设计及仿真课设报告

船舶航向实验系统及航向控制器的设计及仿真课设报告

2023-01-12 来源:小侦探旅游网


课 程 设 计 报 告

船舶航向实验系统及航向控制器的设计与仿真

姓 名: XXX 专业班级: 学 号: 指导老师: ***

2012年12月21日

摘 要

本课程设计利用Matlab环境中的Simulink仿真工具箱和友好的GUI界面,设计了船舶航向实验系统所需的航向控制器。该航向控制器通过实物仿真,帮助学生更直观地理解航向控制的过程,增强感性认识,培养学生的研究能力、综合应用能力和创新能力;同时本课程设计所设计的船舶航向控制器是一个开放的平台,有兴趣的同学可以根据需要添加相应的程序来实现所需功能。

文中基于Matlab /GUI的串口通信功能的编程实现表明利用Matlab/ GUI可以进行包含一般界面元素的界面开发,在此基础上,加入串口通信功能,实现数据的实时采集与分析处理,并进行图形化显示。在实物仿真中通过串口将计算机与船舶模型连接构成闭环船舶航向控制系统,利用Simulink中的控制器控制船舶模型,此控制器可直接使用工具箱中的控制器和也可使用设计好的控制器,更换方便,操作简单,易于实现。

图形用户界面(Graphical User Interface,简称GUI )是提供人机交互的工具和方法。Matlab用一个包含多种不同风格用户控件对象的图形窗口代表用户界面。用户必须对每一个对象进行编程,使用户在GUI中的行为能够达到相应的目的。Matlab/GUI是一种新型的图形用户界面开发方式,特别适合能够熟练运用Matlab语言进行仿真但是对VC界面开发了解不够深入的科技工作者。

本课程设计所设计航向控制器为PID自整定控制器,控制器部分是利用Matlab逻辑工具箱进行设计,此方法设计步骤简单,易于实现,可直接与Simulink工具箱连接进行仿真,并且以该控制器为核心的仿真图也可与仿真实验平台进行完美的连接,因此可以通过仿真实验平台验证控制器的性能。

关键词:GUI 航向控制 PID 实物仿真

目 录

第一章 概论 .......................................................... 1

1.1引言 .......................................................... 1 1.2图形用户界面概述 .............................................. 1 第二章 GUI的创建 ..................................................... 3

2.1 GUI设计概述 .................................................. 3 2.2 GUI实现 ...................................................... 3 2.3采用GUIDE创建GUI ............................................ 4

2.3.1 GUI组件介绍 ............................................ 4 2.3.2菜单编辑器 .............................................. 4 2.3.3创建GUI模型 ............................................ 4

第三章 控制器的设计 .................................................. 7

3.1串口的基本操作 ................................................ 7 3.2实物仿真 ...................................................... 7 3.3 S-FUNCTION函数 ............................................... 8 结 果 .............................................................. 11 参考文献 ............................................................ 12 致 谢 .............................................................. 13

第一章 概论

1.1引言

本课程设计所设计的船舶航向控制器采用Matl ab环境中的Simulink仿真工具箱和GUI界面。

Matlab是Mathworks公司推出的一款功能强大的数学软件。它集数值分析、矩阵计算、信号处理和图形显示于一身,包含大量高度集成的函数可供调用,命令语句功能强大为科学研究,工程设计及众多学科领域提供一种简洁、高效的编程工具,并在图像处理、控制设计、信号检测、金融建模设计等领域得到广泛应用。因此在制作各种教学软件或信号处理软件时,在Matlab提供的GUI( GraphicalUser Interface)上利用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语言是一种专门用于科学计算的语言,但其图形界面的功能比较弱,利用其开发的程序,用户界面不友好,使用起来不方便。而Visual Basic, Visual C等可视化编辑语言开发出来的程序界面友好,但由于其不是专门用于科学计算的语言,因此其科学计算功能较弱。

由于Matlab强大的应用功能,用户越来越多。Matlab的应用可让用户不再需要了解大量底层与开发无关的工作,极大地提高了开发效率。Matlab为解决用户开发和客户交互的局限,提供了一个全新的GUI设计方案。

-1-

图形用户界面(GUI, Graphical User Interface)是提供人机交互的工具和方法。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图形用户界面开发环境(Matlab graphicaluser interface development environment)简称GUIDE,其主要是一个界面设计工具集。Matlab6.5将所有GUI所支持的用户控件都集成起来,同时提供界面外观、属性和行为响应方法的设置方法。除了可以使用GUIDE创建GUI之外,还可以将设计好的GUI界面保存为一个FIG资源文件,自动生成对应的M文件。该M文件包含了GUI初始化代码和组建界面布局的控制代码。

使用GUIDE创建GUI对象执行效率高,可以交互式地进行组件布局,还能生成保存和发布GUI的对应文件。

本课程设计选择用Matlab的图形用户界面设计是因为不需要编写大量的代码,它既能嵌入已有的仿真程序,又能与仿真环境相结合。

-2-

第二章 GUI的创建

从MatlabS.X版本开始,为了方便用户制作图形界面Matlab提供了一个交互式的设计工具GUIDE。但是从Matlab6.X以来,GUIDE的设计界面己经发生变化,本论文采用的是Matlab6.5的GUIDE。GUIDE实际上是一套Matlab的工具集,它由版面设计工具、属性编辑器、菜单编辑器、调整工具、对象浏览器、TAB次序编辑器六部分组成。

2.1 GUI设计概述

在GUI设计程序前,首先考虑设计对象的结构和开发流程。不同的要求设计出来的GUI也不同。一个优秀的界面基本符合易用性、统一性、规范性和合理性的标准。

为了高效率的开发一个GUI,必须按照一定的开发步骤,下面给出一般步骤图(如图2.1):

图2.1 GUI设计步骤图

2.2 GUI实现

GUI编程实现主要分为三大块:组件的布局、属性的编辑和回调函数的编辑。 1、组件的布局

在GUIDE的界面设计区添加组件的方法很简单,只要用鼠标从组件面板里点击并拖拉组件即可实现。添加菜单有专门的菜单编辑器来完成。完成添加后可使用GUIDE的特征工具调整组件的位置和使用TAB次序编辑器调整TAB次序达到最优化配置,来完成布局。 2、属性编辑

通过属性编辑可以改变当前组件的属性值,在菜单编辑里可改变菜单的属性值。当改变组件属性值时,可能会影响到界面的整体效果,因此在改完属性值滞后还要对组件的布局进行优化。

GUI实现的关键还在于回调函数的处理。 3、回调函数

在Matlab6.5里回调函数直接在M文件中编辑,这样的事件管理模式,便于用户的理解和编辑。

-3-

当一个图形对象发生特殊事件时,GUI传递要执行的子函数名到M文件中,该子函数称为回调函数(也称callback函数)。

用户对控件操作(如鼠标单击、双击或移动、键盘输入等)的时候,控件对该操作进行响应,指定执行的函数,就是该控件的回调函数。该函数不会主动运行,只在用户对控件执行特定操作时执行。

2.3采用GUIDE创建GUI

采用GUIDE创建一个完整的GUI图形界面,步骤如下: 1, GUI对象布局 2、设置对象的相应属性 3、编写回调函数

2.3.1 GUI组件介绍

1、触控按钮(Push Button)

在Push Button双击,调用属性查看器,可以设置Push Button的属性。 2、静态文本(Static Text)

Static Text通常用于显示其他对象的数值、状态等。 3、可编辑文本框(Edit Text)

Edit Text允许用户修改文本内容,用于数据的输入显示。 4、单选按钮(Radio Button)

Radio Button用于显示一组互斥的状态。其对象之多只有一个的value值为l。 5、坐标轴(Axes)

Axes用于数据的可视化,即显示图形或者图像。Axes是核心图形对象的容器,它包含下列GUI核心图形对象:image, light, lint, patche, rectangle, surface和text对象。

2.3.2菜单编辑器

菜单编辑器生成可以为每个菜单选项生成空回调函数的子函数,包括菜单名,其主要用于建立菜单栏(Menu Bar)和右键菜单(Context Menus。若窗口的MenuBar属性值为none,则只显示用户设计的菜单;若MenuBar属性值为Figure则用户设计的菜单出现在标准菜单之后。

2.3.3创建GUI模型

图2.3为GUI模型图。

-4-

图2.3 GUI模型图

界面有两个发送单元,分别为航令和航向发送,航令为控制船舶转速的大小,航向为设定的角度,输入相应的数值,点击发送,则船舶模型会相应的转动。

建立一个GUI模型之后,相应的会出现源程序代码,以下为其中的发送接收程序: function pushbutton1_Callback(hObject, eventdata, handles) global count; 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);

-5-

end

stopasync(s); fclose('all'); delete(s); clear all;

function rxd_mycallback(hObject, event) %接收中断程序 global count; count=count+1;

在实现控制的过程中,串口时常会堵塞,所以需要不时的清零一下串口,需要用到一下程序:

function scom_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); clear all;

-6-

第三章 控制器的设计

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实物仿真框图

-7-

图4.19中Step为设定航向,其与实际航向的差值作为PID控制器的输入,通过控制器后得到输出,即舵令,将设定航向和舵令通过串口发送给船舶模型,船舶模型接收到便进行相应的运动,在运动时模型有实际的航向,通过串口不断的将实际航向发送到上微机,与设定航向运算,将运算结果作为PID控制器的输入。

3.3 S-FUNCTION函数

s-function也就是system-function的缩写。说得简单,s-function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口,建立自己的simulink仿真模块。

simulink 的仿真有两个阶段:第一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。在 matlab 的 workspace 里打 edit sfuntmpl,就会出现 matlab 自己提供的 s 函数模板了。

本课程设计所封装的实验程序(S-Function)如下: function [sys,x0,str,ts] = scom_1(t,x,u,flag) switch flag, case 0,

[sys,x0,str,ts]=mdlInitializeSizes; case 1,

sys=mdlDerivatives(t,x,u); case 2,

sys=mdlUpdate(t,x,u); case 3,

sys=mdlOutputs(t,x,u); case 4,

sys=mdlGetTimeOfNextVarHit(t,x,u); case 9,

sys=mdlTerminate(t,x,u); otherwise

error(['Unhandled flag = ',num2str(flag)]); end

function [sys,x0,str,ts]=mdlInitializeSizes global st; sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = 2; sizes.NumInputs = 2; sizes.DirFeedthrough = 1;

-8-

sizes.NumSampleTimes = 1; % at least one sample time is needed sys = simsizes(sizes); x0 = []; str = []; ts = [0 0]; 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'; function sys=mdlDerivatives(t,x,u) sys = [];

function sys=mdlUpdate(t,x,u) sys = [];

function sys=mdlOutputs(t,x,u) global st; 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); else a='$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);

-9-

else e=',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);

function sys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime = 1; % Example, set the next hit to be one second later. sys = t + sampleTime;

function sys=mdlTerminate(t,x,u) global st; sys = []; delete(st); clear st;

-10-

结 果

本课程设计所设计的船舶航行控制器填补了学生缺少船舶控制实验课所需要的具有针对性的教学工具的空缺,此船舶航向控制器操作方便、可开发性强、满足船舶控制课时的需要。船舶航向控制器能满足以下功能: 1、基于Matlab-Simulink环境的船舶航向保持控制仿真;在Matlab-Simulink环境下建立仿真图,分析仿真结果。改变船舶参数进行相同的仿真实验,观察不同船舶间的仿真结果有何不同,并分析原因。2、基于Matlab-Simulink环境的实物船舶的航向保持控制。通过实验验证,以上功能均已实现。

本文中基于Matlab /GUI的串口通信功能的编程实现表明利用Matlab GUI可以进行包含一般界面元素的界面开发,在此基础上,加入串口通信功能,实现数据的实时采集与分析处理,并进行图形化显示。

文中设计基于PID自整定的船舶航向控制器,为船舶航向控制提供了一种有效方法。仿真研究的结果表明,自整定PID控制可以有效的调整PID参数,且控制系统的响应速度快,具有良好的稳定性。

-11-

参考文献

[1]MATLAB接口技术程序设计实例教程.赵书兰主编.化学工业出版社.2009 [2]MATLAB仿真技术与实例应用教程.张淼 张正亮编著.机械工业出版社.2004 [3]基于Matlab/GUI的新型界面开发方式.邱金蕙主编.河北工业科技.2008 [4]MATLAB N个实用技巧.刘焕进 王辉 李鹏编著.北京航空航天大学出版社.2011

-12-

致 谢

在这次课程设计过程中,我及小组同学得到了许多人的帮助。

首先,我要感谢我的老师颜德文老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。

其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计上的难题。同时也感谢学院为我提供良好的做课程设计的环境。

最后,再一次感谢所有在设计中曾经帮助过我的良师益友和同学。

-13-

因篇幅问题不能全部显示,请点此查看更多更全内容