📄 cbackm.m
字号:
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 + -