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

📄 cback.m

📁 内模控制器(IMC)工具箱。包括参数整定、PID控制器参数转换等
💻 M
📖 第 1 页 / 共 3 页
字号:
 		uimenu(DYN_MENU(9),...
  			'Label',' Upp&er and lower bounds ','Callback',['IMENU=4920;','imcmenu']);   
     	DYN_MENU(10)=uimenu(DYN_MENU(7),...
    		'Label',' Normallized integrated sensitivity function ');
		uimenu(DYN_MENU(10),...
  			'Label',' &Upper bound ','Callback',['IMENU=4930;','imcmenu']);
 		uimenu(DYN_MENU(10),...
  			'Label',' &Lower bound ','Callback',['IMENU=4940;','imcmenu']);
 		uimenu(DYN_MENU(10),...
  			'Label',' Upp&er and lower bounds ','Callback',['IMENU=4950;','imcmenu']);   
     	DYN_MENU(11)=uimenu(DYN_MENU(7),...
    		'Label',' Partial sensitivity function (PSF) ');
		uimenu(DYN_MENU(11),...
  			'Label',' &Upper bound ','Callback',['IMENU=4830;','imcmenu']);
 		uimenu(DYN_MENU(11),...
  			'Label',' &Lower bound ','Callback',['IMENU=4840;','imcmenu']);
 		uimenu(DYN_MENU(11),...
  			'Label',' Upp&er and lower bounds ','Callback',['IMENU=4850;','imcmenu']);   
 		DYN_MENU(12)=uimenu(MAIN_MENU(4),...
  			'Label',' &Help ','Callback','sayhelp(4900)');      
  	   DYN_MENU(13)=uimenu(MAIN_MENU(8),...
  	     'Label','&IMC controller','Callback',['IMENU=7440;','imcmenu']);
  	   DYN_MENU(14)=uimenu(MAIN_MENU(8),...
  	      'Label','&Realizable PID controller','Callback',['IMENU=7450;','imcmenu']);
  	   DYN_MENU(15)=uimenu(MAIN_MENU(8),...
  	      'Label','&1st order lag PID controller','Callback',['IMENU=7460;','imcmenu']);
  	   DYN_MENU(16)=uimenu(MAIN_MENU(8),...
  	      'Label','&2nd order lag PID controller','Callback',['IMENU=7470;','imcmenu']);
  	   DYN_MENU(17)=uimenu(MAIN_MENU(8),...
  	      'Label','&Floating Integral controller','Callback',['IMENU=7480;','imcmenu']);
  	   DYN_MENU(18)=uimenu(MAIN_MENU(8),...
  	     'Label','PI &lag controller','Callback',['IMENU=7490;','imcmenu']);
  	  	DYN_MENU(19)=uimenu(MAIN_MENU(8),...
  		  'Label','&PI &controller','Callback',['IMENU=7500;','imcmenu']);
       set(MAIN_MENU(8),'Label',' Outer loop &IMC cascade with inner loop');
  MAIN_MENU(10)=uimenu(MAIN_MENU(5),...
     'Label',' &Step Responses for Cascade with');
  uimenu(MAIN_MENU(10),...
     'Label','outer loop IMC controller','Callback',['IMENU=5200;','imcmenu']);
  uimenu(MAIN_MENU(10),...
     'Label','outer loop PID controller','Callback',['IMENU=5300;','imcmenu']);
 MAIN_MENU(12)=uimenu(MAIN_MENU(7),...
  'Label',' Outer loop &PID cascade with inner loop');
  	   uimenu(MAIN_MENU(12),...
  	     'Label','&IMC controller','Callback',['IMENU=7440;','imcmenu']);
  	   uimenu(MAIN_MENU(12),...
  	      'Label','&Realizable PID controller','Callback',['IMENU=8450;','imcmenu']);
  	   uimenu(MAIN_MENU(12),...
  	      'Label','&1st order lag PID controller','Callback',['IMENU=8460;','imcmenu']);
  	   uimenu(MAIN_MENU(12),...
  	      'Label','&2nd order lag PID controller','Callback',['IMENU=8470;','imcmenu']);
  	   uimenu(MAIN_MENU(12),...
  	      'Label','&Floating Integral controller','Callback',['IMENU=8480;','imcmenu']);
  	   uimenu(MAIN_MENU(12),...
  	     'Label','PI &lag controller','Callback',['IMENU=8490;','imcmenu']);
  	  	uimenu(MAIN_MENU(12),...
  		  'Label','&PI &controller','Callback',['IMENU=8500;','imcmenu']);
   end
   
   
