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

📄 cbackm.m

📁 内模控制器(IMC)工具箱。包括参数整定、PID控制器参数转换等
💻 M
📖 第 1 页 / 共 3 页
字号:
   
case (9 + 2400)
   temp=get(handle(1),'String');
   if any(isletter(temp))
      errordlg('Not a number !');
      return
   else
      temp=str2num(temp);
      if length(temp)==length(pduindex{row,col})
         vlb(pduindex{row,col})=temp;
      else
         errordlg('Size of bound does not match !');
         return
      end
   end
   temp=get(handle(3),'String');
   if any(isletter(temp))
      errordlg('Not a number !');
      return
   else
      temp=str2num(temp);
      if length(temp)==length(pduindex{row,col})
         vub(pduindex{row,col})=temp;
      else
         errordlg('Size of bound does not match !');
         return
      end
   end
   if any(vub<vlb)
      errordlg('Bounds infeasible !');
      return
   end
   for i=1:maxrow
      for j=1:maxcol
   		if ~strcmp(Xpden{i,j},'')
      		temp=['(' Xpden{i,j} ')'];
      		if strcmp(Xpdead{i,j},'')
         		p{i,j}=[Xpnum{i,j} '/' temp];
      		else
         		p{i,j}=[Xpnum{i,j} '/' temp '*' Xpdead{i,j}];
      		end
   		else
      		if strcmp(Xpdead{i,j},'')
         		p{i,j}=Xpnum{i,j};
      		else
         		p{i,j}=[Xpnum{i,j} '*' Xpdead{i,j}];
      		end
         end
         temp=maxcol*(i-1)+j;
         set(diag_handle(temp),'TooltipString',p{i,j});
      end
   end
   if ~d_through_p
      for i=1:maxrow
         for j=1:maxcol
            if strcmp(Xpdden{i,j},'')
               pd{i,j}=Xpdnum{i,j};
            else
               temp=['(' Xpdden{i,j} ')'];
               pd{i,j}=[Xpdnum{i,j} '/' temp];
            end
            temp=2*maxrow*maxcol+maxcol*(i-1)+j;
            set(diag_handle(temp),'TooltipString',pd{i,j});
         end
      end
      s=1e-7;
      if isempty(x)
         x=(vub+vlb)/2;
      end
      temp=eval(cell2str(pd));
      if ~any(iscellempty(pd)) & rank(temp)< maxcol
         warndlg(['Pd(0) is linearly dependent. It may cause problems',...
               ' in the system design. Changing the Pd gain is recommended.'],'Warning');
      else
         close
      end
      clear s temp
   else
      close
   end
%Single loop Feedback path controller
%Two degree of freedom feedback path controller 

case (8 + 2500)
not_save_yet=1;
set(main_fig,'Name',['Internal Model Control Tuning - [' datadir NAMEFILE '*]']);
set(current_obj,'BackgroundColor',192/255*[1 1 1]);
qfnums{row,col}=get(handle(8),'String');
qfnummt{row,col}=ms2mtx1(qfnums{row,col});
[m_umax,qfnummt,qfdenmt]=cnt_uncM(qfnummt,qfdenmt,{0},{0});
qfnum{row,col}=mtx2str(qfnummt{row,col},2);
qfden{row,col}=mtx2str(qfdenmt{row,col},2);

if strcmp(qfnum{row,col},'1')
   if F_order{row,col} > 1
      qfdenc{row,col}=['(e*s+1)^' num2str(F_order{row,col})];
   elseif F_order{row,col}==1
      qfdenc{row,col}=['(e*s+1)'];
   else
      qfdenc{row,col}=qfnum{row,col};
   end
else
   if F_order{row,col} > 1
      qfdenc{row,col}=[qfnum{row,col} '*(e*s+1)^' num2str(F_order{row,col})];
   elseif F_order{row,col}==1
      qfdenc{row,col}=[qfnum{row,col} '*(e*s+1)'];
   else
      qfdenc{row,col}=qfnum{row,col};
   end
end

