如何给simulink模型加密(时间t是如何在simulink模型实现的)

案例 2020-02-01 09:28:42

如何构建下图的Simulink仿真模型

方法/步骤

安装完MATLAB软件后,在电脑桌面点击MATLAB快捷方式

打开MATLAB后,点击Simulink Library按钮

之后会进入Simulink模块库界面,点击新建模型

接下来,我们就会看到新模型的操作界面,我们只需在模块库中选择我们所需要的模块,搭建模型就可以了

下面我们搭建一个简单的正弦波显示的模型,我们先在模块库中选择Simulink库中的Sources库,选择Sine Wave,将其拖拽到新模型中

接着在Simulink库中选择Sinks库,选择Scope模块,拖拽到新模型中

在新模型中,将两个模块连接起来,点击运行按钮即可


如何加快Simulink模型的仿真速度
有几种原因可能导致仿真运行速度很慢:

1. 模型中有一个 MATLAB 函数块 :当存在 MATLAB Fcn 模块时,在每个采样时间都会调用 MATLAB 解释器。这会大大降低仿真速度。所以,应尽可能使用内置Simulink模块

2. MATLAB S函数(S-Function):在每个时间步长都会计算 S-Function。把MATLAB代码转为MEX文件,这样性能可以得到显著提高。此外,如果可能,应尽量使用内置模块建模。

3. 较小的步长或采样时间(或者彼此间不是倍数关系的采样时间):为了在仿真期间捕获重要事件,有时必须设置最够小的步长;反过来,步长太小会导致产生不必要的输出点,从而减慢仿真速度。

4. 最大步长太小:如果您更改了最大步长,请尝试用默认值(设置为自动)来运行仿真。

5. 您要求的精度可能过高:默认相对容差(0.1% 精度)通常就足够了。对于状态趋于零的模型,如果绝对容差参数太小,则仿真可能在近零状态值附近采用过多步长。有关容错度的详细信息,请参阅《使用 Simulink 手册》第 5-13 页。请记住,所有要输入的容差值都是绝对值。所以,默认相对容差值设置为 1e-3 时,意味着相对容差是 0.001,或者 0.1%(采用百分比形式)。

6. 时间尺度可能太长:减少时间间隔。

7. 您的模型中包含一个 Memory 模块:使用 Memory 模块会导致在每个步长上变阶求解器(ode15s 和 ode113)被重置回阶数 1。

8. Extras 库中有包含以上三项之一(即Graph Scope、Autoscaling Scopes、Spectrum analyzer等)的Mask模块:Unmask模块来看看它们是否调用 S-Function。

9. 使用了Scope模块:尽管它们的影响很可能不明显。

10. 代数环:为了解代数环,会在每个步长上都执行迭代计算。因此,它大大降低了速度。有关代数环的详细信息,请参阅《使用 Simulink 手册》第 3-18 页。

11. 不要在积分函数中引入白噪声模块:对于连续系统,使用 Extras/Sources 库中的带限白噪声模块

12. 这可能是个刚性(stiff)问题,而您使用的是非刚性(non-stiff)求解器:尝试使用 ode15s。

13. 您可能碰到了连续过零,导致仿真逐渐“停滞”,时间很长(并且可能是无限长时间):要解决此问题,可以禁用过零检测。这可以通过在“Simulation 参数”(Simulation Parameters) 对话框的“高级”(Advanced) 窗格中选择“禁用过零检测”(Disable zero crossing detection) 选项来实现。在 R11 中,可通过转到模型的“仿真”(Simulation) ->“参数”(Parameters) ->“诊断”(Diagnostics) 部分来实现此目的。

有关过零检测的详细信息,请参阅《使用 Simulink 手册》第 5-44 页。

14. 您也可能想要尝试设置“模型参数配置”(Model Parameter Configuration) 对话框以便您的 Simulink 模型使用“内联参数”(Inline Parameters) 选项:选择此选项可使 Simulink 能够将指定参数视为常量,从而加快仿真速度。请参阅《使用 Simulink 手册》第 5-30 页了解更多信息。

15. Simulink Accelerator 仿真模式可以加快仿真时间。Profiler可以分析模型性能瓶颈来提高仿真速度。

16. 如果模型非常复杂(涉及大量模型引用和子系统)且包含大量数据记录,仿真速度也会受到影响:禁用数据记录功能也能提高仿真速度。

除此之外,仿真速度受系统(即处理器、RAM、正在发生的交换量等)的制约。

关于仿真速度有还有几点需要考虑:

- 图形引擎速度

- CPU 速度

- 内存量

为此,下面是几点提示:

- 如果在仿真过程中有打开的scope或其他可视化输出设备,这些都会降低性能

- 性能与 CPU 速度成正比

- 如果在仿真过程中存储的变量大于系统上的 RAM 量,则性能会很差。解决办法是运行较小的仿真或增加内存

07火车车头07火车车头


如何关联simulink/stateflow 模型和子模型
一.打开simulink,新建一个model(保存为time.mdl),在simulink的左边找到stateflow并选中他,将右边的chart拖入新建的model中,双击这个chart,就出现了stateflow的编辑器,先介绍一下这里面能画的东东(在左边的工具栏上)
1.左边工具栏上第一个图标是方框似的东东,将它拖入编辑器中,就表示一个状态(state),双击它就可以在其中写一些命令,格式如下(%后面的是我自加的,方便解释):
name/ %此状态的名称
entry:entry action %刚转换到此状态时执行entry action
during:during action %在此状态之中时执行during action
exit:exit action %退出此状态时执行exit action
on event_namen event_name action %当某事件发生时执行on event_name action
2.左边工具栏上第二个图标是一个圆中有个H的东东,它的名字叫做历史节点(History Junction) ,可将他拖入一个状态框中(就是上面说的那个),一旦一个状态框中有这个历史节点,在退出这个状态时会将这个状态的一些信息保存下来,当下次再进入此状态时,此状态的初始状态就会是前面保存过的那些信息。
3.左边工具栏上第三个图标是一个一根线指向一个方框的东东,叫默认转换(default transition),把他拖到一个状态的旁边,它就会指向一个状态,表示系统启动后将首先进入这个状态。
4.左边工具栏上第四个图标(他的样子太复杂了,不描述了,反正是最后一个,呵呵)代表的东东,叫节点(Junction),它是方便画状态图的,当各个状态之间的转换很复杂时,可以设立中间节点,将一些相同的转换指向它,然后再由它指向各个状态(或另一个中间节点)
5.还得介绍一下画转换线(transition),将鼠标放在一个状态的旁边,当它变成+形状的时候,按下左键不动,就会拉出一条线来,当拉到另一个状态旁边时松开左键,这样就画出了一条由一个状态指向另一个状态的转换线,选中这条线,将鼠标停留在上面,鼠标会变成一个I的样子,这时按下鼠标,就可以在上面写语句,例:switch(switch事件使状态转换)或[output>maxtime](当此条件满足时进行状态的转变)。

二.再介绍一下stateflow是怎样跟simulink通讯的,在stateflow编辑器中点tool菜单下的explore,在左边支开time,选中chart,我们将在此添加一个事件和两个数据(计数器所需要的)。
1.点Add菜单下event,在右边就新产生了一行,将它的名字(name)改成switch,范围(scope)改成input from simulink,触发器形式(Trigger)改成Rising(其实这儿无所谓),此时你看看time.mdl,是不是chart模块上方多了一个上升的标志,此时在time.mdl添加一个pulse generator(在simulinksources里面),将他的输出接到chart的上方,就表示每当pulse generator产生的信号上升时,switch事件发生。
2.再添加两个data,点Add菜单下data,在右边将他的名字改成output,scope改成output to simulink,此时time.mdl中chart就多出来一个输出端口,它就是要给simulink用的,在这里output就是计数器的输出(我们的目标),可以接上一个scope或display看输出结果(simulink/sinks下,怎么添加及连线就介绍了),再点add--data,将他的名字改成maxtime,scope改成constant,表示他是一个常量,将在matlab的workspace里设定,这里的含义就是计数器的最大值,当计数器的输出达到这个最大值时,输出将自动清零,表示重新开始计数。添加完成后,就可关闭explore了。

三.有了上述的准备,就可以在stateflow中画状态流图了,还是在stateflow编辑器里,从左边的工具栏上拉出一个状态来(上面介绍过方法了),双击它,在其中写上 reset/ %此状态的名称为reset
entryutput=0; %当进入此状态时,将output赋值为0,表示将计数器输出清零
再拉入一个默认转换(History transition,左边工具栏上第三个),拖到reset状态的旁边,使它指向reset状态,这样就表示reset状态将是系统启动后第一个进入的状态。再拉入一个状态,在其中写上 count/ %此状态的名称为count
entryutput++; %当进入此状态时,output加1,表明计数器记一次数此时再拖入一个节点(Junction,左边工具栏上第四个,其实可以不用,这儿是介绍一下他的用法),然后画两条转换线(transition,上面介绍怎么画了),一条由reset状态指向这个节点,一条由count状态指向这个节点,在这两条线都写上switch,表示一旦switch事件发生,不管当前是哪个状态,都将转换到此节点上来(跟simulink联系来讲,就是当time.mdl里的pulse generator的信号上升时,就将产生状态的转变)。然后再画两条转换线,一条由这个节点指向reset状态,在线上写上[output>=maxtime],表示一旦output超过最大值时,将进入到reset状态(将计数器清零),另一条线由这个节点指向count状态,在线上写上[output