[技术文章] Simulink 最基础教程

[复制链接]
halleyhit 发表于 2021-4-25 14:24:02
本帖最后由 halleyhit 于 2021-4-25 14:39 编辑

0.前言


如果打开 MATLAB 的官网,会发现产品大体分为 MATLAB 和 Simulink 两个家族。论坛里 MATLAB 的热度又明显高于 Simulink,可能是 Simulink 入门更难,又或者是很多人还不习惯 Simulink 的思维模式。这里整理一些最基础的 Simulink 教程,希望对大家从零开始学习 Simulink 有所帮助。


Ps1 这里会用 r2020a 软件为例,如果是 r2019a 或更早的版本,界面上会有所差异
Ps2 Simulink 的基础仍是 MATLAB。几年前写的“MATLAB最基础教程“可以作为先导入门。


水平有限,如有谬误,欢迎指正。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

19 条回复


halleyhit 发表于 2021-4-25 14:24:22
本帖最后由 halleyhit 于 2021-4-25 14:35 编辑

1.Simulink概述


1.1基本概念

一个典型的Simulink模型大致如上图这样:
1)模块 block:图中画圈的那些,每个模块可以完成一些特定的任务,类似MATLAB中函数的概念。软件提供了很多模块,当然也可以自定义新的模块
2)信号线 signal line:连接模块的线条,类似MATLAB中变量的概念。信号线是有箭头的,沿箭头方向经过模块,就相当于调用这个模块(函数),对信号线(变量)做了一次运算。
3)模型 model:由模块,和模块间的信号线,共同组成。MATLAB中写一个脚本来完成一堆任务,Simulink中就是搭个模型来完成计算。
简单对比:

MATLAB Simulink
函数 模块
脚本 模型
变量 信号线



1.2 启动 Simulink
最简单的启动方法之一,是在 MATLAB 界面上找到 Simulink 按钮,在弹出的菜单中,选择空白模型。除了空白模型,当然还有其他模板,但这些在最基础教程中都不会用到。



1.3 Simulink 界面
一个典型的 Simulink 界面,按照蓝色线条划分,分为三个部分:
1)实线框:里面写着untitled,这是文件名,或者模型名。
2)虚线以上:一般称为工具栏,用来进行各种设置的。
19a及以前,这块是菜单结构,19b及之后,这块改为标签结构,可能造成老用户找不到相关工具。不过,工具的快捷键基本没改过,因此本教程中会尽量用快捷键来操作。
3)虚线以下:一般称为画布。一些常用操作:鼠标滚轮用来缩放视角,”空格“会自动缩放到最佳。


随后是红色部分,框出了一些最常用的工具:
1)文件存取,这块和绝大多数软件一样,新建、保存、打开。
2)模块库,点击后,会出现 Simulink 自带的模块。对初学者而言,新建模型后,第一件事往往就是打开模块库。
3)模型配置。这个三角点开后会有很多工具,其中最常用的是model configuration,快捷键是 ctrl+e。这个用于配置“模型参数“,模型参数是啥?后面再讲。
4)运行区域,当模型搭建完成后,就要去运行模型,求解模型,那么就是Run按钮了。快捷键是 ctrl+t。其他几个按钮,暂停、停止就是字面意思,也都很好理解。step是调试用的类似MATLAB里的debug。
5)显示采样时间(sample time),是个很常用的 debug 工具,会在后续进一步用到。

1.4两个例子
1.4.1图形化编程
在之前介绍的 Simulink 界面基础上,按照红色箭头,打开模型库、拖入模块到画布、连接信号线、点击Run,就实现了整个模型的建立和仿真。双击示波器(scope模块),就能看到曲线。


下面来稍微解释一下这个模型的过程:
1)constant模块,是一个输出模块,或者源模块,特点是只有输出,没有输入。输出的是一条始终为1,不随时间变化的直线y(t)=1
2)integrator模块,是一个运算模块,特点是有输入,也有输出。其功能是对时间积分,即对输入的曲线y(t) 进行积分得到 int(y(t)dt)+C。在这里,输入是y(t)=1,定积分取C=0,因此输出就是 y(t)=t
3)scope模块,是一个输入模块,或者终点模块,特点是只有输入,没有输出。这类模块的功能一般都是用于显示结果,例如这个scope模块,就是显示y(t)曲线,因此示波器双击后,出现曲线y(t)=t(严格说是直线),当然只有t=0~10的这段。

通过这个例子,希望说明的是 Simulink 的图形化编程思路:
1)模型由模块,和模块之间的连线组成
2)信号线,其本质是一个与时间t相关的函数 y(t)
3)模块分为输出模块、运算模块、输入模块三种
4)输出模块给信号线赋值y(t),例如constant模块输出 y(t)=1
5)运算模块对信号线的函数进行运算,例如integrator模块输出和输入的关系为对时间t积分
6)输入模块用于显示y(t)的某项性值,例如scope模块显示 y(t) 的时域函数曲线

1.4.2求解常微分方程组
随手写一个常微分方程组:
y1’=y2+1
y2’=y1+y2
y1(0)=0
y2(0)=0
然后搭建一个Simulink模型:


这里大多数模块与上一个例子一样,唯一多用到的是sum模块。如果按照上一个例子中的分析,那么就很容易发现,integrator模块的输出信号,正是我们要找的y1和y2,通过scope模块就能看到这两个信号的结果。由此,这里出现Simulink的一个应用场景:求解常微分方程组。具体的搭建过程是:
1)将方程(组)写成标准形式 y‘=f(y,t)
其中,y可以是一个向量,即y=[y1(t) y2(t) …]
2)对每一个yi分配一个integrator模块,并视该模块输出为yi(t)
3)搭建 f(y,t),这块是最有技术含量的,如果 f 的表达形式非常复杂,就不会那么容易了。可以说,学习 Simulink 的过程,就是不断掌握更复杂 f 的搭建方法
4)将 f 的输出接到integrator模块的输入端

1.5小结
这结非常长,原因是我希望在一开始就说明 Simulink 的思路——图形化编程:
信号线+模块=模型
信号线=函数y(t)
模块=对函数y(t)运算
至于最开始的界面简介,只是用来帮助搭建那两个例子,反而显得不是那么重要了。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

halleyhit 发表于 2021-4-25 14:24:28
本帖最后由 halleyhit 于 2021-4-25 14:38 编辑

2.信号线

信号线=函数 y(t),Simulink的功能是求解 y(t),但是y(t) 的有些性质,需要在求解前设定。如果没有进行合理的设定,那么模型运行会遇到 mismatch 报错,比如“不匹配:xx信号线希望是xx类型,而实际是yy类型”。

2.1信号线的属性
Simulink中信号线上的数据属性有很多,但最基本的是三个:采样时间、维度、数据类型

2.1.1采样时间 sample time
数学上讲,这是 y(t) 的定义域,如果定义域是 t=0~inf 或者 -inf~inf,那么就说明任意的 t 都有对应的 y,称之为连续信号。
注意:数学上说一个函数是连续的,其定义为 y(x-)=y(x+)=y(x),与 Simulink 中的连续并不一样。软件中的连续,更多是信号分析、自控原理里的连续,即“连续系统”的概念。
如果 y(t) 的定义域,是t=k*dt k=1,2,3… 那么就说明只有若干 t 存在对应的 y,称之为离散信号,dt 是相邻采样时刻的间隔。同样,这里的离散,也源自信号、控制中讲的“离散系统”。
Simulink中,每个信号线的属性都有sample time:
1)对连续信号,sample time = 0
2)对离散信号,sample time = dt
特别的,若dt = inf,那么这个信号只采样一次,典型应用,比如constant模块,默认就是这样的采样时间
3)对未设定信号,sample time = -1
未设定的信号,真实含义是,sample time的数值,由 Simulink 自动计算。例如,已经设定了两个连续信号,让他们通过 sum 模块做加法,那么软件就会认为 sum 输出连续信号 sample time =0,也就不用特意去设定这个信号线属性了。这种由周围信号(尤其是前溯信号)计算信号线属性的方法,也称为“继承”。

2.1.2维度dimensions
和MATLAB一样,Simulink中也是一种矩阵和向量的思路,因此
y(t)=[y1(t) y2(t)…yn(t)]
就是一个向量,当然也可以有更复杂的矩阵。而 y(t) 的元素个数,就是维度了。
Simulink中,每个信号线的属性都有 dimensions
1)对标量或向量信号,dimensions = N,N是向量的长度。特别的,标量信号,N=1
2)对矩阵信号,dimensions = [m n],m和n分别是行数和列数
3)对未定义信号,dimensions = -1,具体含义与 sample time 中的一样
维度比较特殊的一点,是不区分行向量和列向量。即使定义了一个信号是行向量,然后左乘一个方阵,例如
x(t)=[1 2] 是输入信号
y(t)=[1 0;0 1]*x(t) 是输出信号
这在数学上是不成立的,但在 Simulink 中,会自动把行向量转成列向量,然后这个乘法就成里了。

2.1.3数据类型 data type
这个和MATLAB最基础教程中一样,数据类型,比如double或者single,在Simulink中也同样有此设定。对无需专门定义数据类型的信号线,或者说“继承”的信号线,可以定义为 auto,让软件自动去计算。一般情况下,如果所有的信号线都设置成了 auto,那么软件会自动选择 double。
需要注意的是,Simulink中的数据类型,有一些特点:
1)类型很多,比如定点、枚举等
2)有字符型string,不过只有很少的模块支持这种数据类型
3)没有结构体,但是有一个非常类似的bus类型
当然,这些都不会在最基础教程里讲。

2.2信号线属性观察方法
采样时间的观察方法,在讲界面的时候提过,点击那个箭头,选择all,所有的信号线就都被染色了,不同的颜色表示不同的采样时间。
维度和数据类型的观察方法,则是在 debug 标签下,选中需要展示的属性名,所有信号线上就会出现该属性。如果没有出现,那么可以 ctrl+t 运行一下模型(更推荐ctrl+d 刷新一下模型,但这个有点增加入门负担)。


2.3信号线属性设置方法
虽然右键信号线,菜单里有 Properties,但不是用来设置我们刚才提到的那些属性。严格来说,采样时间、维度、数据类型,都不是通过信号线本身来设置的,而是通过信号线前后的模块来设置。


比如图中这样,双击 constant 模块,发现 sample time 的设置,可以想到,在这里设置的采样时间,就是这条信号线的采样时间。而维度和数据类型,也是类似,都是通过信号线前后模块的设置来实现。Simulink 中模块如此之多,具体的设置方法又不尽相同,后续教程中会罗列一些常用模块,更多的,只能在使用过程中不断积累了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

halleyhit 发表于 2021-4-25 14:24:31
本帖最后由 halleyhit 于 2021-4-25 14:47 编辑

3.常用模块

对软件自带的模块,拖进画布,双击,都能找到 help 按钮,然后获得详细说明。这里仅对一些我比较常用的模块进行介绍

3.1源模块

1)clock
这个模块的输出是 y(t)=t。很多信号都是和时间 t 相关的,例如正弦波信号,可以写成 sin(w*t) 的形式。虽然软件也提供了正弦波模块,但如果用 clock 模块+三角运算模块,对初学者而言,也是很好的做法,至少减轻了很多负担:基于几个模块就可以建立大部分信号源。

2)constant
模块的输出是 y(t)=value,其中value的默认值是1。这里引出一个“模块参数”的概念。双击模块后,弹出的对话框里,所有可以设定的量,就称为模块参数,比如 constant 模块最重要的模块参数,就是 value。需要注意的是,这个value可以写1*1的标量,也可以写向量或者矩阵。在 signal attributes 标签下,还有其他的模块参数,比如之前一直强调的 data type,就可以设定后续信号线上的数据类型。


3)repeating sequence
只看模块图片,一般人会以为这是“锯齿波”,但其实这个模块的功能远不止如此。双击模块可以看到 time 和 output 两个 value,填入两个等长的向量即可。效果上,相当于输出一个信号 plot(time,output) 的周期延拓。和 plot 的思路一样,只要能用描点法描述的函数波形,都能用这个模块实现。



3.2运算模块
1)连续传函
自动控制原理里,会大量用到线性时不变系统,这些模块都在这个库里,用状态方程描述的state-space,用传递函数描述的 transfer Fcn,以及其中的特例,积分模块。



