?? cnf.m
字號:
% setup Simulation Parameters
% X=X0+TextWL;
Y=Y-Vgap;
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'ForegroundColor','b',...
'FontSize',10,...
'FontWeight','bold',...
'Position',[X0,Y, TextWL TextH], ...
'String','Simulation Parameters', ...
'Style','text', ...
'HorizontalAlignment','left');
Y=Y-Vgap;
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X0,Y, TextW TextH], ...
'String','target reference ', ...
'Style','text',...
'HorizontalAlignment','right');
ud.Handles.edit_SetPoint = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',[1 1 1], ...
'Position',[X Y EditW EditH], ...
'Style','edit', ...
'Tag','t', ...
'Callback',{@edit_target_Callback, gco}, ...
'HorizontalAlignment','left');
% 'Tag','Any', ...
% 'Callback',{@edit_value_Callback}, ...
Y=Y-Vgap;
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X0,Y, TextW TextH], ...
'String','stop time ', ...
'Style','text',...
'HorizontalAlignment','right');
ud.Handles.edit_StopTime = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',[1 1 1], ...
'Position',[X Y EditW EditH], ...
'Style','edit', ...
'Callback',{@edit_value_Callback}, ...
'HorizontalAlignment','left');
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X1,Y, TextW/2 TextH], ...
'String','sec', ...
'Style','text', ...
'HorizontalAlignment','left');
Y=Y-Vgap;
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X0,Y, TextW TextH], ...
'String','step size ', ...
'Style','text',...
'HorizontalAlignment','right');
ud.Handles.edit_StepSize = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',[1 1 1], ...
'Position',[X Y EditW EditH], ...
'Style','edit', ...
'Callback',{@edit_value_Callback}, ...
'HorizontalAlignment','left');
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X1,Y, TextW/2 TextH], ...
'String','sec', ...
'Style','text', ...
'HorizontalAlignment','left');
% Performance indicators
Y=Y-Vgap;
ud.Handles.title_Performance = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'ForegroundColor','b',...
'FontSize',10,...
'FontWeight','bold',...
'Position',[X0,Y, TextWL TextH], ...
'String','Performance Indicators', ...
'Style','text', ...
'HorizontalAlignment','left');
Y=Y-Vgap;
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X0,Y, TextW TextH], ...
'String','error bound ', ...
'Style','text',...
'HorizontalAlignment','right');
ud.Handles.edit_ErrorBound = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',[1 1 1], ...
'Position',[X Y EditW EditH], ...
'Style','edit', ...
'Callback',{@edit_value_Callback}, ...
'HorizontalAlignment','left');
% percentage
ud.Handles.check_Percent = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X1 Y EditW/2 EditH], ...
'Style','check', ...
'String','%', ...
'HorizontalAlignment','center');
% Settling Time(s)
Y=Y-Vgap;
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X0,Y, TextW TextH], ...
'String','settling time ', ...
'Style','text',...
'HorizontalAlignment','right');
ud.Handles.edit_SettlingTime = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',[1 1 1], ...
'Position',[X Y EditW EditH], ...
'Style','edit', ...
'Enable','off', ...
'HorizontalAlignment','left');
uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X1,Y, TextW/2 TextH], ...
'String','sec', ...
'Style','text', ...
'HorizontalAlignment','left');
% Steady bias
Y=Y-Vgap;
ud.Handles.text_SteadyBias = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',Params.StdColor, ...
'Position',[X0,Y, TextW TextH], ...
'String','steady state bias ', ...
'Style','text',...
'HorizontalAlignment','right');
ud.Handles.edit_SteadyBias = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'BackgroundColor',[1 1 1], ...
'Position',[X Y EditW EditH], ...
'Style','edit', ...
'Enable','off', ...
'HorizontalAlignment','left');
% the status text
ud.Handles.text_Status = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'Position',[0.05,0.01, TextWL TextH], ...
'String','Press <Start> to trigger simulation ...', ...
'BackgroundColor',Params.BgColor,...
'Style','text',...
'HorizontalAlignment','left');
% setup the push buttons
Y=Vgap/3;
BW = Params.ButtonW; % button width
BH = Params.ButtonH; % button height
X = frmRight-BW;
ud.Handles.Button_Stop = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'Position',[X Y BW BH], ...
'Fontsize',11, ...
'FontWeight','bold', ...
'Callback',{@button_Stop_Callback},...
'Enable','off',...
'String','Stop');
% 'BackgroundColor',[1 1 0.7], ...
X = X-BW;
ud.Handles.Button_Start = uicontrol('Parent',CnfFigHdl, ...
'Unit',Params.StdUnit,...
'Position',[X Y BW BH], ...
'Fontsize',11, ...
'FontWeight','bold', ...
'Callback',{@button_Start_Callback},...
'BusyAction','cancel',...
'String','Start');
% 'BackgroundColor',[0.7 1 1], ...
% setup the contextmenu for axes/plot
uimenu(ctmenu,'Label','Re-Plot in a new figure ', 'Callback', {@uimenu_tip} );
uimenu(ctmenu,'Label',' System output','Callback',{@Menu_Extract_Callback}, 'Separator','on','UserData', ud);
uimenu(ctmenu,'Label',' Control signal','Callback',{@Menu_Extract_Callback}, 'UserData', ud);
uimenu(ctmenu,'Label',' Output and control','Callback',{@Menu_Extract_Callback}, 'UserData', ud);
uimenu(ctmenu,'Label',' State variables','Callback',{@Menu_Extract_Callback}, 'UserData', ud);
uimenu(ctmenu,'Label',' State and control','Callback',{@Menu_Extract_Callback}, 'UserData', ud);
uimenu(ctmenu,'Label','Extract to Workspace','Callback',{@Menu_Extract_Callback}, 'Separator','on','UserData', ud);
%===================================================================
% Simulink file must be open for variables to be passed to it
load_system(cnfdb.Simulink.Model);
% cnfdb.Simulink.WindowOpen = 1;
% Set the user data field of the cnf_getdata S function block
set_param(cnfdb.Simulink.GetData,'UserData', ud);
% set the Simulink callback functions
set_param(cnfdb.Simulink.Model,'StartFcn','cnf_callback(''Start'')');
set_param(cnfdb.Simulink.Model,'StopFcn','cnf_callback(''Stop'')');
set_param(cnfdb.Simulink.Model,'CloseFcn','cnf_callback(''Close'')');
set(ud.Handles.Button_Start,'UserData',ud);
set(ud.Handles.Button_Stop,'UserData',ud);
set(ud.Display.SysDiagramHandle,'UserData',ud);
set(menu_load_handle, 'UserData', ud);
set(menu_export_handle, 'UserData', ud);
set(menu_locus_handle, 'UserData', ud);
set(menu_bode_handle, 'UserData', ud);
set(menu_nyquist_handle, 'UserData', ud);
set(menu_sensitivity_handle, 'UserData', ud);
guidata(CnfFigHdl,cnfdb);
set(CnfFigHdl,'Visible','on');
cnf_update_panel(ud.Display.SysDiagramHandle);
%cnf_update_panel(ud.Display.SysDiagramHandle);
% -----------------------------------------------------------------------
function uimenu_tip(hObject, eventdata, handles)
uiwait(msgbox('Please choose one specific item.', get(gcbo,'Label'), 'help', 'modal'));
% -----------------------------------------------------------------------
function edit_value_Callback(hObject, eventdata, handles)
error=0;
in_str=deblank(get(hObject,'String'));
if isempty(in_str)
error=1;
else
val=evalin('base',in_str ,'[]');
if isnumeric(val) & length(val)==1
tag=get(hObject,'Tag');
if ~strcmp(tag,'Any') & val<=0
error=1;
end
else
error=1;
end
end
if error==1
warndlg('The value you entered is not valid !','Warning','modal');
end
% --- Executes on button press in button_Start.
function button_Start_Callback(hObject, eventdata, handles)
% hObject handle to button_Start (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
ud=get(hObject,'UserData');
ud=get(ud.Display.SysDiagramHandle,'UserData');
handles=ud.Handles;
cnfdb=guidata(ud.Figure);
switch cnfdb.Running
case 0
% if cnfdb.sys_ok==0 | cnfdb.ctrl_ok==0
% warndlg('The system model or controller is not ready !','Warning','modal');
% return;
% end
if update_controller(ud) ==0
return; % errors occur in updating controller, quit simulation
end
cnfdb = guidata(ud.Figure);
Fill_Simulink_Model(cnfdb);
% set the display
StopTime = cnfdb.StopTime;
set(ud.Display.GraphHandles(1),'XLim',[0 StopTime]);
set(ud.Display.GraphHandles(1),'XTick',[0:StopTime/10:StopTime]);
tt=0:cnfdb.StepSize:StopTime;
for n=1:length(tt)
t=tt(n);
Ref(n) = eval(cnfdb.SetPoint);
end
rmin=min(Ref);
rmax=max(Ref);
h0=cnfdb.System.C2*cnfdb.System.x0;
Ref=[rmin,rmax,h0];
infimum=1e-16;
if max(abs(Ref)) < infimum
% ymin = -infimum;
% ymax = infimum;
% ystep= infimum/2;
else
ymin=min([0, Ref*1.2]);
ymax=max([0, Ref*1.2]);
ystep=max(abs(Ref))/5;
set(ud.Display.GraphHandles(1),'YLim',[ymin ymax]);
set(ud.Display.GraphHandles(1),'YTick',[ymin:ystep:ymax]);
end
Um=1;
if cnfdb.System.CS_in & cnfdb.System.CS_Umax>0
Um=cnfdb.System.CS_Umax;
end
set(ud.Display.GraphHandles(2),'XLim',[0 StopTime]);
set(ud.Display.GraphHandles(2),'XTick',[0:StopTime/10:StopTime]);
set(ud.Display.GraphHandles(2),'YLim',[-Um Um]);
set(ud.Display.GraphHandles(2),'YTick',[-Um:Um/4:Um]);
set(ud.Display.GraphHandles(3),'XLim',[0 StopTime]);
set(ud.Display.GraphHandles(3),'XTick',[0:StopTime/10:StopTime]);
% Clear any lines by setting their XData and YData fields to [0]
% set(ud.Display.LineHandles,'EraseMode','xor','YData',[],'XData',[]);
set(ud.Display.rLineHandles, 'EraseMode','xor', 'YData',[],'XData',[]);
set(ud.Display.hLineHandles, 'EraseMode','xor', 'YData',[],'XData',[]);
set(ud.Display.uLineHandles, 'EraseMode','xor', 'YData',[],'XData',[]);
set(ud.Display.xLineHandles, 'EraseMode','xor', 'YData',[],'XData',[]);
set(handles.text_Status,'String','Simulation in process ...','ForegroundColor','r');
set(hObject,'String','Pause','ForegroundColor','r');
set(handles.Button_Stop,'Enable','on');
cnfdb.Running=1;
case 1
set(handles.text_Status,'String','Simulation at pause ...','ForegroundColor','m');
set(hObject,'String','Continue','ForegroundColor','r');
set_param(cnfdb.Simulink.Model, 'SimulationCommand', 'Pause' );
cnfdb.Running=2; % Running -> pause
case 2 % Continue -> pause
set(handles.text_Status,'String','Simulation in process ...','ForegroundColor','r');
set(hObject,'String','Pause','ForegroundColor','r');
set_param(cnfdb.Simulink.Model, 'SimulationCommand', 'Continue' );
cnfdb.Running=1; % pause -> Running
end % switch
% Update db structure
guidata(ud.Figure, cnfdb);
% --- Executes on button press in button_Stop.
function button_Stop_Callback(hObject, eventdata, handles)
% hObject handle to button_Stop (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
ud=get(hObject,'UserData');
ud=get(ud.Display.SysDiagramHandle,'UserData');
handles=ud.Handles;
cnfdb=guidata(ud.Figure);
set_param(cnfdb.Simulink.Model, 'SimulationCommand', 'Stop' );
set(handles.text_Status,'String','Simulation has stopped ...','ForegroundColor','b');
set(handles.Button_Start,'String','Start','ForegroundColor','b');
set(hObject,'Enable','off');
cnfdb.Running=0;
% Read in the stored data values from the lines already drawn
ref_val = get(ud.Display.rLineHandles(1),'YData');
out_val = get(ud.Display.hLineHandles(1),'YData');
con_val = get(ud.Display.uLineHandles(1),'YData');
time_val = get(ud.Display.rLineHandles(1),'XData');
%xq_val = ud.Display.xdata;
xq_val=[];
nxq=length(ud.Display.xLineHandles);
for i=1:nxq,
xq_i=get(ud.Display.xLineHandles(i),'YData');
xq_val=[xq_val;xq_i];
end
if ~isempty(time_val)
% to remove the one step delay in Simulink model
ref_val=[ref_val(1) ref_val(1:end-1)];
out_val=[out_val(1) out_val(1:end-1)];
con_val=[con_val(1) con_val(1:end-1)];
% caculate the settling time
% sp=eval(get(handles.edit_SetPoint,'String'));
eb=eval(get(handles.edit_ErrorBound,'String'));
if get(handles.check_Percent,'Value')==1
sp=max(abs(ref_val));
eb=abs(eb*sp/100);
end
ts_str='?';
tt=1;
while tt< length(out_val) & abs(ref_val(tt)-out_val(tt))<=eb
ts_str=num2str(time_val(tt));
tt=tt+1;
end
bt=max(1,round(tt/2));
bias=mean(out_val(1:bt)-ref_val(1:bt));
set(handles.edit_SettlingTime,'String',ts_str);
set(handles.edit_SteadyBias, 'String', num2str(bias) );
% rescale the axis for control signal
umin=min(con_val);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -