我正在创建一个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回调时出错
答案 0 :(得分:0)
您看到的错误是由于您对tf
的调用失败,因此sys
永远不会被定义。然后在你的回调(tf_Callback
)中尝试使用sys
,但由于它从未创建过,因此无法找到它并且你得到第二个错误。
那么让我们来看看你传递给tf
的内容,看看它失败的原因。您通过了hden
和hnum
。你以这种方式创建它们。
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
的是hden
和hnum
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
,并创建波特图。
您可能希望在回调中添加一些额外的错误检查,以确保为sys
和hden
输入的值有效并生成有效的图并可能会发出警告({{ 3}})或错误(warndlg
)提醒用户他们选择了无效值。