声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5861|回复: 9

[综合讨论] 【分享】如何Simulink的仿真结果实时动态显示到GUI界面(转)

[复制链接]
发表于 2014-3-20 19:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 牛小贱 于 2014-4-2 16:43 编辑

关于Simulink与GUI连接,数据传递,动态显示之类的问题,想和大家分享一下!!
Simulink模型仿真时,完成下列动作:
1.自动创建Figure和axes以及text控件
2.将当前采样点输出值显示到text中
3.将仿真过程的数据动态绘制到axes上
4.仿真结束Figure自动关闭
5.使用M Level 1 S函数实现
程序代码:

  1. function [sys,x0,str,ts] = gui_plot_sfun(t,x,u,flag)
  2. %
  3. switch flag,
  4.   %%%%%%%%%%%%%%%%%%
  5.   % Initialization %
  6.   %%%%%%%%%%%%%%%%%%
  7.   case 0,
  8.     [sys,x0,str,ts]=mdlInitializeSizes;
  9.   %%%%%%%%%%%%%%%
  10.   % Derivatives %
  11.   %%%%%%%%%%%%%%%
  12.   case 1,
  13.     sys=mdlDerivatives(t,x,u);
  14.   %%%%%%%%%%
  15.   % Update %
  16.   %%%%%%%%%%
  17.   case 2,
  18.     sys=mdlUpdate(t,x,u);
  19.   %%%%%%%%%%%
  20.   % Outputs %
  21.   %%%%%%%%%%%
  22.   case 3,
  23.     sys=mdlOutputs(t,x,u);
  24.   %%%%%%%%%%%%%%%%%%%%%%%
  25.   % GetTimeOfNextVarHit %
  26.   %%%%%%%%%%%%%%%%%%%%%%%
  27.   case 4,
  28.     sys=mdlGetTimeOfNextVarHit(t,x,u);
  29.   %%%%%%%%%%%%%
  30.   % Terminate %
  31.   %%%%%%%%%%%%%
  32.   case 9,
  33.     sys=mdlTerminate(t,x,u);
  34.   %%%%%%%%%%%%%%%%%%%%
  35.   % Unexpected flags %
  36.   %%%%%%%%%%%%%%%%%%%%
  37.   otherwise
  38.     error(['Unhandled flag = ',num2str(flag)]);
  39. end
  40. % end sfuntmpl
  41. %
  42. %=============================================================================
  43. % mdlInitializeSizes
  44. % Return the sizes, initial conditions, and sample times for the S-function.
  45. %=============================================================================
  46. %
  47. function [sys,x0,str,ts]=mdlInitializeSizes
  48. %
  49. % call simsizes for a sizes structure, fill it in and convert it to a
  50. % sizes array.
  51. %
  52. % Note that in this example, the values are hard coded.  This is not a
  53. % recommended practice as the characteristics of the block are typically
  54. % defined by the S-function parameters.
  55. %
  56. sizes = simsizes;
  57. sizes.NumContStates  = 0;
  58. sizes.NumDiscStates  = 0;
  59. sizes.NumOutputs     = 0;
  60. sizes.NumInputs      = 1;
  61. sizes.DirFeedthrough = 1;   % u is used in Output function so it is 1 here.
  62. sizes.NumSampleTimes = 1;   % at least one sample time is needed
  63. sys = simsizes(sizes);
  64. %
  65. % initialize the initial conditions
  66. %
  67. x0  = [];
  68. %
  69. % str is always an empty matrix
  70. %
  71. str = [];
  72. %
  73. % initialize the array of sample times
  74. %
  75. ts  = [0 0];
  76. % init the ui controls
  77. global t f vec
  78. f = figure('Position', [280, 280,330, 330], 'MenuBar', 'none');
  79. t = uicontrol(f,'Style','text','Position',[180,200,80,30]);
  80. vec = [];

  81. % end mdlInitializeSizes
  82. %
  83. %=============================================================================
  84. % mdlDerivatives
  85. % Return the derivatives for the continuous states.
  86. %=============================================================================
  87. %
  88. function sys=mdlDerivatives(t,x,u)
  89. sys = [];
  90. % end mdlDerivatives
  91. %
  92. %=============================================================================
  93. % mdlUpdate
  94. % Handle discrete state updates, sample time hits, and major time step
  95. % requirements.
  96. %=============================================================================
  97. %
  98. function sys=mdlUpdate(t,x,u)
  99. sys=[];

  100. % end mdlUpdate
  101. %
  102. %=============================================================================
  103. % mdlOutputs
  104. % Return the block outputs.
  105. %=============================================================================
  106. %
  107. function sys=mdlOutputs(t,x,u)
  108. pause(0.5);
  109. global t vec f
  110. vec = [vec, u];
  111. set(t, 'string', num2str(u));
  112. plot(vec);
  113. sys = [];
  114. % end mdlOutputs
  115. %
  116. %=============================================================================
  117. % mdlGetTimeOfNextVarHit
  118. % Return the time of the next hit for this block.  Note that the result is
  119. % absolute time.  Note that this function is only used when you specify a
  120. % variable discrete-time sample time [-2 0] in the sample time array in
  121. % mdlInitializeSizes.
  122. %=============================================================================
  123. %
  124. function sys=mdlGetTimeOfNextVarHit(t,x,u)
  125. sampleTime = 1;    %  Example, set the next hit to be one second later.
  126. sys = t + sampleTime;
  127. % end mdlGetTimeOfNextVarHit
  128. %
  129. %=============================================================================
  130. % mdlTerminate
  131. % Perform any end of simulation tasks.
  132. %=============================================================================
  133. %
  134. function sys=mdlTerminate(t,x,u)
  135. global f
  136. close(f);
  137. sys = [];
  138. % end mdlTerminate
