📄 ball_anim.m
字号:
function [sys,x0,str,ts] = ball_anim(t,x,u,flag)
% Plots every major integration step, but has no states of its own
switch flag,
%%%%%%%%%%%%%%%%%%
% Initialization %
%%%%%%%%%%%%%%%%%%
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
%%%%%%%%%%
% Update %
%%%%%%%%%%
case 2,
sys=mdlUpdate(t,x,u);
%%%%%%%%%%%%%%%%
% Unused flags %
%%%%%%%%%%%%%%%%
case { 1, 3, 4, 9 },
sys = [];
%%%%%%%%%%%%%%%
% DeleteBlock %
%%%%%%%%%%%%%%%
case 'DeleteBlock',
LocalDeleteBlock
%%%%%%%%%%%%%%%
% DeleteFigure %
%%%%%%%%%%%%%%%
case 'DeleteFigure',
LocalDeleteFigure
%%%%%%%%%
% Close %
%%%%%%%%%
case 'Close',
LocalClose
%%%%%%%%%%%%%%%%%%%%
% Unexpected flags %
%%%%%%%%%%%%%%%%%%%%
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
% end main s-func
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts]=mdlInitializeSizes
%
% call simsizes for a sizes structure, fill it in and convert it to a
% sizes array.
%
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 0;
sizes.NumInputs = 4;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
%
% initialize the initial conditions
%
x0 = [];
%
% str is always an empty matrix
%
str = [];
%
% initialize the array of sample times,
% the animation is updated every 0.1 seconds
%
ts = [0.1 0];
%
% create the figure, if necessary
%
LocalPendInit;
% end mdlInitializeSizes
%
%=============================================================================
% mdlUpdate
% Update the pendulum animation.
%=============================================================================
%
function sys=mdlUpdate(t,x,u)
fig = get_param(gcbh,'UserData');
if ishandle(fig),
if strcmp(get(fig,'Visible'),'on'),
ud = get(fig,'UserData');
LocalPendSets(t,ud,u);
end
end;
sys = [];
% end mdlUpdate
%
%=============================================================================
% LocalDeleteBlock
% The animation block is being deleted, delete the associated figure.
%=============================================================================
%
function LocalDeleteBlock
fig = get_param(gcbh,'UserData');
if ishandle(fig),
delete(fig);
set_param(gcbh,'UserData',-1)
end
% end LocalDeleteBlock
%
%=============================================================================
% LocalDeleteFigure
% The animation figure is being deleted, set the S-function UserData to -1.
%=============================================================================
%
function LocalDeleteFigure
ud = get(gcbf,'UserData');
set_param(ud.Block,'UserData',-1);
% end LocalDeleteFigure
%
%
%=============================================================================
% LocalClose
% The callback function for the animation window close button. Delete
% the animation figure window.
%=============================================================================
%
function LocalClose
delete(gcbf)
% end LocalClose
%
%=============================================================================
% LocalPendSets
% Local function to set the position of the graphics objects in the
% inverted pendulum animation window.
%=============================================================================
%
function LocalPendSets(time,ud,u)
XDelta = 0.5;
PDelta = 0.2;
set(ud.Cart,...
'XData',ones(2,1)*[u(1)-XDelta u(1)+XDelta]);
set(ud.ObsA,...
'XData',ones(2,1)*[u(2)-XDelta u(2)+XDelta]);
set(ud.ObsB,...
'XData',ones(2,1)*[u(3)-XDelta u(3)+XDelta]);
set(ud.ObsC,...
'XData',ones(2,1)*[u(4)-XDelta u(4)+XDelta]);
% Force plot to be drawn
pause(0)
drawnow
% end LocalPendSets
%
%=============================================================================
% LocalPendInit
% Local function to initialize the pendulum animation. If the animation
% window already exists, it is brought to the front. Otherwise, a new
% figure window is created.
%=============================================================================
%
function LocalPendInit
%
% The name of the reference is derived from the name of the
% subsystem block that owns the pendulum animation S-function block.
% This subsystem is the current system and is assumed to be the same
% layer at which the reference block resides.
%
sys = get_param(gcs,'Parent');
XCart = 0;
XDelta = 0.5;
%
% The animation figure handle is stored in the pendulum block's UserData.
% If it exists, initialize the reference mark, time, cart, and pendulum
% positions/strings/etc.
%
Fig = get_param(gcbh,'UserData');
if ishandle(Fig),
FigUD = get(Fig,'UserData');
set(FigUD.Cart,...
'XData',ones(2,1)*[XCart-XDelta XCart+XDelta]);
%
% bring it to the front
%
figure(Fig);
return
end
%
% the animation figure doesn't exist, create a new one and store its
% handle in the animation block's UserData
%
FigureName = 'Ball demo';
Fig = figure(...
'Units', 'pixel',...
'Position', [100 100 1000 300],...
'Name', FigureName,...
'NumberTitle', 'off',...
'IntegerHandle', 'off',...
'HandleVisibility','callback',...
'Resize', 'off',...
'DeleteFcn', 'pendan([],[],[],''DeleteFigure'')',...
'CloseRequestFcn', 'pendan([],[],[],''Close'');');
AxesH = axes(...
'Parent', Fig,...
'Units', 'pixel',...
'Position',[50 50 850 200],...
'CLim', [1 64], ...
'Xlim', [-12 12],...
'Ylim', [-2 10],...
'Visible', 'off');
Cart = surface(...
'Parent', AxesH,...
'XData', ones(2,1)*[XCart-XDelta XCart+XDelta],...
'YData', [0 0; -2 -2],...
'ZData', zeros(2),...
'CData', ones(2),...
'EraseMode','xor');
ObsA = surface(...
'Parent', AxesH,...
'XData', ones(2,1)*[XCart-XDelta XCart+XDelta],...
'YData', [4 4; 2 2],...
'ZData', zeros(2),...
'CData', ones(2),...
'EraseMode','xor');
ObsB = surface(...
'Parent', AxesH,...
'XData', ones(2,1)*[XCart-XDelta XCart+XDelta],...
'YData', [7 7; 5 5],...
'ZData', zeros(2),...
'CData', ones(2),...
'EraseMode','xor');
ObsC = surface(...
'Parent', AxesH,...
'XData', ones(2,1)*[XCart-XDelta XCart+XDelta],...
'YData', [10 10; 8 8],...
'ZData', zeros(2),...
'CData', ones(2),...
'EraseMode','xor');
uicontrol(...
'Parent', Fig,...
'Style', 'pushbutton',...
'Position',[415 15 70 20],...
'String', 'Close', ...
'Callback','pendan([],[],[],''Close'');');
%
% all the HG objects are created, store them into the Figure's UserData
%
FigUD.Cart = Cart;
FigUD.ObsA = ObsA;
FigUD.ObsB = ObsB;
FigUD.ObsC = ObsC;
FigUD.Block = get_param(gcbh,'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(gcbh,'UserData',Fig);
% end LocalPendInit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -