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

📄 casecader.m

📁 华东理工大学自动化系《控制系统分析、设计和应用》教材配套程序实例,有关说明: 1. 安装MATLAB软件。安装时
💻 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 + -