case 3 % Number of input
   if ~isempty(Xpnummt{1,1})
      switch questdlg('System contains data, proceed ?');
      case {'No','Cancel'}
      set(MAIN_MENU(16),'Value',maxcol);
         return
      end
   end
   maxcol=get(MAIN_MENU(16),'Value');
   if get(MAIN_MENU(17),'Value')
      maxrow=maxcol;
      set(MAIN_MENU(14),'Value',maxrow);
      set(MAIN_MENU(14),'Enable','off');
   else
      maxrow=get(MAIN_MENU(14),'Value');
      set(MAIN_MENU(14),'Value',maxrow);
      set(MAIN_MENU(14),'Enable','on');
   end
   chn_sys_dim; % change system dimension
   JMENU=2; cback;
   
case 4 % Input = Output ?
   if get(MAIN_MENU(17),'Value')
      maxrow=get(MAIN_MENU(16),'Value');
      set(MAIN_MENU(14),'Value',maxrow);
      set(MAIN_MENU(14),'Enable','off');
   else
      maxrow=get(MAIN_MENU(14),'Value');
      set(MAIN_MENU(14),'Value',maxrow);
      set(MAIN_MENU(14),'Enable','on');
   end
   chn_sys_dim; % change system dimension
   JMENU=2; cback;
   
case 5 % Number of TF terms
   temp=get(MAIN_MENU(18),'Value');
   if temp~=n_of_TF
      n_of_TF=temp;
      if n_of_TF==2;
      Xpnums(:,:,2,:)={'Numerator'}; Xpdens(:,:,2,:)={'Denominator'};
      Xpdeads(:,:,2,:)={'Deadtime'};Xunidn(:,:,2,:)={[0]}; 
      Xuniddt(:,:,2,:)={[0]};Xpnummt(:,:,2,:)={[]};Xpdenmt(:,:,2,:)={[]};
      Xpdeadmt(:,:,2,:)={[]};Xpnum(:,:,2,:)={''};Xpden(:,:,2,:)={''};
      Xpdead(:,:,2,:)={''}; Xunidd(:,:,2,:)={[0]};
      
		Xmnums(:,:,2,:)={'Numerator'}; Xmdens(:,:,2,:)={'Denominator'};
      Xmdeads(:,:,2,:)={'Deadtime'};Xmnummt(:,:,2,:)={[]};
      Xmdeadmt(:,:,2,:)={[]};Xmunidn(:,:,2,:)={[0]};Xmunidd(:,:,2,:)={[0]};
      Xmuniddt(:,:,2,:)={[0]};Xmnum(:,:,2,:)={''};Xmden(:,:,2,:)={''};
      Xmdead(:,:,2,:)={''}; Xmdenmt(:,:,2,:)={[]};
   	else
      Xpnums(:,:,2,:)=[]; Xpdens(:,:,2,:)=[];
      Xpdeads(:,:,2,:)=[];Xunidn(:,:,2,:)=[]; 
      Xuniddt(:,:,2,:)=[];Xpnummt(:,:,2,:)=[];Xpdenmt(:,:,2,:)=[];
      Xpdeadmt(:,:,2,:)=[];Xpnum(:,:,2,:)=[];Xpden(:,:,2,:)=[];
      Xpdead(:,:,2,:)=[]; Xunidd(:,:,2,:)=[];
      
		Xmnums(:,:,2,:)=[]; Xmdens(:,:,2,:)=[];
      Xmdeads(:,:,2,:)=[];Xmnummt(:,:,2,:)=[];
      Xmdeadmt(:,:,2,:)=[];Xmunidn(:,:,2,:)=[];Xmunidd(:,:,2,:)=[];
      Xmuniddt(:,:,2,:)=[];Xmnum(:,:,2,:)=[];Xmden(:,:,2,:)=[];
      Xmdead(:,:,2,:)=[]; Xmdenmt(:,:,2,:)=[];
   	end
   end