复制代码
在仿真过程中截了三个图,Display与GUI数据更新时间稍微有一点不同步,在动态过程中肉眼几乎看不出。效果如下图1、2、3所示:
其他补充:如何用GUI控制simulink,通过GUI设置simulink的参数,然后运行仿真。
通过GUI来控制Simulink进行系统仿真,仿真的对象是动态地钟摆系统.别看题目是GUI和Simulink,其实最重要的中心内容在于S-function.Math大哥说过,S-function的本质就是系统状态的更新,这话总结了一切,系统的更新也就是采样点的刷新,计算当前采样点的全部输出或者包含其微分积分信息,然后到下一个时间点,再刷新.而区分其工作阶段的标志flag的值分别对应各个工作状态:初始化,连续状态微分更新,离散状态更新,输出更新,采样时刻更新,仿真结束这六种状态.其调用格式就不详细介绍了,大家自己调用模版文件出来瞧瞧就很明白了(edit sfintempl.m或者open sfintempl.m或者type sfintempl.m).
  大概的原理就讲这么多,下面进入到我的作品,<<GUI控制Simulink演示钟摆动画>>.在这个作品中,我使用了两个S-function,一个是来描述钟摆本身的运动学特性,一个是模仿硬件(单片机的外部中断)来控制整个仿真的进行与终止.制作过程比较麻烦,程序大概四五百行,我大致说说核心的东西就应付过去吧.核心:S-function早软件中实现硬件支持的中断功能,通过刷新系统状态和检测全局变量stopf来确定是继续执行仿真还是终止动画进行.它的每次更新都把stopf变为0(继续仿真标志),但控制器的按钮按下把stopf变成1,在S-function每次计算输出时会对stopf检测,若为1,那么动画会静止.先给大家看看控制版面,带有仿真时间的输入,如果想保持仿真,那么可以输入inf.
20090430_2ce6879091d7769a1561zqMtnabpIh5M.jpg 20090430_6876f345b5cc5ed189a5z2iYnFmVwLje.jpg

打开模型按钮可以打开.mdl的单摆系统结构图,下面的就是检测停止状态stopf的S-function结构图,需要与系统本身放在一个.mdl文件中,否则只程序的编写是不足够的. 摆过去之后还回循环往复:
20090430_23174ed56d6c594a3f59rSHvxcL2rjA1.jpg