if all(imag(qnummt{row,col}(:)==0))
	k=0;
	[rowc,colc]=size(qfnummt{row,col});
	for i=1:rowc
 		if max(real(roots(qfnummt{row,col}(i,:)))) > 0
  			k=1;
 		end
	end
	if k==1
 		msgbox('The IMC controller will be unstable.','Warning')
	end
end
temp=strrep(qfdenc{row,col},'e',num2str(Epsilon{row,col}(2)));
set(handle(10),'String',temp);
set(handle(11),'String',qfden{row,col});
   val = get(handle(14),'Value');
     if val == 1
         temp1=['(' qfdenc{row,col} ')'];
			if strcmp(qfnum{row,col},'') | strcmp(qfden{row,col},'')
			 	qf{row,col}='';
			else
				qf{row,col}=[qfden{row,col} '/' temp1];
			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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         end
			temp1=strrep(qd{row,col},'e',num2str(Epsilon{row,col}(2)));
     elseif val == 2
        temp1='1';
        qd{row,col}='1';
        qdnum{row,col}=[1];
        qdden{row,col}=[1];
     elseif val == 3
         %user defined qd calculation
         temp1='?';
     end
     set(handle(12), 'String',temp1);

case (6 + 2500)
qfdens{row,col}=get(handle(6),'String');
[qfdenmt{row,col}]=ms2mtx1(qfdens{row,col});
[m_umax,qfnummt,qfdenmt]=cnt_uncM(qfnummt,qfdenmt,{0},{0});
[qfnum{row,col}]=mtx2str(qfnummt{row,col},2);
[qfden{row,col}]=mtx2str(qfdenmt{row,col},2);

if strcmp(qfnum{row,col},'1')
   if F_order{row,col} > 1
      qfdenc{row,col}=['(e*s+1)^' num2str(F_order{row,col})];
   elseif F_order{row,col}==1
      qfdenc{row,col}=['(e*s+1)'];
   else
      qfdenc{row,col}=qfnum{row,col};
   end
else
   if F_order{row,col} > 1
      qfdenc{row,col}=[qfnum{row,col} '*(e*s+1)^' num2str(F_order{row,col})];
   elseif F_order{row,col}==1
      qfdenc{row,col}=[qfnum{row,col} '*(e*s+1)'];
   else
      qfdenc{row,col}=qfnum{row,col};
   end
end
temp=strrep(qfdenc{row,col},'e',num2str(Epsilon{row,col}(2)));
set(handle(10),'String',temp);
set(handle(11),'String',qfden{row,col});
   val = get(handle(14),'Value');
     if val == 1
         temp1=['(' qfdenc{row,col} ')'];
			if strcmp(qfnum{row,col},'') | strcmp(qfden{row,col},'')
			 	qf{row,col}='';
			else
				qf{row,col}=[qfden{row,col} '/' temp1];
			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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         end
			temp1=strrep(qd{row,col},'e',num2str(Epsilon{row,col}(2)));
     elseif val == 2
        temp1='1';
        qd{row,col}='1';
        qdnum{row,col}=[1];
        qdden{row,col}=[1];
     elseif val == 3
         %user defined qd calculation
         temp1='?';
     end
     set(handle(12), 'String',temp1);

case (4 + 2500)
F_order{row,col}=str2num(get(handle(4),'String'));
if strcmp(qfnum{row,col},'1')
   if F_order{row,col} > 1
      qfdenc{row,col}=['(e*s+1)^' num2str(F_order{row,col})];
   elseif F_order{row,col}==1
      qfdenc{row,col}=['(e*s+1)'];
   else
      qfdenc{row,col}=qfnum{row,col};
   end
else
   if F_order{row,col} > 1
      qfdenc{row,col}=[qfnum{row,col} '*(e*s+1)^' num2str(F_order{row,col})];
   elseif F_order{row,col}==1
      qfdenc{row,col}=[qfnum{row,col} '*(e*s+1)'];
   else
      qfdenc{row,col}=qfnum{row,col};
   end
end
temp=strrep(qfdenc{row,col},'e',num2str(Epsilon{row,col}(2)));
set(handle(10),'String',temp);
   val = get(handle(14),'Value');
     if val == 1
         temp1=['(' qfdenc{row,col} ')'];
			if strcmp(qfnum{row,col},'') | strcmp(qfden{row,col},'')
			 	qf{row,col}='';
			else
				qf{row,col}=[qfden{row,col} '/' temp1];
			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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         end
			temp1=strrep(qd{row,col},'e',num2str(Epsilon{row,col}(2)));
     elseif val == 2
        temp1='1';
        qd{row,col}='1';
        qdnum{row,col}=[1];
        qdden{row,col}=[1];
     elseif val == 3
         %user defined qd calculation
         temp1='?';
     end
     set(handle(12), 'String',temp1);

case (14 + 2500) % Change to be the pop up menu
   val = get(handle(14),'Value');
     if val == 1
         temp1=['(' qfdenc{row,col} ')'];
			if strcmp(qfnum{row,col},'') | strcmp(qfden{row,col},'')
			 	qf{row,col}='';
			else
				qf{row,col}=[qfden{row,col} '/' temp1];
			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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         end
			temp1=strrep(qd{row,col},'e',num2str(Epsilon{row,col}(2)));
     elseif val == 2
        temp1='1';
        qd{row,col}='1';
        qdnum{row,col}=[1];
        qdden{row,col}=[1];
     elseif val == 3
         %user defined qd calculation
         temp1='?';
     end
     set(handle(12), 'String',temp1);
     
case (16 + 2500)   
temp=get(handle(16),'String');
temp=ms2mtx1(temp);
if min(temp) < 0;
 errordlg('Filter t.c. must be positive.');
else
   Epsilon{row,col}(2)=temp;
   val = get(handle(14),'Value');
     if val == 1
         temp1=['(' qfdenc{row,col} ')'];
			if strcmp(qfnum{row,col},'') | strcmp(qfden{row,col},'')
			 	qf{row,col}='';
			else
				qf{row,col}=[qfden{row,col} '/' temp1];
			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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         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
            [qd{row,col},qdnum{row,col},qdden{row,col}]=qd_mat(Tcanc(2,:),mq,...
               Epsilon{row,col}(2),F_order{1},y);
         end
			temp1=strrep(qd{row,col},'e',num2str(Epsilon{row,col}(2)));
     elseif val == 2
        temp1='1';
        qd{row,col}='1';
        qdnum{row,col}=[1];
        qdden{row,col}=[1];
     elseif val == 3
         %user defined qd calculation
         temp1='?';
     end
     set(handle(12), 'String',temp1);
	temp=strrep(qfdenc{row,col},'e',num2str(Epsilon{row,col}(2)));
	set(handle(10),'String',temp);

end
   
case (3 + 2500)
   if maxrow >1
      Epsilon{2}=str2num(get(E_handle,'String'));
      order=str2num(get(order_handle,'String'));
      if length(order) < maxcol | length(Epsilon{2}) < maxcol
         errordlg('Size of the order or the filter time constant mismatch!');
      else
         close;
         [Ksp,K,Kdelay,Kspstr,Kstr,Ds,Dstr]=msfgainM(q,order,Epsilon{2},qdeadmt,qnummt,qdenmt,y);
         clear E_handle order_handle
         delete(diag_handle(ishandle(diag_handle))); [diag_handle]=showmsf2dfdiag(main_fig,maxrow,maxcol,...
            p,pd,m,Kspstr,d_through_p,input_delay,Kstr,Dstr,qd,prefilcal(Epsilon,order,order),Epsilon);      
         view_MIMO_MSF;
      end
   else
      temp=['(' qfdenc{row,col} ')'];
      if strcmp(qfnum{row,col},'') | strcmp(qfden{row,col},'')
         qf{row,col}='';
      else
         qf{row,col}=[qfden{row,col} '/' temp];
      end
      close
   end
   

end

⌨️ 快捷键说明

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