如何在Matlab GUI

时间:2016-03-08 02:01:15

标签: matlab matlab-guide

我正在创建一个GUI,用于根据输入的数据绘制波德图。我有以下代码,但它给了我一个我不明白的错误。

function first_gui

%This gui plots a bode plot from a
%a Transfer function generated from the main plot

%Create a figure with the plot and others pushbutons
f = figure('Visible','on','Position',[360,500,600,400]);
hplot = uicontrol('Style','pushbutton','String','Plot','Position',[415,200,70,25],'Callback',@tf_Callback);

%Create an entering data to numerator
htext = uicontrol('Style','text','String','Entre com a função de transferência','Position',[320,350,250,15]);
hnum = uicontrol(f,'Style','edit','String','Enter TF numerator...','Position',[320,320,250,20]);

%Create an entering data to denominator
htext_2 = uicontrol('Style','text','String','Entre com a função de transferência','Position',[320,280,250,15]);
hden = uicontrol(f,'Style','edit','String','Enter TF denominator...','Position',[320,250,250,20]);

hfig = axes('Units','pixels','Position',[50,60,200,185]);

%Initialize the UI

f.Units = 'normalized';
hfig.Units = 'normalized';
hplot.Units = 'normalized';
hnum.Units = 'normalized';
hden.Units = 'normalized';

sys = tf(hnum,hden);

f.Name = 'Bode Plot';


%Function to plot Bode
function tf_Callback(source,eventdata)
    bode(sys)


end
end

在IDLE上出现这些错误:

  

使用tf时出错(第279行)   “tf”命令的语法无效。输入“help tf”获取更多信息。

     

Simple_Plot中的错误(第29行)   sys = tf(hnum,hden);

     

未定义的函数或变量“sys”。

     

Simple_Plot / tf_Callback出错(第36行)       博德(SYS)

     

评估uicontrol回调时出错

1 个答案:

答案 0 :(得分:0)

您看到的错误是由于您对tf的调用失败,因此sys永远不会被定义。然后在你的回调(tf_Callback)中尝试使用sys,但由于它从未创建过,因此无法找到它并且你得到第二个错误。

那么让我们来看看你传递给tf的内容,看看它失败的原因。您通过了hdenhnum。你以这种方式创建它们。

hden = uicontrol('style', 'edit', ...);
hnum = uicontrol('style', 'edit', ...);

这将为变量hden分配一个MATLAB graphics object。该对象本身可用于manipulate the appearance of that object and also to set/get the value。对于编辑框,String属性包含框中实际输入的内容。所以我怀疑你实际希望传递给tf的是hdenhnum uicontrols以及不是手柄本身。因此,您必须自己获取值并将其转换为数字(str2double)。

hden_value = str2double(get(hden, 'String'));
hnum_value = str2double(get(hnum, 'String'));

然后,您可以将这些传递给tf

sys = tf(hnum_value, hden_value);

现在应该可行。但是,我相信你真正想要的是当用户点击“情节”按钮时从那些编辑框中检索值。您目前拥有它的方式,这些值仅被检索一次(当GUI启动时),因为它们位于回调函数之外。如果您希望他们在每次点击“情节”按钮时获取用户提供的值,那么您需要将上面的代码放在按钮回调中({ {1}})。

tf_Callback

现在每次用户点击按钮时,都会从编辑框中检索值,计算function tf_Callback(src, evnt) hden_value = str2double(get(hden, 'String')); hnum_value = str2double(get(hnum, 'String')); sys = tf(hnum_value, hden_value); bode(sys); end ,并创建波特图。

您可能希望在回调中添加一些额外的错误检查,以确保为syshden输入的值有效并生成有效的图并可能会发出警告({{ 3}})或错误(warndlg)提醒用户他们选择了无效值。