2)离散传函
与连续传函对应的,是离散传函。特别的,unit delay模块。这里对应1.4.2求解常微分方程组的例子,如果是求解离散系统的迭代方程 x(k+1)=f(x(k),u(k),t(k)),那么这个过程就是拖拽一堆unit delay模块,将他们的输出定义为 x(k),搭建函数 f 后,再将结果交给 unit delay 的输入。



3)比较和逻辑运算
主要是两个模块,Logical Operator用来实现与或非的运算,双击之后,除了 operator 这个模块参数外,还有一个 icon shape,用来调整模块的外观,可以让模块看起来更像逻辑门。Relational Operator是比较模块,一般使用时,先将信号线连到比较模块,然后再交给与或非运算,用来实现 MATLAB 中的 if 逻辑表达式。



4)数学运算
这个库涵盖了加减乘除、三角、指数等常用数学符号,基本上初等函数都在这里了。Add模块双击后,会有模块参数 list of signs,用于控制输入的个数和其运算的规则。例如三个加号,那么输出信号就是三个信号相加的结果。同样的逻辑也适用于divide模块。对乘除法模块有一些额外说明,就是multiplication这个模块参数,可以选择点乘,也可以选叉乘。这两种乘法与 MATLAB 中的定义一样。剩下的几个模块,都是双击后能有多种选择,都是初等函数。



3.3终点模块
暂时只需要知道 scope 就足够日常使用了。双击 scope后,有几个需要注意的地方
1)小齿轮按钮,可以调节输入个数,从而一个模块观察多个输入。
2)工具栏上有缩放,用来观察特定区域的信号
3)有个logging限制,可以只显示信号线 y(t) t=最后一段时间,的时域波形。



3.4流程控制模块
MATLAB里说的流程控制,一般是指for,while,if,switch这些,Simulink里要实现 for 和 while 比较少见,但实现 if 的情况还是很多的,这时,需要 switch 模块。这个模块的原理是根据第二个信号的值,来判断输出第一个信号还是第三个信号,相当于MATLAB的代码
if u2>th
    Out=u1
else
    Out=u3
end



3.5 信号线属性模块
在 2.3 中有讲,信号线的基本属性是采样时间、维度、数据类型,这里有两个模块可以强制信号线的采样时间和数据类型,当遇到关于信号线属性不匹配的报错时,可以用这两个模块解决。例如图中,假设左边模块输出 int8 数据类型,而右边模块希望输入是 int16 数据类型,这样直接连线会造成报错,说数据类型不匹配。此时加入一个 convert,将左边的 int8 输出,转成 int16,就满足了右边模块的要求。




3.6小结
Simulink提供了如此众多的模块,就如同 MATLAB提供了如此众多的函数一般,这里只是介绍了一些我自认为常用的模块,更多模块还是要边用边学






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

halleyhit 发表于 2021-4-25 14:24:41
本帖最后由 halleyhit 于 2021-4-25 14:50 编辑

4.模型参数与全局变量


4.1模型参数
上面介绍常用模块的时候,都是找到模块,双击模块,设置参数。这些参数都是模块参数。与之相对的,是模型参数。一些说明:
1)模型参数和模块参数并不是隶属关系,而是配合关系。当模型参数和模块参数有冲突时,会报错,而不是自动修改模块参数以匹配模型参数。
2)模型参数的设置方法,是在模型编辑界面里快捷键ctrl+e,在讲Simulink界面的时候提过,model configuration

3)模型参数为树状结构,左侧分类,右侧具体设置。且随处可见小三角,点开后有更多设置选项
4)搜索栏,如果知道模型参数的名字,但无法从树状结构中找到,可以用搜索