希望对那些学习这一块的人有所帮助!!!
其实,Simulink的实时仿真时间显示到GUI的控件上,还有一个比较简单方便的实现方法:S-Function
使用Level-1 M S-Function可以方便地将每个步长的时间点动态的(估计那位会员所说实时就是这个意思)显示到一个figuretext控件上。这个S函数只用于仿真,不提供内联的TLC文件。S函数的初始化函数部分进行一个带有text控件figure的创建,输出函数则动态得奖时间量获取并写入到text上去。效果如下: 2.jpg 1.jpg
text的数据就是当前模型的时间点数据。
实现此功能的S函数代码如下:

  1. function [sys,x0,str,ts]=gui_time_sfun(t,x,u,flag)
  2. switch flag,
  3. %Initialization
  4.   case 0,
  5.     [sys,x0,str,ts]=mdlInitializeSizes;
  6. %Outputs
  7.   case 3,
  8.     sys=mdlOutputs(t,x,u);
  9. %Unhandled flags
  10.   case {1, 2, 4, 9 }
  11.     sys = [];
  12. %Unexpected flags
  13.   otherwise
  14.     error(['Unhandled flag = ',num2str(flag)]);
  15. end
  16. %mdlInitializeSizes
  17. function [sys,x0,str,ts]=mdlInitializeSizes
  18. sizes = simsizes;
  19. sizes.NumContStates  = 0;
  20. sizes.NumDiscStates  = 0;
  21. sizes.NumOutputs     = 0;
  22. sizes.NumInputs      = 0;
  23. sizes.DirFeedthrough = 0;
  24. sizes.NumSampleTimes = 0;
  25. sys=simsizes(sizes);
  26. x0=[];
  27. str=[];
  28. ts=[];
  29. % 创建一个窗口显示时间
  30. global f;
  31. f = figure('Position',[500 200 50 50]);
  32. uicontrol('Parent', f, 'Style', 'text','String','Simulation Time');
  33. %mdlOutputs
  34. function sys=mdlOutputs(t,x,u)
  35. global f;
  36. % 将每次的仿真时间输出到figure
  37. uicontrol('Parent', f, 'Style', 'text','String',num2str(t));
  38. pause(0.2); %为了让人眼能看清动态过程而加入的时间延迟
  39. sys=[];
复制代码


3

3

2

2

1

1
20090430_45ad6ee9db524efccc398xSW9QBEkhJp.jpg

点评

赞成: 5.0
希望大家继续补充、丰富!将该问题完善!!  发表于 2014-3-22 12:53
赞成: 5
不错!很实用!!  发表于 2014-3-20 21:58

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2014-3-20 21:59 | 显示全部楼层
LZ总结整理的不错,很实用!!赞一个!
发表于 2014-3-20 22:06 | 显示全部楼层
很不错……正好用到,谢谢楼主了!!!
发表于 2014-4-4 19:59 | 显示全部楼层
复制你的代码怎么老是有序号,好烦。想学习一下,simulink一直是弱项。

点评

有序号?不会啊,不知道你是怎么复制的。  发表于 2014-4-4 20:01
发表于 2014-4-4 20:05 | 显示全部楼层
就是点击复制代码选项,每次都有序号,还得一个一个删除,好麻烦,怎么能没有序号
 楼主| 发表于 2014-4-4 20:14 | 显示全部楼层
猫头鹰先生 发表于 2014-4-4 20:05
就是点击复制代码选项,每次都有序号,还得一个一个删除,好麻烦,怎么能没有序号

不晓得你是怎么复制的,我刚才试了一下,没问题的。自己好好再试一下,这个是不会出问题的……
发表于 2014-4-4 20:38 | 显示全部楼层
牛小贱 发表于 2014-4-4 20:14
不晓得你是怎么复制的,我刚才试了一下,没问题的。自己好好再试一下,这个是不会出问题的……

我又试了下,好了。不过出现点问题,我先看看,谢谢。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-10 16:04 , Processed in 0.078734 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表