张绍杰, 刘春生
( 南京航空航天大学 自动化学院, 江苏 南京 210016 )
“自动控制理论”课程的特点是系统性、理论性强以及相对较抽象,这使得学生对其理论知识难于理解,需要借助于实验加深对课堂学习内容的理解[1]。传统的自动控制实验存在课时紧张、设备陈旧、操作复杂等缺点。此外,在自动控制领域里的科学研究和工程应用中有大量的繁琐的计算与仿真曲线绘制任务,给控制系统的分析和设计带来了巨大的工作量。
为此,本文采用面向对象设计的软件开发方法,提出一种基于Matlab GUI的自动控制可视化仿真软件平台的设计方案,借助Matlab强大的控制系统工具箱和交互性能良好的图形用户界面GUIDE(Graphical User Interface Development Environment)开发环境,针对电机调速系统、液位控制系统、飞机纵向控制系统、磁悬浮球控制系统和倒立摆控制系统这些典型的系统进行软件设计[2~3]。通过该软件,用户可以在不需要掌握深入的Matlab编程知识的情况下,方便地对系统进行控制原理和方法的分析与设计,也便于自动控制理论学习的学生利用所学的控制知识对系统进行验证。该软件平台的可视化界面简单实用,用户可以利用时域法、根轨迹法和频域法等经典的控制系统分析方法对系统进行分析和验证,加深对自控理论知识的掌握。
Matlab具有强大的数值计算、可视化功能和系统建模仿真能力,在高校和科研机构使用极为广泛。图形用户界面GUI(Graphical User Interface)是由菜单、工具栏、命令按钮、光标、按键等构成一个用户界面,用户通过鼠标、键盘操作激活这些图形对象,使计算机产生某种动作或变化,进行计算、绘图等。图形用户界面是目前计算机应用程序界面的主要形式。Matlab为用户提供了功能强大的集成图形用户界面开发环境(GUIDE),通过GUIDE,用户可方便、快捷地设计图形用户界面,开发自己的应用程序[4~5]。GUIDE可以首先在布局GUI的同时生成以下两个文件:
(1)fig文件。该文件包括GUI的图像窗口和所有子对象的完全描述以及所有对象的属性值。
(2)m文件。该文件包括用户用来发布和控制界面的各种函数,不包含任何组件的布置信息。
应用GUIDE设计一个完整的GUI基本过程如下:
(1)设计GUI的功能,运用面向对象的方法,确定该GUI所需使用的对象,并添加到GUI中;
(2)利用GUIDE提供的布局工具,完成GUI中各个对象的布局,布局时应充分考虑用户需求,力求界面美观、使用方便;
(3)打开各对象的属性查看器,设置GUI中对象的相应属性;
(4)为GUI对象编写必要的回调函数(callback),以保证所设计GUI能正确响应用户的操作。
(5)进行MCC编译,生成exe独立运行文件。
在进行GUI设计之前,首先要确定整个软件平台的架构。由于设计该平台的主要目标是为“自动控制理论”课程教学提供一个交互式的图形用户界面,对课程中的重要内容进行动态仿真,以帮助学生深刻理解这些内容的物理概念和物理过程。根据这一要求,该软件平台主要由电机调速系统、液位控制系统、飞机纵向控制系统、磁悬浮球控制系统和倒立摆控制系统5个基本子系统模块构成。“自动控制理论”课程的其他重要内容,可以在本平台的基础上增加。
为简化这5个基本子系统模块的设计,本文采用了层次化设计方法,将每个基本子系统模块分解为若干个分功能模块,主要包括系统参数设置、仿真参数设置、控制参数设置、仿真控制模式、相应曲线和动画模型显示等,每个分功能模块又包含若干个子功能模块,以满足控制系统分析设计、可视化仿真和软件操作的需要。以电机转速控制子系统为例,其组成如图1所示,其他基本子系统模块采用类似的设计。
图1 电机转速控制子系统的组成模块
主界面是用户访问该软件平台的第一个用户界面,根据软件架构设计的思路,开发出的软件主界面如图2所示。主界面由标题、菜单栏、控制系统选择列表及“退出”按钮构成。
菜单栏包括“可视化仿真软件平台说明”和“关于”两项。“可视化仿真软件平台说明”详细介绍了该软件的主要功能和操作注意事项,通过调用chm格式文档实现,为用户提供必要的软件使用说明。
控制系统选择列表中设计有5个按钮,分别对应系统的5个基本子系统模块。用户点击其中任意一个按钮,即可进入相应的子系统模块进行仿真。这些按钮的功能需编写相应回调函数来具体实现。例如,当用户点击“电机调速系统”按钮时,将启动该子系统模块的图形界面,如图3所示,通过该界面用户可以对电机调速系统进行仿真,也可返回主界面后,选择其他的子系统模块进行仿真。
图2 软件平台主界面
图3 电机调速子系统界面
主界面左下角的“退出”按钮用来退出并关闭系统的运行。此外,界面的背景图片是由函数imread和函数imshow实现[6]。主要代码:
imread(′nuaa.jpg′) ;
imshow(′nuaa.jpg′)
根据图1-3所示的子系统组成模块结构、软件平台主界面和子系统界面,采用Matlab GUI进行各基本子系统模块及其分功能模块的图形用户界面的操作设计,通过编写GUI对象的回调函数响应用户的操作。用户通过主界面访问其所包含的子系统模块界面,进行系统控制设计和仿真。
在进行控制仿真设计之前,必须先对各个基本子系统建立数学模型,以便实现进一步的仿真。本文以电机调速子系统为例进行建模分析[7~8]。图4所示为一永磁同步电机调速系统结构图。本软件平台各子系统采用各自固定的结构图,用户只需设置系统参数和控制参数,便可对系统进行统一的分析、设计和考核。
这样,系统闭环输出为
ωn=
控制系统建模采用Matlab的m文件的形式调用相关系统模型和数学计算函数进行设计。用户按照已建立的系统数学模型,根据对物理控制对象的认识,利用自动控制理论知识,完成系统的分析和设计。本软件平台的5个子系统模块的数学模型均在子系统控制仿真软件的“帮助”部分给出了详细说明。
图4 永磁同步电机调速系统结构图
由于每个基本子系统模块均包含若干个分功能模块,而分功能模式又是由各子功能模块组成。因此,整个软件平台所包含的各种模块数目较多,而它们的实现过程类似。所以,这里仅以电机调速子系统为例,分析该系统模块的GUI设计。
电机调速于系统界面图如图3所示,由菜单栏和各分功能模块组成。其中,菜单栏中的“文件”选项包含运行、截图和关闭系统的常规按钮。“帮助”选项包含软件各种信息,如使用说明、系统建模和版权等。
1)参数设置分功能模块设计
参数设置分功能模块包含3个子功能模块:电机参数设置、仿真参数设置和控制参数设置。电机参数设置功能可以改变电机相关物理参数,以分析不同参数对系统性能的影响。仿真参数设置功能可以根据用户需要设置仿真的起始时间、终止时间、仿真步长和仿真曲线线型。控制参数设置功能使用户通过运行软件观察所设置参数的效果,以方便系统控制器参数的改进。
这些模块主要由控件静态文本框和编辑框实现,且用if语句来保证输入的有效性。例如输入转动惯量的代码如下:
value=get(handles.zdgl,′string′);
if (isempty(str2num(value)))|(str2num(value)<=0)
errordlg(′转动惯量输入错误,请输入正确参数!′,′错误提示′,′on′)else
J=str2num(get(handles.zdgl,′string′));
end
2)动态演示分功能模块设计
动态显示分功能模块包含2个子功能模块:响应曲线显示和动画模型显示。图3中的响应曲线模块为电机转速实时响应曲线,显示了在相应系统参数和设计参数下的响应曲线,响应曲线的横纵坐标会根据软件使用者的设置和电机转速的变化进行调整,以给出最便于应用者观察的响应曲线。图3中的动画模型模块为电机转速响应指示动画,在仿真过程中表盘指针实时显示电机转速,并设置了电机转速的极限值,便于形象地演示电机调速过程。
响应曲线的绘制主要是基于擦除方式(EraseMode)动画设计。首先设定采样时间间隔,通过系统函数对每个采样点求取输出值,根据输入值与输出值的坐标,在坐标图上绘制本次采样点,并保留该痕迹。通过这种方式不断循环提取采样点,曲线不断增长,直至所有的点均提取完毕,整个曲线就实时动态演示出来。绘制一帧响应曲线的代码如下:
axes(handles.axes1);
h001=plot(t(k+i),Y(k+i),′r-′);
tmx1=[t(k+i) t(k+i+1)];
tmy1=[Y(k+i) Y(k+i+1)];
h002=plot(tmx1,tmy1,′r-′);
set(h002,′EraseMode′,′none′,′LineWidth′,xk);
drawnow
同理,转速表指针的动画演示原理也是如此。首先,载入表盘背景图片,然后用系统的转速输出值驱动句柄图形指针。将转速值换算成角度信息,使得指针指向了相应的转速所对应的角度。在每一个定长时间段内都画一次指针,便可以达到转速表的动画效果。软件程序会对电机转速进行检测判定,当转速超出转速表量程时,指针会被限位档挡住,不能指示超出量程的转速,这就需要用户注意指针的指向是否在量程范围内。
3)性能分析分功能模块设计
性能分析分功能涵盖了系统数学模型分析、时域分析法、根轨迹法和频域法等经典控制理论的主要内容,用户不需要掌握具体Matlab的相关知识,就可以通过本软件实现相应的系统分析,完成系统的设计。
本软件平台各子系统均提供了闭环传递函数、系统动态性能指标、系统中某一参数变化时的根轨迹和系统开环伯德图绘制等分析功能。电机调速子系统中的性能分析功能包含3个子功能模块:传递函数显示、根轨迹显示和伯德图显示。
闭环传递函数和系统动态性能指标直接显示在子系统界面上,由控件动态文本框实现。
开环伯德图和根轨迹图的绘制是由菜单栏上的“系统特性分析”选项实现。其包括3种操作:系统开环伯德图、根据参数Ku绘制根轨迹和根据参数βi绘制根轨迹。
根据系统开环伯德图的绘制来判断系统稳定性,根据幅值和相角裕度调节系统稳定性[9]。伯德图的实现方法是将系统开环传递函数作为函数bode的参数,并选择在新的figure中显示。图5为电机调速子系统在图3所示的系统和控制参数设置下的开环伯德图。
根据3.1节的系统数学模型,由控制理论知识可以得到系统的开环传递函数,由此可得绘制伯德图的代码如下:
num=[Kn*Kl*tn Kn*Kl];
den=[ti*J*tn*Ls ti*J*tn*Rs (ti*tn*Ku*Kl+J*bi*tn) 0 0];
G=tf(num,den);
图5 电机调速系统开环伯德图
h1=figure(1);
bode(G);
title(′系统开环Bode图′);
set(h1,′NumberTitle′,′off′,′Name′,′系统开环Bode图′);
grid on
根据用户设置的参数,采用本软件平台绘制伯德图,利用控制理论知识即可完成系统频域性能的分析。
系统提供了根据参数Ku和βi绘制根轨迹的选项。用户可以通过这两个参数的根轨迹观察系统的稳定性。根轨迹的实现方法是将系统开环传递函数写成Ku*G1和βi*G2的形式,再分别将G1和G2作为函数rlocus的参数,并选择在新的figure中显示[1]。图6为电机调速系统在图3所示的系统和控制参数设置下根据参数Ku绘制电机调速系统根轨迹图。
图6 电机调速系统根轨迹曲线图
根据3.1节的系统数学模型,由控制理论知识可以得到绘制系统根轨迹的等效开环传递函数,由此系统根轨迹绘制代码如下:
num=[Kl*tn*ti 0 0];
den=[ti*J*tn*Ls ti*J*tn*Rs J*bi*tn an*Kn*Kl*tn an*Kn*Kl];
G=tf(num,den);
h2=figure(2);
rlocus(G);
title(′根据参数Ku绘制的根轨迹曲线图′);
set(h2,′NumberTitle′,′off′,′Name′,′根轨迹曲线图′)
根据用户设置的参数,采用本软件平台绘制根轨迹图,利用控制理论知识即可完成系统某一参数变化对系统性能影响的分析,借助Matlab工具箱等可系统的校正设计。
4) 仿真控制分功能模块设计
电机调速子系统中仿真控制分功能模块包含四个运行模式按钮。选择按钮组中的任何一个选项都可以激发系统的运行,包含电机转速的动画显示、电机调速系统动态响应曲线的绘制、系统传递函数的显示。四种模式的不同之处在于它们分别将曲线以黑红绿蓝绘制在绘图区中。这样,就可以把不同的系统参数对应的曲线以不同的颜色显示在坐标系中,不致混淆。
要使软件方便易用,需要进行软件的打包,生成可执行的安装文件。
首先,设置编译器。在确定安装好Matlab Compiler后,还需要对Compiler进行适当的配置。方法是在Matlab命令窗口输入:Mbuild -setup,按提示选择matlab自带编译器LCC[10]。
然后,将脚本编译为可执行文件。在项目文件路径下命令行输入:mcc -m gui.m,生成: gui.ctf和gui.exe,这些是脱离matlab环境运行必需的文件。
最后进行功能优化,去除独立可执行程序运行时的DOS黑窗口。Matlab命令行输入:cd(prefdir);edit compopts.bat。此时compopts.bat打开,在文件最后添加:set LINKFLAGS=%LINKFLAGS% -subsystem windows 。编辑之后得到exe文件可以直接运行。
本文基于Matlab GUI开发了自动控制可视化仿真软件平台。软件平台实现了电机调速系统、液位控制系统、飞机纵向控制系统、磁悬浮球控制系统和倒立摆控制系统的仿真分析。平台的可视化界面简单实用,通过该软件,学生可以方便地分析和设计控制系统,对抽象的“自动控制原理”课程有更直观的感受,加深对相关知识的理解。本文开发的软件已经与教材一起在科学出版社出版[11]。