这些模型参数中,最常用又最难理解的,则是solver里的这几个:
1)start time 和 stop time,设定的是仿真开始时间和结束时间,即求解信号线y(t) 时的 t 的范围。其中stop time可以设置为 inf,此时模型会一直求解下去,直到有其他东西触发停止信号,例如人为点stop按钮。
2)type和solver,这个用来设定求解时的数值算法。
3)type分为定步长和变步长,当设置为定步长时,模型求解y(t),t=k*dt_m, k=0,1,2… 这里用dt_m 来表示步长。对比之前说过信号线属性里的采样时间,会发现他们非常像。假设模型里有多个不同采样时间的信号,他们的采样时间分别为dt_s1、dt_s2…,那么dt_s和dt_,m需要满足,每一个dt_si/dt_m为正整数。这样,每一个信号线的采样时刻,都是模型的计算时刻,即每个信号线采样时刻的值,会被求解出来。
4)type为变步长时,模型求解y(t), t=t1,t2…tn 其中 t(i) 由 t(i-1) 进行计算。具体计算过程是:按照离散信号线采样时刻,找下一个需要计算的时刻 k*dt_s 作为t(i),如果没有离散信号,就盲猜一个;计算y(t(i)),并估算这样的y结果是否准确;如果不准确,则减小t(i),直到y(t(i)) 的精度足够。
小结一下solver,定步长对步长dt_m有限制。变步长没啥限制,但因为有估算误差的过程,因此比较慢。
5)设定type后,可以在solver里进一步选择算法,如果想深入了解,可以看“龙格库塔”算法,例如ode45的意思,是龙格库塔4阶计算,5阶估算误差。

4.2全局变量
全局变量这个说法并不准确,这里想要解决的问题是:无论是模块参数还是模型参数,我们之前讲的都是在对应位置填入数字,那么有没有办法填入变量呢?比如constant模块,value里写个a,然后我去别的地方定义a等于多少?这里就牵涉到一个问题,如果参数遇到变量,Simulink会去哪里找呢?
完整的回答是,依次去:musk workspace、simulink workspace、base workspace / sldd 四个地方找。因为是依次去找,因此一旦找到,后面位置里定义的就失效了,比如在musk workspace里找到了a,那么base workspace里定义的a就没用了。
这四个位置中,base workspace就是MATLAB基础教材里讲的,MATLAB界面右侧的workspace。另外三个位置,对初学者而言可以忽略。一个常见的用法是,Simulink离散建模,有很多模块输出信号线的采样时间需要设置为同一个数值,此时可以设置模块参数为ts,然后在MATLAB中执行ts=0.1或者类似命令。这样模块参数在寻找ts的时候,会按照之前讲的顺序去四个位置找ts,因为其他位置里没有ts,因此最后在base workspace里找到ts=0.1



最后的总结:
模型=信号线+模块
信号线有属性,最基本的是采样时间、维度、数据类型
模块有模块参数,用来控制前后信号线的属性,一般是双击模块进行设置
模型有模型参数,需要和模块参数匹配,最基本是ctrl+e -> solver设置
参数设置可以用具体数值,也可以用base workspace里的变量



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

halleyhit 发表于 2021-4-25 14:25:17
本帖最后由 halleyhit 于 2021-4-25 14:50 编辑

施工完成。欢迎指正。

Josh_HUypp 发表于 2021-5-14 14:37:49
初学者福音

gxj2021 发表于 2021-5-19 22:10:30
初学者福音!!!!!!

海绵的派大星 发表于 2021-6-15 11:08:01
厉害!!!!!!!!!!!!!

huangdj2010 发表于 2021-6-25 09:42:13
初学者福音

huangyanliang 发表于 2021-7-19 23:22:42
学习学习 多谢分享

xiaorainer 发表于 2021-8-20 14:43:29
简单明了,谢谢

yanlin728 发表于 2021-8-24 10:25:02
感谢楼主,楼主好人一生平安

Tera_amu6G 发表于 2021-8-25 18:47:32
相对我这样的小白拿过去模仿一百边

mutouyu123 发表于 2021-8-25 20:44:36
学习中,感谢分享

missFFF 发表于 2021-9-8 10:39:47
作为零基础的我,想了解一下simulink 如何运行的框架,翻山越岭的终于找到一篇讲解清楚的了。感谢

夏立新 发表于 2021-9-10 09:59:58
感谢分享

ym13231026766 发表于 2021-9-14 09:46:35
感谢分享

dafeilang 发表于 2021-9-26 18:00:38
基础学习

jds2021 发表于 5 天前
感谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表