case 6
   d_through_p=get(MAIN_MENU(19),'Value');
   if exist('diag_handle') & all(ishandle(diag_handle))
      delete(diag_handle);
   end
   JMENU=2; cback;
   
     
case (5 + 2600) % Saturation Upper bound
   temp=get(gcbo,'String');
   if any(isletter(temp))
      errordlg('Bound must be number');
   else
      temp1=str2num(temp);
      if length(temp1)~=maxcol
         errordlg('Bound must match the number of inputs.');
      else
         satubs=temp;
         Satub=temp1;
      end
   end
   
case (10 + 2600) % Saturation Lower bound
   temp=get(gcbo,'String');
   if any(isletter(temp))
      errordlg('Bound must be number.');
   else
      temp1=str2num(temp);
      if length(temp1)~=maxcol
         errordlg('Bound must match the number of inputs.');
      else
         satlbs=temp;
         Satlb=temp1;
      end
   end
case (15 + 2600) %   OK
   if any(Satub<Satlb)
      errordlg('Bound(s) is/are not feasible.');
   else
      close
   end
   
%Single loop 1 degree of freedom tuning
%---------------------------------------
case {4100,4120,4130}
   switch JMENU
   case 4100
      fun='imc1com';
      Mp=Mp(1);
      qf={'1'};
      qd=qf;
      temp=p{1,1};
      temp1=m{1,1};
      if n_of_TF>1
         [mq]=mq_gen(Xmnummt,Xmdenmt,Xmdeadmt,qnummt{1},...
            qdenmt{1},order{1},y);
      else
         [mq]=mq_gen(Xmnummt{1,1},Xmdenmt{1,1},Xmdeadmt{1,1},qnummt{1},...
            qdenmt{1},order{1},y);
      end
      
   case 4120
      fun='imc2com';
      temp=p{1,1};
      temp1=m{1,1};
      if n_of_TF>1
         [mq]=mq_gen(Xmnummt,Xmdenmt,Xmdeadmt,qfnummt{1},...
            qfdenmt{1},F_order{1},y);
      else
         [mq]=mq_gen(Xmnummt{1,1},Xmdenmt{1,1},Xmdeadmt{1,1},qfnummt{1},...
            qfdenmt{1},F_order{1},y);
      end
      
         
   case 4130
      fun='Usercas';
      temp=strvcat(p{1,1,1},p{1,1,2});
      temp1=strvcat(m{1,1,1},m{1,1,2});
      if n_of_TF >1
         [mq]=mq_gen(Xmnummt(1,1,:,2),Xmdenmt(1,1,:,2),Xmdeadmt(1,1,:,2),...
            qfnummt{1},qfdenmt{1},F_order{1},y);
      else
         [mq]=mq_gen(Xmnummt{1,1,1,2},Xmdenmt{1,1,1,2},Xmdeadmt{1,1,1,2},...
            qfnummt{1},qfdenmt{1},F_order{1},y);
      end
      
   end
   [Emin]=noise_amp_e(qnummt{1,1},qdenmt{1,1},order{1,1},Na,y);
   fprintf('Emin for noise amplification is         %.3f   \n',Emin);
   if isempty(vub) | isempty(vlb) | vub==vlb
      Epsilon{1,1}(1)=Emin;
   else   
      if Epsilon{1,1}(1)==0
         Epsilon{1,1}(1)=Emin;
      end
      Epsilon{1,1}
      x=(vub+vlb)/2;
      [Epsilon{1,1},decade,Omega,x]=findone(Epsilon{1,1},fun,decade,Acc,Na,vub,vlb,numpdec,x,y,...
         [],temp,temp1,q{1,1},qf{1,1},qd{1,1},pd{1,1},Mp(1),Mp2(1),10000,Tcanc,mq,F_order{1});
   end
   JMENU=4700; cback;

case 4110
   fun='imc2pseudo';
   fprintf('\n Emin_Dist. for noise amplification: %g ',Emin2);
   if isempty(vub) | isempty(vlb) | vub==vlb
      Epsilon{1,1}(2)=Emin2;
      return
   end   
   x=(vub+vlb)/2;
 	if Epsilon{1,1}(2) <=0
    	Epsilon{1,1}(2)=Emin2;
 	end
    if cascade
       if n_of_TF>1
          [mq]=mq_gen(Xmnummt(1,1,:,2),Xmdenmt(1,1,:,2),Xmdeadmt(1,1,:,2),...
             qfnummt{1},qfdenmt{1},F_order{1},y);
       else
          [mq]=mq_gen(Xmnummt{1,1,1,2},Xmdenmt{1,1,1,2},Xmdeadmt{1,1,1,2},...
             qfnummt{1},qfdenmt{1},F_order{1},y);
       end
       [Epsilon{1,1},decade,x,qd{1,1},err]=findTwo(Epsilon{1,1},fun,decade,Acc,Na,vub,vlb,numpdec,...
          x,y,p{1,1,2},m{1,1,2},q{1,1},qf{1,1},qd{1,1},pd{1,1},Mp(2),Mp2(2),inf,Tcanc,mq,F_order{1});
    else
       if n_of_TF>1
          [mq]=mq_gen(Xmnummt,Xmdenmt,Xmdeadmt,qfnummt{1},...
             qfdenmt{1},F_order{1},y);
       else
          [mq]=mq_gen(Xmnummt{1,1},Xmdenmt{1,1},Xmdeadmt{1,1},qfnummt{1},...
             qfdenmt{1},F_order{1},y);
       end
       [Epsilon{1,1},decade,x,qd{1,1},err]=findTwo(Epsilon{1,1},fun,decade,Acc,Na,vub,vlb,numpdec,...
          x,y,p{1,1},m{1,1},q{1,1},qf{1,1},qd{1,1},pd{1,1},Mp(2),Mp2(2),inf,Tcanc,mq,F_order{1});
    end
 
if ~err
   JMENU=4830; cback;
end

case 4400
	xn=str2num(xns);
	if length(xn)~=p_umax
      errordlg('Number of uncertainty parameters do not match !');
      return
   end
   close;
   if n_of_TF>1
      [mq]=mq_gen(Xmnummt,Xmdenmt,Xmdeadmt,qnummt{1},...
         qdenmt{1},order{1},y);
   else
      [mq]=mq_gen(Xmnummt{1,1},Xmdenmt{1,1},Xmdeadmt{1,1},qnummt{1},...
         qdenmt{1},order{1},y);
   end
   
   [Epsilon{1,1},decade,x,vub,vlb]=findunc(Epsilon{1,1},fun,decade,Acc,Na,vub,vlb,numpdec,x,...
      y,0,p{1,1},m{1,1},q{1,1},qd{1,1},Mp,10000,Tcanc,xn,mq);
   temp='The new uncertainty limitss for the specified filter time';
   temp=strvcat(temp,'constant has been calculated and assigned to the system');
   msgbox(temp)
   
case 4500
   % Tuning for lower bound saturation
   handle=get(gcf,'Child');
   e_step=str2num(get(handle(2),'String'));
   close;
   Epsilon{1,1}(1)=msf_adj(Xpnummt{1,1},Xpdenmt{1,1},Xpdeadmt{1,1},Xmnummt{1,1},Xmdenmt{1,1},...
         Xmdeadmt{1,1},Xpdnummt{1,1},Xpddenmt{1,1},qnummt{1,1},qdenmt{1,1},...
         order{1,1},x,y,Epsilon{1,1}(1),satubs,satlbs,d_through_p,qnums{1,1},qdens{1,1},e_step);
      
