my_sfunxy.m
上传用户:asli888
上传日期:2013-05-03
资源大小:7045k
文件大小:12k
源码类别:

matlab例程

开发平台:

Matlab

  1. function [sys, x0, str, ts] = my_sfunxy(t,x,u,flag,ax,refresh,style,varargin)
  2. %SFUNXY S-function that acts as an X-Y scope using MATLAB plotting functions.
  3. %   This M-file is designed to be used in a Simulink S-function block.
  4. %   It draws a line from the previous input point, which is stored using
  5. %   discrete states, and the current point.  It then stores the current
  6. %   point for use in the next invocation.
  7. %
  8. %   See also SFUNXYS, LORENZS.
  9. %   Copyright (c) 1990-1998 by The MathWorks, Inc. All Rights Reserved.
  10. %   $Revision: 1.34 $
  11. %   Andrew Grace 5-30-91.
  12. %   Revised Wes Wang 4-28-93, 8-17-93, 12-15-93
  13. %   Revised Craig Santos 10-28-96
  14. switch flag
  15.   %%%%%%%%%%%%%%%%%%
  16.   % Initialization %
  17.   %%%%%%%%%%%%%%%%%%
  18.   case 0
  19.     [sys,x0,str,ts] = mdlInitializeSizes(ax,refresh,style,varargin{:});
  20.     SetBlockCallbacks(gcbh);
  21.   %%%%%%%%%%
  22.   % Update %
  23.   %%%%%%%%%%
  24.   case 2
  25.     sys = mdlUpdate(t,x,u,flag,ax,refresh,style,varargin{:});
  26.   %%%%%%%%%
  27.   % Start %
  28.   %%%%%%%%%
  29.   case 'Start'
  30.     LocalBlockStartFcn
  31.   %%%%%%%%
  32.   % Stop %
  33.   %%%%%%%%
  34.   case 'Stop'
  35.     LocalBlockStopFcn
  36.   %%%%%%%%%%%%%%
  37.   % NameChange %
  38.   %%%%%%%%%%%%%%
  39.   case 'NameChange'
  40.     LocalBlockNameChangeFcn
  41.   %%%%%%%%%%%%%%%%%%%%%%%%
  42.   % CopyBlock, LoadBlock %
  43.   %%%%%%%%%%%%%%%%%%%%%%%%
  44.   case { 'CopyBlock', 'LoadBlock' }
  45.     LocalBlockLoadCopyFcn
  46.   %%%%%%%%%%%%%%%
  47.   % DeleteBlock %
  48.   %%%%%%%%%%%%%%%
  49.   case 'DeleteBlock'
  50.     LocalBlockDeleteFcn
  51.   %%%%%%%%%%%%%%%%
  52.   % DeleteFigure %
  53.   %%%%%%%%%%%%%%%%
  54.   case 'DeleteFigure'
  55.     LocalFigureDeleteFcn
  56.   %%%%%%%%%%%%%%%%
  57.   % Unused flags %
  58.   %%%%%%%%%%%%%%%%
  59.   case { 3, 9 }
  60.     sys = [];
  61.   %%%%%%%%%%%%%%%%%%%%
  62.   % Unexpected flags %
  63.   %%%%%%%%%%%%%%%%%%%%
  64.   otherwise
  65.     if ischar(flag),
  66.       errmsg=sprintf('Unhandled flag: ''%s''', flag);
  67.     else
  68.       errmsg=sprintf('Unhandled flag: %d', flag);
  69.     end
  70.     error(errmsg);
  71. end
  72. % end sfunxy
  73. %
  74. %=============================================================================
  75. % mdlInitializeSizes
  76. % Return the sizes, initial conditions, and sample times for the S-function.
  77. %=============================================================================
  78. %
  79. function [sys,x0,str,ts] = mdlInitializeSizes(ax,refresh,style,varargin)
  80. if length (ax)~=4
  81.   error(['Axes limits must be defined.'])
  82. end
  83. sizes = simsizes;
  84. sizes.NumContStates  = 0;
  85. sizes.NumDiscStates  = 1;
  86. sizes.NumOutputs     = 0;
  87. sizes.NumInputs      = 2;
  88. sizes.DirFeedthrough = 0;
  89. sizes.NumSampleTimes = 1;
  90. sys = simsizes(sizes);
  91. x0 = [0];
  92. str = [];
  93. %
  94. % initialize the array of sample times, note that in earlier
  95. % versions of this scope, a sample time was not one of the input
  96. % arguments, the varargs checks for this and if not present, assigns
  97. % the sample time to -1 (inherited)
  98. %
  99. if ~isempty(varargin) > 0
  100.   ts = [varargin{1} 0];
  101. else
  102.   ts = [-1 0];
  103. end
  104. % end mdlInitializeSizes
  105. %
  106. %=============================================================================
  107. % mdlUpdate
  108. % Handle discrete state updates, sample time hits, and major time step
  109. % requirements.
  110. %=============================================================================
  111. %
  112. function sys=mdlUpdate(t,x,u,flag,ax,refresh,style,varargin)
  113. %
  114. % always return empty, there are no states...
  115. %
  116. sys = x+1;
  117. %
  118. % Locate the figure window associated with this block.  If it's not a valid
  119. % handle (it may have been closed by the user), then return.
  120. %
  121. FigHandle=GetSfunXYFigure(gcbh);
  122. if ~ishandle(FigHandle),
  123.    return
  124. end
  125. %
  126. % Get UserData of the figure.
  127. %
  128. ud = get(FigHandle,'UserData');
  129. if isempty(ud.XData),
  130.   x_data = [u(1) u(1)];
  131.   y_data = [u(2) u(2)];
  132. else
  133.   x_data = [ud.XData(end) u(1)];
  134.   y_data = [ud.YData(end) u(2)];
  135. end
  136. % plot the input lines
  137. set(ud.XYAxes, ...
  138.     'Visible','on',...
  139.     'Xlim', ax(1:2),...
  140.     'Ylim', ax(3:4));
  141. set(ud.XYLine,...
  142.     'Xdata',x_data,...
  143.     'Ydata',y_data,...
  144.     'LineStyle',style);
  145. set(ud.XYTitle,'String','X Y Plot');
  146. set(FigHandle,'Color',get(FigHandle,'Color'));
  147. %
  148. % update the X/Y stored data points
  149. %
  150. ud.XData(end+1) = u(1);
  151. ud.YData(end+1) = u(2);
  152. set(FigHandle,'UserData',ud);
  153. drawnow;
  154. if rem(x,refresh)==0
  155.    LocalBlockStartFcn; % refresh over 'refresh' counts 
  156. end
  157. % end mdlUpdate
  158. %
  159. %=============================================================================
  160. % LocalBlockStartFcn
  161. % Function that is called when the simulation starts.  Initialize the
  162. % XY Graph scope figure.
  163. %=============================================================================
  164. %
  165. function LocalBlockStartFcn
  166. %
  167. % get the figure associated with this block, create a figure if it doesn't
  168. % exist
  169. %
  170. FigHandle = GetSfunXYFigure(gcbh);
  171. if ~ishandle(FigHandle),
  172.   FigHandle = CreateSfunXYFigure;
  173. end
  174. ud = get(FigHandle,'UserData');
  175. set(ud.XYLine,'Erasemode','normal');
  176. set(ud.XYLine,'XData',[],'YData',[]);
  177. set(ud.XYLine,'XData',0,'YData',0,'Erasemode','none');
  178. ud.XData = [];
  179. ud.YData = [];
  180. set(FigHandle,'UserData',ud);
  181. % end LocalBlockStartFcn
  182. %
  183. %=============================================================================
  184. % LocalBlockStopFcn
  185. % At the end of the simulation, set the line's X and Y data to contain
  186. % the complete set of points that were acquire during the simulation.
  187. % Recall that during the simulation, the lines are only small segments from
  188. % the last time step to the current one.
  189. %=============================================================================
  190. %
  191. function LocalBlockStopFcn
  192. FigHandle=GetSfunXYFigure(gcbh);
  193. if ishandle(FigHandle),
  194.   %
  195.   % Get UserData of the figure.
  196.   %
  197.   ud = get(FigHandle,'UserData');
  198.   set(ud.XYLine,...
  199.       'Xdata',ud.XData,...
  200.       'Ydata',ud.YData,...
  201.       'LineStyle',style);
  202. end
  203. % end LocalBlockStopFcn
  204. %
  205. %=============================================================================
  206. % LocalBlockNameChangeFcn
  207. % Function that handles name changes on the Graph scope block.
  208. %=============================================================================
  209. %
  210. function LocalBlockNameChangeFcn
  211. %
  212. % get the figure associated with this block, if it's valid, change
  213. % the name of the figure
  214. %
  215. FigHandle = GetSfunXYFigure(gcbh);
  216. if ishandle(FigHandle),
  217.   set(FigHandle,'Name',get_param(gcbh,'Name'));
  218. end
  219. % end LocalBlockNameChangeFcn
  220. %
  221. %=============================================================================
  222. % LocalBlockLoadCopyFcn
  223. % This is the XYGraph block's LoadFcn and CopyFcn.  Initialize the block's
  224. % UserData such that a figure is not associated with the block.
  225. %=============================================================================
  226. %
  227. function LocalBlockLoadCopyFcn
  228. SetSfunXYFigure(gcbh,-1);
  229. % end LocalBlockLoadCopyFcn
  230. %
  231. %=============================================================================
  232. % LocalBlockDeleteFcn
  233. % This is the XY Graph block'DeleteFcn.  Delete the block's figure window,
  234. % if present, upon deletion of the block.
  235. %=============================================================================
  236. %
  237. function LocalBlockDeleteFcn
  238. %
  239. % Get the figure handle associated with the block, if it exists, delete
  240. % the figure.
  241. %
  242. FigHandle=GetSfunXYFigure(gcbh);
  243. if ishandle(FigHandle),
  244.   delete(FigHandle);
  245.   SetSfunXYFigure(gcbh,-1);
  246. end
  247. % end LocalBlockDeleteFcn
  248. %
  249. %=============================================================================
  250. % LocalFigureDeleteFcn
  251. % This is the XY Graph figure window's DeleteFcn.  The figure window is
  252. % being deleted, update the XY Graph block's UserData to reflect the change.
  253. %=============================================================================
  254. %
  255. function LocalFigureDeleteFcn
  256. %
  257. % Get the block associated with this figure and set it's figure to -1
  258. %
  259. ud=get(gcbf,'UserData');
  260. SetSfunXYFigure(ud.Block,-1)
  261. % end LocalFigureDeleteFcn
  262. %
  263. %=============================================================================
  264. % GetSfunXYFigure
  265. % Retrieves the figure window associated with this S-function XY Graph block
  266. % from the block's parent subsystem's UserData.
  267. %=============================================================================
  268. %
  269. function FigHandle=GetSfunXYFigure(block)
  270. if strcmp(get_param(block,'BlockType'),'S-Function'),
  271.   block=get_param(block,'Parent');
  272. end
  273. FigHandle=get_param(block,'UserData');
  274. if isempty(FigHandle),
  275.   FigHandle=-1;
  276. end
  277. % end GetSfunXYFigure
  278. %
  279. %=============================================================================
  280. % SetSfunXYFigure
  281. % Stores the figure window associated with this S-function XY Graph block
  282. % in the block's parent subsystem's UserData.
  283. %=============================================================================
  284. %
  285. function SetSfunXYFigure(block,FigHandle)
  286. if strcmp(get_param(bdroot,'BlockDiagramType'),'model'),
  287.   if strcmp(get_param(block,'BlockType'),'S-Function'),
  288.     block=get_param(block,'Parent');
  289.   end
  290.   set_param(block,'UserData',FigHandle);
  291. end
  292. % end SetSfunXYFigure
  293. %
  294. %=============================================================================
  295. % CreateSfunXYFigure
  296. % Creates the figure window associated with this S-function XY Graph block.
  297. %=============================================================================
  298. %
  299. function FigHandle=CreateSfunXYFigure
  300. %
  301. % the figure doesn't exist, create one
  302. %
  303. FigHandle = figure('Units',          'pixel',...
  304.                    'Position',       [100 100 400 300],...
  305.                    'Name',           get_param(gcbh,'Name'),...
  306.                    'Tag',            'SIMULINK_XYGRAPH_FIGURE',...
  307.                    'NumberTitle',    'off',...
  308.                    'IntegerHandle',  'off',...
  309.                    'Toolbar',        'none',...
  310.                    'Menubar',        'none',...
  311.                    'DeleteFcn',      'sfunxy([],[],[],''DeleteFigure'')');
  312. %
  313. % store the block's handle in the figure's UserData
  314. %
  315. ud.Block=gcbh;
  316. %
  317. % create various objects in the figure
  318. %
  319. ud.XYAxes   = axes;
  320. ud.XYLine   = plot(0,0,'EraseMode','None');
  321. ud.XYXlabel = xlabel('X Axis');
  322. ud.XYYlabel = ylabel('Y Axis');
  323. ud.XYTitle  = get(ud.XYAxes,'Title');
  324. ud.XData    = [];
  325. ud.YData    = [];
  326. set(ud.XYAxes,'Visible','off');
  327. %
  328. % Associate the figure with the block, and set the figure's UserData.
  329. %
  330. SetSfunXYFigure(gcbh,FigHandle);
  331. set(FigHandle,'HandleVisibility','callback','UserData',ud);
  332. % end CreateSfunXYFigure
  333. %
  334. %=============================================================================
  335. % SetBlockCallbacks
  336. % This sets the callbacks of the block if it is not a reference.
  337. %=============================================================================
  338. %
  339. function SetBlockCallbacks(block)
  340. %
  341. % the actual source of the block is the parent subsystem
  342. %
  343. block=get_param(block,'Parent');
  344. %
  345. % if the block isn't linked, issue a warning, and then set the callbacks
  346. % for the block so that it has the proper operation
  347. %
  348. if strcmp(get_param(block,'LinkStatus'),'none'),
  349.   warnmsg=sprintf(['The XY Graph scope ''%s'' should be replaced with a ' ...
  350.                    'new version from the Simulink block library'],...
  351.                    block);
  352.   %warning(warnmsg);
  353.   callbacks={
  354.     'CopyFcn',       'sfunxy([],[],[],''CopyBlock'')' ;
  355.     'DeleteFcn',     'sfunxy([],[],[],''DeleteBlock'')' ;
  356.     'LoadFcn',       'sfunxy([],[],[],''LoadBlock'')' ;
  357.     'StartFcn',      'sfunxy([],[],[],''Start'')' ;
  358.     'StopFcn'        'sfunxy([],[],[],''Stop'')' 
  359.     'NameChangeFcn', 'sfunxy([],[],[],''NameChange'')' ;
  360.   };
  361.   for i=1:length(callbacks),
  362.     if ~strcmp(get_param(block,callbacks{i,1}),callbacks{i,2}),
  363.       set_param(block,callbacks{i,1},callbacks{i,2})
  364.     end
  365.   end
  366. end
  367. % end SetBlockCallbacks