⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cnf.m

📁 hard disk drive servo control tools, it is very helpful
💻 M
📖 第 1 页 / 共 5 页
字号:
% 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 + -