case 4600
% PID controller
% ------------------
	switch get(MAIN_MENU(15),'Value')
	case 1 % 1Df
      pid1df_sim(0,Xpnummt,Xpdenmt,Xpdeadmt,Xmnummt,Xmdenmt,Xmdeadmt,Xpdnummt,Xpddenmt,...
         qnummt{1,1},qdenmt{1,1},order{1,1},x,y,Epsilon{1,1}(1),satubs,satlbs,d_through_p,n_of_TF);
      view_pid;
   case 2 % 2Df
      [d_through_p]=pid2df_sim(0,Xpnummt,Xpdenmt,Xpdeadmt,Xmnummt,Xmdenmt,Xmdeadmt,...
         Xpdnummt{1,1},Xpddenmt{1,1},qnummt{1,1},qdenmt{1,1},qfnummt{1,1},...
         qfdenmt{1,1},order{1,1},F_order{1,1},x,y,Epsilon{1,1},satubs,satlbs,m{1,1},...
         qf{1,1},qd{1,1},Tcanc,d_through_p,n_of_TF);
      set(MAIN_MENU(19),'Value',d_through_p); JMENU=6; cback;
      view_pid;
   case 3
      pid_cascade(0,Xpnummt,Xpdenmt,Xpdeadmt,Xmnummt,Xmdenmt,Xmdeadmt,...
         Xpdnummt{1,1},Xpddenmt{1,1},qnummt{1,1},qdenmt{1,1},qfnummt{1,1},...
         qfdenmt{1,1},order{1,1},F_order{1,1},x,y,Epsilon{1,1},satubs,satlbs,m,...
         qf{1,1},qd{1,1},Tcanc,d_through_p,n_of_TF);
   	if exist('diag_handle') & all(ishandle(diag_handle))
   		delete(diag_handle);
   	end
      diag_handle=showCascade2(main_fig,maxrow,maxcol,Xpnummt,Xpdnummt,...
         Xmnummt,qnummt,qfnummt);
      view_pid;
   end
case 4650
      pid_cascade2(0,Xpnummt,Xpdenmt,Xpdeadmt,Xmnummt,Xmdenmt,Xmdeadmt,...
         Xpdnummt{1,1},Xpddenmt{1,1},qnummt{1,1},qdenmt{1,1},qfnummt{1,1},...
         qfdenmt{1,1},order{1,1},F_order{1,1},x,y,Epsilon{1,1},satubs,satlbs,m,...
         qf{1,1},qd{1,1},Tcanc,d_through_p,n_of_TF);
   	if exist('diag_handle') & all(ishandle(diag_handle))
   		delete(diag_handle);
   	end
      diag_handle=showCascade3(main_fig,maxrow,maxcol,Xpnummt,Xpdnummt,...
         Xmnummt,qnummt,qfnummt);
      view_pid;
      
case 5100
   if n_of_TF > 1
      errordlg('MSF simulation does not support transfer function having 2 terms');
      return
   end
   
   switch get(MAIN_MENU(15),'Value')
	case 1 % 1Df
      msf1df_sim(1,Xpnummt{1,1},Xpdenmt{1,1},Xpdeadmt{1,1},Xmnummt{1,1},Xmdenmt{1,1},...
         Xmdeadmt{1,1},Xpdnummt{1,1},Xpddenmt{1,1},qnummt{1,1},qdenmt{1,1},...
         order{1,1},x,y,Epsilon{1,1}(1),satubs,satlbs,d_through_p,qnums{1,1},qdens{1,1});
   case 2 % 2Df
    [d_through_p]=msf2df_sim(1,Xpnummt{1,1},Xpdenmt{1,1},Xpdeadmt{1,1},Xmnummt{1,1},Xmdenmt{1,1},...
         Xmdeadmt{1,1},Xpdnummt{1,1},Xpddenmt{1,1},qnummt{1,1},qdenmt{1,1},qfnummt{1,1},...
         qfdenmt{1,1},order{1,1},F_order{1,1},x,y,Epsilon{1,1},satubs,satlbs,m{1,1},...

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -