关于appdesigner
appdesigner是matlab的app设计工具,由于结合了图形界面与代码界面,其GUI设计要简单不少,matlab预置了许多仪表、控件的图形及相应的代码框架,使得用户在设计自己的GUI时更加方便快捷。配合matlab自身强大的数学功能,使用者可以迅速地打造出一款实现相应功能的app。
相应的,由于使用了大量matlab预置的元素,使得一些更为个性化的独特设计难以在appdesigner上实现。同时,appdesigner生成的app必须要在搭载了matlab的平台上才能运行,即使打包成.exe
文件仍然无法脱离matlab,移动端更是无法支持,这也使得appdesigner的使用场景受到限制。
开始制作APP
本篇博客展示的是一个分析简单MOS共源放大器电路静态工作点的APP。
要启动appdesigner,只需要在指令行输入appdesigner即可。
设计视图
在设计视图里,APP设计者可以设计GUI,在这里可以看到最后呈现给用户的效果。同时,可以直接拖动左侧预置的控件放到APP的GUI里,也可以插入文字、图像,实现快速布局:
在右下方的“检查器”中,还能对这些元素做进一步修改:
除此之外,在设计视图里也有诸多辅助功能,譬如对齐、调整间距等,选中自己想要排版的控件即可操作:
代码视图
在设计视图里,只能对GUI进行设计,要真正的实现功能,还是要到代码视图中去。在代码视图中,很明显地划分出白色和灰色两种代码块,灰色是不能直接修改的,而白色则可以由设计者自行编写:
修改变量名称
在设计视图里摆放的控件,在代码试图中都会有对应的变量,这些变量都被罗列在代码的开头:
需要注意的是,在最开始这些变量的名字并不方便阅读,而是诸如"Button123"这样的初始变量名:
这显然对后续的编程工作极不友好,但灰色的代码块又无法直接修改,令人十分头疼。不过,在右侧的组件浏览器,我们可以右键点击对应控件,找到重命名选项进行重命名。而且,重命名后代码会自动更新完成变量名的修改,不需要在代码中修改。
编写初始化函数
在一些时候,我们并不希望所有的数值都要自己输入,而是有一个合理的初始值,同时初始值也能方便编写APP时的调试,不需要每一次启动APP时都重新输入数据。为了实现这个功能,我们需要编写初始化函数,即startupFcn
。
要新建一个初始化函数,我们要现在右侧组件浏览器中选中整个UI,再在左侧代码浏览器中选择“回调”,点击搜索框右侧的加号,就可以新建一个初始化函数:
在这个函数里,就可以设置一些变量的初值,这些变量都是与输入框对应的。对于分析电路APP来说,就是RL,VS,K,VT,VI
这几个变量,我们可以一一设置:
function startupFcn(app)
app.RL.Value=2000;
app.VS.Value=9;
app.K.Value=0.001;
app.VT.Value=1;
app.VI.Value=3;
end
这样,启动APP后,输入框里就会直接显示设置好的初值:
按钮回调函数
目前为止,这个APP仍然只是一具空壳,无法对用户输入的任何数据有所反应。接下来,才是实现APP功能的核心:按钮回调函数,有了按钮回调函数,用户在按下按钮后才会有各种功能的实现。
新建一个按钮回调函数的过程与初始函数类似,在右侧组件浏览器中选中想要设置函数的按钮,之后在左侧代码浏览器中新建回调函数即可:
至于函数内的内容,根据要实现的功能不同天差地别,而且更多基于matlab与电路的知识,本篇博客不深入探讨,仅贴出代码:
输出直流传输特性图像:
function PrintImage(app, event)
app.SetVI.Value=0;
rl=app.RL.Value;
vs=app.VS.Value;
vt=app.VT.Value;
k=app.K.Value;
vo=0:0.001:5*vs;
x=0:0.001:5*vs;
bd=5000*vs+1;
for i=1:5000*vs+1
vi=(i-1)/1000;
if(vi<vt)
vo(i)=vs;
elseif(vo(i-1)>=vi-vt)
vo(i)=vs-k/2*(vi-vt)^2*rl;
bd=i;
else
vo(i)=(rl*k*(vi-vt)+1-sqrt((rl*k*(vi-vt)+1)^2-2*vs*rl*k))/(rl*k);
end
end
plot(app.UIAxes,x(1:bd*2),vo(1:bd*2));
app.DCImage.Value=0;
end
绘制图像并标出直流工作点:
function setVI(app, event)
app.DCImage.Value=0;
rl=app.RL.Value;
vs=app.VS.Value;
vt=app.VT.Value;
k=app.K.Value;
v=app.VI.Value*1000;
vo=0:0.001:5*vs;
x=0:0.001:5*vs;
bd=5000*vs+1;
for i=1:max(bd,v)+1
vi=(i-1)/1000;
if(vi<vt)
vo(i)=vs;
elseif(vo(i-1)>=vi-vt)
vo(i)=vs-k/2*(vi-vt)^2*rl;
bd=i;
else
vo(i)=(rl*k*(vi-vt)+1-sqrt((rl*k*(vi-vt)+1)^2-2*vs*rl*k))/(rl*k);
end
end
plot(app.UIAxes,x(1:max(v,bd*2)),vo(1:max(v,bd*2)),v/1000,vo(v),'*r');
app.VO.Value=num2str(vo(v));
app.SetVI.Value=0;
end
最终效果演示
这个电路分析APP仍处于最初级的状态,只能分析电路图所示的特定电路,与那些强大的电路分析软件相去甚远,除了作为电路分析课的一次作业,并没有太高实用价值,充其量只是对APP编写的一点初探。而用appdesigner编写的APP正如前言所说,受到诸多限制。只能说,水平有限,求大神轻喷。
绘制直流传输特性图像:
标出静态工作点:
修改参数: