?? cnf_diagram.m
字號:
function cnf_diagram(AxeHandle,Action)
%
% create the block diagram for the whole system, the plant, and the controller.
%
% Initialise plot
ax = AxeHandle;
% delete(allchild(ax));
% check the display resolution
set(0,'Units','pixels')
sz=get(0,'Screensize');
if sz(3) <=800 % [1 1 800 600]
smallfont=1;
else
smallfont=0;
end
set(0,'Units','normalized');
switch Action
case 'All'
% Display the whole system
% for the Controller
x0 = 2.5;
y0 = 1;
wire('x',x0+[0 1], 'y',y0+0.5+[0 0],'parent',ax);
sysblock('position',[x0+1 y0-0.2 2 1.2], 'name',upper('Controller'),...
'fontweight','bold','facecolor','w','fontsize',8-smallfont*2,'parent',ax,'ButtonDownFcn','cnf_set(''con'', gca)' );
wire('x',x0+[4 3], 'y',y0+[0.7 0.7],'parent',ax,'arrow',0.2);
wire('x',x0+[4 3], 'y',y0+[0.1 0.1],'parent',ax,'arrow',0.2);
% for the Plant
sysblock('position',[x0+1 y0+2 2 1.2],'name',upper('Plant'),...
'fontweight','bold','facecolor','w','fontsize',10-smallfont*3,'parent',ax,'ButtonDownFcn','cnf_set(''sys'', gca)' );
wire('x',x0+[0 1],'y',y0+2.9+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[0 1],'y',y0+2.3+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[0 0],'y',y0+[2.3 0.5],'parent',ax);
wire('x',x0+[3 4],'y',y0+2.9+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[3 4],'y',y0+2.3+[0 0],'parent',ax);
wire('x',x0+4+[0 0],'y',y0+[2.3 0.7],'parent',ax);
% the message
text(x0-0.2 ,y0+2.9, upper('disturbance'),'horiz','right','fontweight','normal','fontsize',8-smallfont,'parent',ax);
text(x0-0.3 ,y0+0.5, upper('control'),'horiz','right','fontweight','normal','fontsize',8-smallfont,'parent',ax);
text(x0+4.2 ,y0+2.9, upper('controlled output'),'horiz','left','fontweight','normal','fontsize',8-smallfont,'parent',ax);
text(x0+4.3 ,y0+1.5, upper('measurement'),'horiz','left','fontweight','normal','fontsize',8-smallfont,'parent',ax);
text(x0+4.2 ,y0+0.1, upper('target reference'),'horiz','left','fontweight','normal','fontsize',8-smallfont,'parent',ax);
case 'Sys'
% Display the plant model
y0 = 0.5; x0 = 0.2;
% for the plant block
sysblock('position',[x0+1 y0 2 2],'name','with or without',...
'fontweight','bold','facecolor','w','fontsize',12,'parent',ax );
text(x0+2 ,y0+1.5, 'Nominal Plant', 'horiz','center','fontweight','bold','fontsize',12,'parent',ax);
text(x0+2 ,y0+0.5, 'Resonance', 'horiz','center','fontweight','bold','fontsize',12,'parent',ax);
wire('x',x0+[0 1],'y',y0+0.5+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[0 1],'y',y0+1.5+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[3 3.7],'y',y0+0.5+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[3 3.7],'y',y0+1.5+[0 0],'parent',ax,'arrow',0.2);
text(x0+0.5 ,y0+1.7, 'w ','horiz','right','fontweight','normal','fontsize',10,'parent',ax);
text(x0+0.5 ,y0+0.3, 'u ','horiz','right','fontweight','normal','fontsize',10,'parent',ax);
text(x0+3.5 ,y0+1.7, 'h ','horiz','right','fontweight','normal','fontsize',10,'parent',ax);
text(x0+3.5 ,y0+0.3, 'y ','horiz','right','fontweight','normal','fontsize',10,'parent',ax);
% display the model equation
% text(x0+5 ,y0+1, '{\{} ','horiz','right','fontweight','light','fontsize',30+2*isunix,'parent',ax);
% text(x0+4.5 ,y0+1, 'Model:','horiz','right','fontweight','light','color','b','fontsize',10+2*isunix,'parent',ax);
% text(x0+5 ,y0+1.7, '. ','horiz','right','fontweight','bold','fontsize',11+2*isunix,'parent',ax);
% text(x0+4.8 ,y0+0.95, {'X =A X+B sat(u)+E w+N f_n(C_n X) ','y =C_1 X','h =C_2 X'}, 'horiz','left','fontweight','normal','fontsize',9+2*isunix,'parent',ax);
case 'Con'
% Display the Controller structure
gdb=get(ax,'UserData');
delete(allchild(ax));
y0 = 0.2; x0 = 0.5;
wire('x',x0+[9 5.1],'y',y0+0.25+[0 0],'parent',ax,'arrow',0.2);
sysblock('position',[x0+5 y0 0.5*0.1 2.6],'name','',...
'fontweight','normal','facecolor','w','fontsize',8, 'parent',ax );
% sysblock('position',[x0+6 y0+0.7 0.5 1.2],...
% 'Numerator','1',...
% 'Denominator','s',...
% 'fontweight','normal','facecolor','c','fontsize',8,'parent',ax,'ButtonDownFcn','cnf_set(''con'', gcf)' );
% CNF linear block
sysblock('position',[x0+3 y0+1 1.5 0.6],'name',{'CNF Linear', 'Feedback'},...
'fontweight','normal','facecolor','w','fontsize',7,'parent',ax);
wire('x',x0+[5 4.5],'y',y0+1.3+[0 0],'parent',ax,'arrow',0.2);
% CNF nonlinear block
CNF=gdb(2);
if CNF==1
sysblock('position',[x0+3 y0 1.5 0.6],'name',{'CNF Nonlinear','Feedback'},...
'fontweight','normal','facecolor','w','fontsize',7,'parent',ax);
wire('x',x0+[5 4.5],'y',y0+0.25+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[3 2.5-0.25],'y',y0+0.25+[0 0],'parent',ax);
wire('x',x0+2.5-0.25+[0 0],'y',y0+[0.25 1.3-0.25],'parent',ax,'arrow',0.2);
end
% Nonlinearity Compensation block
NC=gdb(3);
if NC==1
sysblock('position',[x0+3 y0+2 1.5 0.6],'name',{'Nonlinearity','Pre-compensation'},...
'fontweight','normal','facecolor','w','fontsize',7,'parent',ax);
wire('x',x0+[5 4.5],'y',y0+0.25+0.7*3+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[3 2.5-0.25],'y',y0+0.25+0.7*3+[0 0],'parent',ax);
wire('x',x0+2.5-0.25+[0 0],'y',y0+[2.35 1.3+0.25],'parent',ax,'arrow',0.2);
end
% Integral block
IC=gdb(1);
if IC==1
sysblock('position',[x0+6-0.25 y0+1.3-0.25 1.0 0.5], 'name','Integral',...
'fontweight','normal','facecolor','w','fontsize',8,'parent',ax);
sumblock('position',[x0+7.5,y0+1.3],'label',{'-320','+40'},'radius',0.25, 'Showsum',1,...
'LabelRadius',0.4,'fontsize',12,'parent',ax);
wire('x',x0+[7.25 6.5+0.25],'y',y0+1.3+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[6-0.25 5.1],'y',y0+1.3+[0 0],'parent',ax,'arrow',0.2);
wire('x',x0+[7.5 7.5],'y',y0+[0.25+0.7*3 1.3+0.25],'parent',ax,'arrow',0.2);
wire('x',x0+[7.5 7.5],'y',y0+[0.25 1.3-0.25],'parent',ax,'arrow',0.2);
end
% Observer block
OV=gdb(4);
if OV==0
wire('x',x0+[9 6.75],'y',y0+0.25+0.7*3+[0 0],'parent',ax,'arrow',0.2);
sysblock('position',[x0+5.75 y0+0.7*3 1.0 0.5],'name','Observer',...
'fontweight','normal','facecolor','w','fontsize',8,'parent',ax );
wire('x',x0+[5.75 5.1],'y',y0+0.25+0.7*3+[0 0],'parent',ax,'arrow',0.2);
else
wire('x',x0+[9 5.1],'y',y0+0.25+0.7*3+[0 0],'parent',ax,'arrow',0.2);
end
% Sum block
if CNF==1 | NC==1
wire('x',x0+[3 2.5],'y',y0+1.3+[0 0],'parent',ax,'arrow',0.2);
sumblock('position',[x0+2.25,y0+1.3],'radius',0.25, 'Showsum',1,'label',{'+320','+40'}, ...
'LabelRadius',0.4,'fontsize',10, 'parent',ax);
wire('x',x0+[2 0],'y',y0+1.3+[0 0],'parent',ax,'arrow',0.2);
else
wire('x',x0+[3 0],'y',y0+1.3+[0 0],'parent',ax,'arrow',0.2);
end
% Filter
FT=gdb(5);
if FT==1
sysblock('position',[x0+0.7 y0+1 0.8 0.6],'name','Filter',...
'fontweight','normal','facecolor','w','fontsize',8,'parent',ax );
end
text(x0+9.3, y0+0.3, 'r ','horiz','right','fontweight','normal','fontsize', 16-2*smallfont,'parent',ax);
text(x0+9.6, y0+2.5, '(y,h) ','horiz','right','fontweight','normal','fontsize',14-smallfont,'parent',ax);
text(x0, y0+1.3, 'u ','horiz','right','fontweight','normal','fontsize',16-2*smallfont,'parent',ax);
% end switch
end
% ---------------------------------------------
function wire(varargin)
% WIRE: Draw a wire
% Copyright 1986-2002 The MathWorks, Inc.
%---Default properties
p = struct(...
'Parent',[],...
'XData',[1 2],...
'YData',[1 1],...
'LineWidth',2,...
'LineStyle','-',...
'Color','k',...
'FontSize',12,...
'FontWeight','normal',...
'Name','',...
'ArrowSize',0,...
'Tag','',...
'Clipping','off');
plist = fieldnames(p);
%---Merge user-specified properties
for i=1:2:nargin-1
Property = pnmatch(varargin{i},plist);
Value = varargin{i+1};
p.(Property) = Value;
end
if isempty(p.Parent), p.Parent = gca; end
%---Draw a line
h=line(...
'Parent',p.Parent,...
'XData',p.XData,...
'YData',p.YData,...
'LineWidth',p.LineWidth,...
'LineStyle',p.LineStyle,...
'Color',p.Color,...
'Tag',p.Tag,...
'Clipping',p.Clipping);
%---Draw arrow head if requested
if p.ArrowSize>0
x = p.XData;
y = p.YData;
a0 = angle((x(end)-x(end-1))+j*(y(end)-y(end-1))); % angle of last line segment
hr = p.ArrowSize; % head radius
ha = pi+[-.5 .5]; % head angles
patch(...
'Parent',p.Parent,...
'XData',x(end)+[0 hr.*cos(a0+ha) 0],...
'YData',y(end)+[0 hr.*sin(a0+ha) 0],...
'EdgeColor',p.Color,...
'FaceColor',p.Color,...
'Tag',p.Tag,...
'Clipping',p.Clipping);
%---Adjust last segment of line so that it ends inside the arrowhead
lr = sqrt((x(end)-x(end-1))^2 + (y(end)-y(end-1))^2);
x(end) = x(end)-hr/2*cos(a0);
y(end) = y(end)-hr/2*sin(a0);
set(h,'XData',x,'YData',y);
end
% ---------------------------------------------
function sysblock(varargin)
% SYSBLOCK: Draw a system block
% Copyright 1986-2002 The MathWorks, Inc.
%---Default properties
p = struct(...
'Parent',[],...
'Position',[1 1 3 2],...
'LineStyle','-',...
'LineWidth',2,...
'EdgeColor','k',...
'FaceColor','w',...
'Curvature',[0 0],...
'FontName','',...
'FontSize',12,...
'FontWeight','normal',...
'NameFontName','',...
'NameFontSize',[],...
'NameFontWeight','',...
'Name','',...
'Gain','',...
'Numerator','',...
'Denominator','',...
'Bracket',0,...
'Sigma',0,...
'SigmaBounds',{{'',''}},...
'Interpreter','tex',...
'Tag','',...
'Clipping','off',...
'ButtonDownFcn','');
plist = fieldnames(p);
%---Merge user-specified properties
for i=1:2:nargin-1
Property = pnmatch(varargin{i},plist);
Value = varargin{i+1};
p.(Property) = Value;
end
if isempty(p.Parent), p.Parent = gca; end
if isempty(p.FontName), p.FontName = get(p.Parent,'DefaultTextFontName'); end
if isempty(p.NameFontName), p.NameFontName = p.FontName; end
if isempty(p.NameFontSize), p.NameFontSize = p.FontSize; end
if isempty(p.NameFontWeight), p.NameFontWeight = p.FontWeight; end
%---System box
rectangle(...
'Parent',p.Parent,...
'Position',p.Position,...
'LineStyle',p.LineStyle,...
'LineWidth',p.LineWidth,...
'Curvature',p.Curvature,...
'EdgeColor',p.EdgeColor,...
'FaceColor',p.FaceColor,...
'Tag',p.Tag,...
'Clipping',p.Clipping,...
'ButtonDownFcn',p.ButtonDownFcn);
%---Add text
x = p.Position(1)+p.Position(3)/2;
y = p.Position(2)+p.Position(4)/2;
if isempty(p.Numerator)
%---System name only
ty = y;
tv = 'middle';
else
%---Put system name below block
ty = p.Position(2);
tv = 'top';
%---System equation
% equation(...
% 'Parent',p.Parent,...
% 'Position',[x y],...
% 'LineWidth',0.5,...
% 'Color',p.EdgeColor,...
% 'FontName',p.FontName,...
% 'FontSize',p.FontSize,...
% 'FontWeight',p.FontWeight,...
% 'Gain',p.Gain,...
% 'Numerator',p.Numerator,...
% 'Denominator',p.Denominator,...
% 'Anchor','center',...
% 'Bracket',p.Bracket,...
% 'Sigma',p.Sigma,...
% 'SigmaBounds',p.SigmaBounds,...
% 'Interpreter',p.Interpreter,...
% 'Tag',p.Tag,...
% 'Clipping',p.Clipping);
end
%---System name
t = text(...
'Parent',p.Parent,...
'Position',[x ty],...
'String',p.Name,...
'Color',p.EdgeColor,...
'FontName',p.NameFontName,...
'FontSize',p.NameFontSize,...
'FontWeight',p.NameFontWeight,...
'HorizontalAlignment','center',...
'VerticalAlignment',tv,...
'Interpreter',p.Interpreter,...
'Tag',p.Tag,...
'Clipping',p.Clipping,...
'ButtonDownFcn',p.ButtonDownFcn);
if ~isempty(p.Numerator)
ext = get(t,'Extent');
set(t,'Position',[x ty-ext(4)*.3]);
end
% ---------------------------------------------
function sumblock(varargin)
% SUMBLOCK: Draw a sum block
% Copyright 1986-2002 The MathWorks, Inc.
%---Default properties
p = struct(...
'Parent',[],...
'Position',[1 1],...
'Radius',1,...
'LineWidth',2,...
'EdgeColor','k',...
'FaceColor','none',...
'FontSize',12,...
'FontWeight','normal',...
'Label',{{'+145','-235'}},...
'LabelRadius',[],...
'Showsum',0,...
'Tag','',...
'Clipping','off');
plist = fieldnames(p);
%---Merge user-specified properties
for i=1:2:nargin-1
Property = pnmatch(varargin{i},plist);
Value = varargin{i+1};
p.(Property) = Value;
end
if isempty(p.LabelRadius), p.LabelRadius = 2*p.Radius; end
if isempty(p.Parent), p.Parent = gca; end
%---Draw a circle
a = 0:2*pi/100:2*pi;
patch(...
'Parent',p.Parent,...
'XData',p.Position(1)+p.Radius*cos(a),...
'YData',p.Position(2)+p.Radius*sin(a),...
'LineWidth',p.LineWidth,...
'EdgeColor',p.EdgeColor,...
'FaceColor',p.FaceColor,...
'Tag',p.Tag,...
'Clipping',p.Clipping);
%---Draw summation sign if requested
if p.Showsum
r = 0.66*p.Radius*[.8 1 1 0 1 1 .8];
a = pi*[.2 .25 .75 0 1.25 1.75 1.8];
line(...
'Parent',p.Parent,...
'XData',p.Position(1)+r.*cos(a),...
'YData',p.Position(2)+r.*sin(a),...
'LineWidth',p.LineWidth,...
'Color',p.EdgeColor,...
'Tag',p.Tag,...
'Clipping',p.Clipping);
end
%---Add labels (for +/-)
if ~iscell(p.Label), p.Label={p.Label}; end
for n=1:length(p.Label)
L = p.Label{n};
str = L(1);
ang = str2num(L(2:end))*pi/180;
text(...
'Parent',p.Parent,...
'Position',p.Position + p.LabelRadius*[cos(ang) sin(ang)],...
'String',str,...
'FontSize',p.FontSize,...
'FontWeight',p.FontWeight,...
'HorizontalAlignment','center',...
'VerticalAlignment','middle',...
'Tag',p.Tag,...
'Clipping',p.Clipping);
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -