📄 casecader.m
字号:
function [sys,x0,str,ts] = casecader(t,x,u,flag,RefBlock)
% casecader S 函数用于建立串级控制系统的动画演示系统
% 另见: casemdl.mdl.
% Copyright (c) 2001-2002 ECUST.
% $Revision: 1.3
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes(RefBlock);
case 2,
sys=mdlUpdate(t,x,u);
case { 1, 3, 4, 9 },
sys = [];
case 'DeleteBlock',
LocalDeleteBlock
case 'DeleteFigure',
LocalDeleteFigure
case 'Slider',
LocalSlider
case 'Close',
LocalClose
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes(RefBlock)
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 0;
sizes.NumInputs = 4;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [.2 0];
LocalcasecaderInit(RefBlock);
function sys=mdlUpdate(t,x,u)
fig = get_param(gcb,'UserData');
if ishandle(fig),
if strcmp(get(fig,'Visible'),'on'),
ud = get(fig,'UserData');
LocalcasecaderSets(t,ud,u);
end
end;
sys = [];
function LocalDeleteBlock
fig = get_param(gcb,'UserData');
if ishandle(fig),
delete(fig);
set_param(gcb,'UserData',-1)
end
function LocalDeleteFigure
ud = get(gcf,'UserData');set_param(ud.Block,'UserData',-1);
function LocalSlider
ud = get(gcbf,'UserData');set_param(ud.RefBlock,'Value',num2str(get(gcbo,'Value')));
function LocalClose
delete(gcbf)
function LocalcasecaderSets(time,ud,u)
XDelta = .5;
PDelta = 0.2;
XcasecaderTop = u(3) ;
Ytop=300; %Ytop = 8;
Ybottom=151; %Ybottom = -1.4;
PDsinT = -0.5;base=40;kase=100;kb=20;
chang1=135;chang=166;a1=0.15;t1s=290;t2s=285;
set(ud.Cart,'CData',round((u(2)-kase)/kb+base)*ones(2,1));
set(ud.Cart1,'CData',round((u(2)-kase)/kb+base)*ones(2,1));
set(ud.flowpipe,'CData',round((u(2)-kase)/kb+base)*ones(2,1));
set(ud.flowpipe1,'CData',round((u(2)-kase)/kb+base)*ones(2,1));
set(ud.TEMPField,'String',[num2str(round(u(3)*10)/10),' ℃'],'fore','r','fontw','b',...
'pos',[290 380 80 25],'hori','ri');
set(ud.JACKField,'String',[num2str(round(u(2)*10)/10),' ℃'],'fore','b',...
'pos',[150 380 80 25],'hori','ri');
set(ud.casecader,...
'YData',[Ybottom Ytop;Ybottom Ytop],'XData',[8-.17 8-.17;3+.12 3+.12],...
'CData',round((u(3)-kase)/kb+base)*ones(2));
set(ud.TimeField,'String',[num2str(time),' 分'],'hori','ri');
set(ud.RefMark,'YData',u(1)+[-5 0 5]);
set(ud.t1,...
'YData',[t1s t1s;a1*u(3)+t1s a1*u(3)+t1s], 'XData',[6.8 6.95;6.8 6.95],'CData',50);
set(ud.t2,...
'YData',[t2s t2s;a1*u(2)+t2s a1*u(2)+t2s],'XData',[2.3 2.45;2.3 2.45],'CData',50);
if u(3)<0 lll=0;
end;
lll=u(4)*(u(4)<=100 & u(4)>0)+(u(4)>100)*100+(u(4)<=0)*0;al=.15;
set(ud.valve,...
'YData',[al*lll+chang al*lll+chang;al*lll+chang+22 al*lll+chang+22 ],...
'XData',[0.44 .06;.44 .06],'CData',4);
set(ud.valverod,...
'YData',[al*lll+chang+44 al*lll+chang+44;al*lll+chang+22 al*lll+chang+22 ], ...
'XData',[0.3 .2;.3 .2],'CData',1);
set(ud.valvelevel,...
'YData',[al*lll+chang-.09 al*lll+chang-.09;160 160], ...
'XData',[.44 .06; .44 .06],'CData',round((u(2)-kase)/kb+base)*ones(2,1));
set(ud.valveField,'String',[num2str(round(lll*10)/10),' %'],...
'pos',[10 150+al*lll 60 20]);
pause(0)
drawnow
function LocalcasecaderInit(RefBlock)
sys = get_param(gcs,'Parent');
TimeClock = 0;
RefSignal = str2num(get_param([sys '/' RefBlock],'Value'));
Xpos = 0;Theta = 0;XDelta = 1;
PDelta = 0.2;XcasecaderTop=Xpos ; Ytop = 260;Ybottom = 180;
PDcosT = PDelta*cos(Theta);PDsinT = -PDelta*sin(Theta);
Xstart=3;Xend=8;Ystart=150;Yend=300;spacing=1.5;spc=.2;
Xstart1=Xstart-.27;Xend1=Xend+.27;
Fig = get_param(gcb,'UserData');
if ishandle(Fig),
FigUD = get(Fig,'UserData');
set(FigUD.RefMark,'YData',RefSignal+[-5 0 5]);
set(FigUD.TimeField,'String',num2str(TimeClock));
set(FigUD.TEMPField,'String',num2str(RefSignal));
set(FigUD.JACKField,'String',num2str(RefSignal));
set(FigUD.valveField,'String',num2str(RefBlock),'pos',[10 150 60 20]);
set(FigUD.valve,'YData',[125 138;125 138],'XData',[.05 .05;.45 .45]);
set(FigUD.t1, 'YData',[293 293;290 290],'XData',[6.8 6.95;6.8 6.95]);
set(FigUD.t2, 'YData',[285 285;288 288],'XData',[2.45 2.3;2.45 2.3]);
set(FigUD.flowpipe,'YData',[162 183;162 183],'XData',[-2 -2;.04 .04]);
set(FigUD.flowpipe1,'YData',[162 183;162 183],'XData',[1.25 1.25;.46 .46]);
set(FigUD.valverod,'YData',[135 145;135 145], 'XData',[.2 .3;.2 .3]);
set(FigUD.valvelevel,'YData',[155 165;155 165],'XData',[.05 .05;.46 .46]);
set(FigUD.Cart,...
'Xdata',[Xstart1-spacing Xstart1;Xstart1-spacing Xstart1],...
'YData',[Yend-spacing Yend-spacing; Ystart+spacing Ystart+spacing],...
'Cdata',ones(2,1)*35);
set(FigUD.Cart1,...
'XData',[Xend1+spacing Xend1;Xend1+spacing Xend1],...
'YData',[Yend-spacing Yend-spacing; Ystart+spacing Ystart+spacing],...
'Cdata',ones(2,1)*35);
set(FigUD.casecader,...
'YData',[110 310],'XData',[8-.27 8-.27;3+.22 3+.22]);
figure(Fig);
return
end
Xstart=3;Xend=8;Ystart=150;Yend=300;spacing=1.55;spc=.15;
Xstart1=Xstart-.2;Xend1=Xend+.2;
FigureName = '温度串级控制系统演示';
Fig = figure('Units','pixel','Pos',[10 80 560 500],'Name',FigureName,...
'NumberT', 'off','menu','none','Integer','off','HandleV','call',...
'Resize', 'off','DeleteFcn','casecader([],[],[],''DeleteFigure'')',...
'CloseRequestFcn','casecader([],[],[],''Close'');');
AxesH = axes('Parent', Fig,'Units','pixel','Pos',[10 50 500 420],...
'CLim',[1 64], 'Xlim',[-2 14],'Ylim',[140 360],'Visible','off');
SlideControl = uicontrol('Parent',Fig,'Style','slider','Units','pixel', ...
'Pos',[485 60 22 430],'Min',150,'Max',350,'Value',RefSignal,...
'Call', 'casecader([],[],[],''Slider'');');
Reactor1 = line('parent',AxesH,'XData',[Xstart Xstart Xend Xend Xstart],...
'YData',[Yend+10 Ystart Ystart Yend+10 Yend+10],'color',[1 0 0],'linew',[6],...
'EraseMode','xor');
Jack1 = line('parent',AxesH,...
'XData',[Xstart1 Xstart1-spacing-spc Xstart1-spacing-spc Xstart1],...
'YData',[Yend-spacing+spc Yend-spacing+spc Ystart+spacing-spc Ystart+spacing-spc],...
'color',[1 0 1],'linew',[5],'EraseMode','xor');
Jack2 = line('parent',AxesH,'XData',[Xend1 Xend1+spacing+spc Xend1+spacing+spc Xend1],...
'YData',[Yend-spacing+spc Yend-spacing+spc Ystart+spacing-spc Ystart+spacing-spc],...
'color',[1 0 1],'linew',[5],'EraseMode','xor');
AxesH1 = axes('Parent',Fig,'Units','pixel','Pos',[455 50 25 450],...
'CLim',[1 64],'Xlim',[0 1],'Ylim',[130 370],'Visible', 'off');
AxesH2 = axes('Parent',Fig,'Units','pixel','Pos',[458 87 8 376],...
'CLim',[1 64], 'ytick',[150:20:350],'Xlim',[0 0.1],'fonts',14,'fontw','b','ygrid','on',...
'Ylim',[150 350],'XtickMode','manual','Xticklabel',[],...
'xticklabelmode','manual','Visible', 'on');
AxesH3 = axes('Parent',Fig,'Units','pixel','Pos',[277 336 6 114],...
'CLim',[1 64], 'ytick',[0:50:400],'Xlim',[0 0.1],'fonts',14,'fontw','b','ygrid','on',...
'Ylim',[0 400],'XtickMode','manual','Xticklabel',[],...
'xticklabelmode','manual','Visible', 'on');
AxesH4 = axes('Parent',Fig,'Units','pixel','Pos',[137 326 6 128.3],'ycolor','b',...
'CLim',[1 64], 'ytick',[0:50:450],'Xlim',[0 0.1],...
'fonts',14,'fontw','b','ygrid','on','Ylim',[0 450],'XtickMode','manual',...
'Xticklabel',[],'xticklabelmode','manual','Visible', 'on');
flowpipe = surface('Parent',AxesH,'YData',[164 164;183 183],...
'XData',[-2 0.05;-2 0.05],'ZData',zeros(2),'CData',45*ones(2),...
'EraseMode','xor');
flowpipe1 = surface('Parent',AxesH,'YData',[164 164;183 183],...
'XData',[0.44 1.25;0.44 1.25],'ZData',zeros(2),...
'CData',45*ones(2),'EraseMode','xor');
valve = surface('Parent',AxesH,'YData',[125 125;135 135],...
'XData',[0 .5; 0 .5],'ZData',zeros(2),'CData',2*ones(2),'EraseMode','xor');
t1 = surface('Parent',AxesH,'YData',[293 290;293 290],...
'XData',[6.8 6.8;6.95 6.95],'ZData',zeros(2),'CData',50*ones(2),'EraseMode','xor');
t2 = surface('Parent',AxesH,'YData',[288 280;288 280],...
'XData',[2.3 2.45;2.3 2.45],'ZData',zeros(2),'CData',50*ones(2),'EraseMode','xor');
valverod = surface('Parent',AxesH,'YData',[135 135;145 145],...
'XData',[.2 .3;.2 .3],'ZData',zeros(2),'CData',30*ones(2),...
'EraseMode','xor');
valvelevel = surface('Parent',AxesH,'YData',[125 125;135 135],...
'XData',[0 .5;0 .5],'ZData', zeros(2),'CData',45*ones(2),...
'EraseMode','xor');
Cart = surface('Parent',AxesH,...
'YData',[Yend-spacing Yend-spacing; Ystart+spacing Ystart+spacing],...
'XData',[Xstart1-spacing Xstart1;Xstart1-spacing Xstart1],...
'ZData',zeros(2),'CData',ones(2,1)*35,'EraseMode','xor');
Cart1 = surface('Parent',AxesH,...
'YData',[Yend-spacing Yend-spacing; Ystart+spacing Ystart+spacing],...
'XData',[Xend1+spacing Xend1; Xend1+spacing Xend1],...
'ZData',zeros(2),'CData',ones(2,1)*35,'EraseMode','xor');
casecader = surface('Parent',AxesH,...
'YData',[-1.7 XcasecaderTop; -1.7 Xpos],...
'XData',[Ytop-PDsinT Ytop+PDsinT; -PDsinT PDsinT],...
'ZData',zeros(2),'CData',18*ones(2),'EraseMode','xor');
RefMark = patch('Parent',AxesH1,'YData',RefSignal+[-5 0 5],...
'XData',[1 0.5 1],'CData',30);
TEMPField = uicontrol('Parent',Fig,'Sty','te','Units','pixel','Pos',[290 380 80 25], ...
'Hori','ri','back',[.8 .8 .8],'fore','k','Str',num2str(RefSignal),'fonts',[14]);
JACKField = uicontrol('Parent',Fig,'Sty','te','Units','pixel','pos',[150 380 80 25], ...
'Hori','ri','back',[.8 .8 .8],'fore','k','String',num2str(RefSignal),'fonts',[14]);
valveField = uicontrol('Parent',Fig,'Sty','te','Units','pixel','Pos',[10 150 60 20], ...
'Hori','ri','back',[.8 .8 .8],'fore','k',...
'Str',num2str(RefSignal),'fonts',[14]);
% uicontrol('Parent',Fig,'Sty','te','Units','pixel','Position',[0 0 600 50]);
uicontrol('Parent',Fig,'Sty','te','Units','pixel','Pos',[20 5 100 30], ...
'Hori','ce','fontw','b','Str','运行时间: ','fonts',[14]);
uicontrol('Parent',Fig,'Sty','te','Units','pixel','back',[.8 .8 .8],...
'Pos',[60 465 300 30],'Hori','ce','fontw','b','fore','k',...
'Str','反应器温度串级控制演示','fonts',[18]);
uicontrol('Parent',Fig,'Sty','te','Units','pixel','Pos',[515 255 40 20], ...
'back',[.9 .9 .9],'fore','r','Hori','le','fontw','b',...
'Str','设定 ','fonts',[14]);
uicontrol('Parent',Fig,'Sty','te','Units','pixel',...
'Pos',[515 275 40 20],'back',[.9 .9 .9],'fore','r',...
'Hori','le','fontw','b','Str','釜温','fonts',[14]);
TimeField = uicontrol('Parent',Fig,'Sty','te','Units','pixel', ...
'Pos',[120 5 100 30],'Hori','le','Str',num2str(TimeClock),'fonts',[14]);
uicontrol('Parent',Fig,'Sty','push','Pos',[450 10 80 30],...
'Str','关 闭','fonts',[14],'fontw','b','Call','casecader([],[],[],''Close'');');
set(RefMark,'EraseMode','xor');
FigUD.Cart = Cart;
FigUD.Cart1 = Cart1;
FigUD.casecader = casecader;
FigUD.flowpipe = flowpipe;
FigUD.flowpipe1 = flowpipe1;
FigUD.TimeField = TimeField;
FigUD.TEMPField = TEMPField;
FigUD.JACKField = JACKField;
FigUD.valve = valve;
FigUD.t1 = t1;
FigUD.t2 = t2;
FigUD.valverod = valverod;
FigUD.valvelevel = valvelevel;
FigUD.valveField = valveField;
FigUD.SlideControl = SlideControl;
FigUD.RefMark = RefMark;
FigUD.Block = get_param(gcb,'Handle');
FigUD.RefBlock = get_param([sys '/' RefBlock],'Handle');
set(Fig,'UserData',FigUD);
drawnow
% store the figure handle in the animation block's UserData
set_param(gcb,'UserData',Fig);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -