matlab总库

本文围绕Simulink展开,介绍了基础模块、连续模块库、不连续库等多个模块库。涵盖各模块功能,如switch用于选择、gain有增益作用等,还提及仿真参数设置、模块操作技巧,以及利用MATLAB求解微分方程、判断滤波器类型等内容,为Simulink开发提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 simulink基础模块

  •  按住CTRL键后点击两个元件可以实现两个原件之间的自动连接
  • CTRL+R旋转原件90度,CTRL+I将原件镜像
  • 按住CTRL之后点击连接线,连接线上会出现分支点,从该分支点可以引出线
  • 仿真参数设置如下:

  • 对于常量,不勾选解释为一维向量就是矩阵,解释为一维向量就是向量,在MATLAB里对于一维数组是竖向排列的

  • .*是按照元素进行运算,*是按照矩阵进行运算

Bus Creator由几路输入信号合成为一条总线信号 Bus Selector:由总线信号中选取需要的一路或几路信号输出 Mux:信号合成 Demux:信号分解 区别: Bus的可选择性较多,如Bus Selector可以选取总线信号中的某路信号进行输出,而Demux则则是按顺

1.1 switch

switch的作用是选择,如果中间输入的值满足中间设置的条件,那么输出上面的信号,如果中间的值不满足条件,输出下面的信号

下面是利用switch进行半波整流

下面是利用switch将正弦波转换成方波

1.2 gain

u指的是输入参数,K是gain增益的值

1.3 relational operator(关系运算)

is inf 是判断是否无穷大

is finite用于判断是否是有限值

isNaN用于判断Not a Number、不定式如0/0

  • logical operator逻辑运算

1.4 积分模块 integrator

积分器是对输入值进行一次对时间的积分,积分器的初始条件是对积分器的输出值设置一个初始值,积分器的初始条件来源有两种,一种是内部,就是直接在上图中直接设置,另一种是外部,就是给积分器增加一个输入值,这个输入值从外部输入作为积分器的初始条件。积分器还可以设置限幅,就是对积分器的输出值的上下限进行限幅,相当于给积分器加了个saturation。

重置是对积分器的输出重置到设置的初始条件。

状态端口用于防止代数环,输出作为输入就会产生代数环。

设置积分输出的上下限之后,显示饱和端口,如果积分达到上限,饱和端口就会输出1,达到积分下限,饱和端口就会输出-1,没有达到饱和上下限,饱和端口输出0

1.5 单位延迟模块

这个模块实现输入延迟一个采样周期然后输出。

左边是用单位延时模块搭建的数字滤波器,右边是离散的传递函数

1.6 离散时间积分模块

梯形法是用起点和终点导数值的平均值作为直线的斜率。

上面是离散时间积分器,Ts(采样时间\步长)可以自己取值

上图是离散时间累加器,Ts(采样时间\步长)默认为1

上图中u为输入,u就是y的斜率

下图是采用前向欧拉法对脉冲进行的离散积分。

使用后向欧拉法以及梯形法时因为要用到终点时的输入值作为斜率,所以在设计算法时,只有终点时刻到达后才能得到输出的估计值。

1.7 数据类型转换模块

2 连续模块库

2.1 微分模块

上图中第一个是连续微分,后面的是离散微分。

连续微分的输入必须是连续信号。

上面的三张图说明了第一点是微分的初始值是从零开始的,第二点是微分的曲线要比原函数的曲线粗糙,所以光滑性比较差的信号比如噪声信号不会采用微分模块。

理想微分模块在物理系统中是不可以实现的,因为实际物理系统具有惯性。,所以MATLAB里的微分模块采用的是下图的形式,c表示惯性常数或者时间常数。

理想微分环节实际上就是一个拉氏算子,在使用时应该尽量和后面的被控信号的传递函数合并

2.2 状态空间模块

2.2.1 利用状态空间法求解微分方程

求解微分方程采用高等数学里的解析方法直接求解是方法1,采用拉氏变换求解是方法三

还可以通过下面的信号图利用MATLAB求解,一个技巧是求和输出项应该是最高微分项

x上面加一点表示对x求导,所以选的矩阵的阶数应该等于求导的最高次数。状态变量x的选取需要凭借经验

下面通过状态空间法利用matlab来求解微分方程

下面的初始条件指的是状态x

2.2.2 利用linmod函数提取状态矩阵

对于表示下图左上角的微分方程 ,可以用下图传递函数的形式,传递函数表示一个系统本身的性质,与系统的输入输出没有关系。也可以用下下张图这种框图的形式,用传递函数表示比较好。

通过下面的操作得到了状态矩阵,状态矩阵存储在一个结构体ans里面,之所以要用a=ans.a是为了不改变ans的值。得出的状态矩阵与2.1中的状态矩阵不同,是因为定义的状态变量不在是x1=y

2.3 传递函数

2.3.1 tf函数

从波特图幅值随频率的变化可以看出,随着频率的升高,赋值降低,所以这是低通滤波器。

如何用系统函数判断高通滤波器
(1)死办法,用傅里叶变换求出H(f),在画出幅频特性曲线,看高频部分是不是“通”
(2)用拉氏变换求出H(s),然后记住一句话:分子上有什么就通什么!

举个例子:
H(s)=as/(bs+c)
分子上有“高次”,所以是高通。
这里的“高次”是这个意思:
分母上有s的0次和1次,分子是s的1次,所以是较高的那个,简称“高次”。

H(s)=a/(bs+c)
分子上有“低次”,所以是低通。

H(s)=as^2/ (bs^2+cs+d)+3
分子上有“高次”,所以是高通。

H(s)=a/(bs^2+cs+d)
分子上有“低次”,所以是低通。

H(s)=as/(bs^2+cs+d)
分子上有“中间次”,所以是带通。

2.3.2 tf、zpk、ss函数的用法

g1=zpk([2 4 6 8],[1 3 5 7 9],25);%zpk创建了零极点形式的传递函数,并将这个函数
% 赋值给g1  zpk的用法是zpk([零点],[极点],增益])
g2=tf(g1);%将零极点形式的传递函数展开
g3=zpk(g2);%将展开的传递函数转换成零极点形式的传函
g4=ss(g1);%将零极点的传递函数转换成状态空间
g5=ss(g2);%将展开的传递函数转换成状态空间
g6=zpk(g4);%将状态空间转换成零极点形式
g7=tf(g5);%将状态空间转换成传递函数形式
g8=ss(g4.A,g4.B,g4.C,g4.D);%这是用四个矩阵来创建状态空间

2.4 几种延迟模块

我的理解是第一种可以延迟一个固定的时间延时,第二个时间延时可以通过外部给定而第三个时间延时是面向某个问题的原理设置的延时功能,电气用到的应该是前两个吧

3 不连续库(discontinuities)

 3.1 饱和模块、死区模块及其动态

动态饱和和动态死区模块只是将上下限/死区起点终点设置为动态输入。

下图是搭建的一个死区动态变化的互补的PWM波。

3.2 间隙模型和滞回模型

3.3 比例极限(Rate Limiter
)及穿越点检查模块(Hit Crossing

比例极限模块用于控制输入信号的上升斜率,存在比例限制参数外部动态输入的模块。

下图是穿越点检查模块的使用,可以用于过零检测的仿真,模块输出布尔类型的数,而正弦波输出的是双精度数,两个信号要在一条总线上,需要数据类型相同,所以用到数据转换模块,将穿越点检查木块输出的信号转换成双精度。

3.4 量化模块和归零模块

量化模块(Quantizer)

量化模块的输出y=q*round(u/q),其中,u是输入信号,q是设置的时间间隔。每到一个时间间隔就量化一次。

Wrop模块就是到达设置的阈值后输出为零

3.5 库仑摩擦和粘滞摩擦模块

库伦摩擦:推箱子

粘滞摩擦:水中运动的物体、空气中运动的物体

4 离散模块库(discrete)

 4.1 延迟模块

unit delay用于延迟一个采样周期

delay可以设置延迟几个采样周期

tapped delay则是会将每个单位延迟都显示出来

下图是对Unit Delay的仿真。

正弦波的设置如下图,正弦类型设置为基于采样,采样时间设置为0.1,通过设置每周期采样数就确定了正弦波的周期。

通过delay设置延迟长度为5个采样时间。

还有上面两个模块,上面的第一个只有使能才有延迟,还有上升沿复位功能;第二个模块有上升沿复位和设置初始值的功能

4.2 离散传函、零极点、状态空间模块

这三个模块的设置与S域是一样的。但是把一个S域的传递函数变成Z域的传递函数不是把s换成z。如下图可以采用双线性变换的方法。

上面双线性变换的方法在MATLAB里有相应函数bilinear

[zd,pd,kd] = bilinear(z,p,k,fs)%将零极点的S域传函转换成z域传函,fs是采样频率
[numd,dend] = bilinear(num,den,fs)%将S域传函转换成z域传函,fs是采样频率
[Ad,Bd,Cd,Dd] = bilinear(A,B,C,D,fs)
[___] = bilinear(___,fp)

对于tf,zpk,ss函数,按照s域中的设置,在括号的最后加上[x,y,采样时间]就可以转换成z区的传递函数。

4.3 离散滤波器件模块

上面两个模块是离散滤波器模块。

下面将之前用过的连续域的滤波器参数利用双线性变换的函数转换成z域的参数

[a,b]=bilinear(-1,[1,3,1],10)//设置采样频率为10
//输出结果为

a =

   -0.0022   -0.0043   -0.0022


b =

    1.0000   -1.7310    0.7397

将上面计算得到的参数输入离散滤波器,并设置采样时间为继承。离散滤波器的传递函数已经设置了采样频率,这里又设置了采样时间。这两个采样时间不是一个东西,离散滤波器的采样时间是对于输入离散滤波器的信号进行采样的采样频率,这个采样时间应该满足香农定理,否则离散滤波器处理器所接收到的信号就会是失真信号。而离散滤波器传递函数设置的采样频率代表了滤波器滤波的一种能力,假设信号采集模块输出的是不失真的信号,如果传递函数的采样频率设置不合理,也无法得到需要的滤波信号,根据仿真,设置传递函数的采样频率为1时就不能很好实现滤波。

下图是滤波的效果图:

滤波器继承的采样时间为0.01,如下图

将滤波器的采样频率设置为1,下图波形显示采样时间仍然是0.01,但是没有很好实现滤波

4.4 差分及离散微积分模块

离散积分模块在第一个模块库里已经整理过,这里不再整理。

下图中第一个模块是差分模块,\frac{z-1}{z}=1-\frac{1}{z},在第一个模块库里学习过延迟模块1/z,差分模块就是本采样周期输入信号-上一个采样周期的输入信号。而离散微分就是让差分信号除以采样时间,设置K=1,离散微分模块就可以输出离散微分了

sin(wt)求导是wcos(wt),如果要求离散微分输出的信号幅值为1,那么w=1,这就需要正弦波的周期为2pi。

如果正弦波采用基于采样的类型,每周期的采样数需要=2pi/采样时间,才能使得导数幅值为1,如下图

如果是基于采样时间,直接设置频率为1弧度/秒即可,如下图

4.5 连续系统和离散系统的转换

bilinear:采用双线性变换将连续系统转换成连续系统,之前已经学习过。

    [zd,pd,kd] = bilinear(z,p,k,fs)
    [numd,dend] = bilinear(num,den,fs)
    [Ad,Bd,Cd,Dd] = bilinear(A,B,C,D,fs)
    [___] = bilinear(___,fp)%这条语句是在上面三条语句下增加了参数fp,这样能够保证映射前后频率响应完全匹配。

c2d:continute to descrete

    sysd = c2d(sysc,Ts)
    sysd = c2d(sysc,Ts,method)
    sysd = c2d(sysc,Ts,opts)
    [sysd,G] = c2d(___)

A=[-4 -4;0.75 0];
B=[4;0];
C=[0 1];
D=[0];
[Ad,Bd]=c2d(A,B,0.1);
[Ad2,Bd2,Cd2,Dd2]=bilinear(A,B,C,D,10);

图中黄线是连续,蓝线是通过c2d转换的离散系统,红线是通过bilinear转换的离散系统。输入时阶跃。对于C、D矩阵,由于是线性的,不需要进行c2d

4.6 惯性、超前滞后环节

惯性环节表现出一种滞后现象,滞后不是延迟,在滞后中,有输入就会有输出,只是输出比输入要慢。但是在延迟环节中,输入要延迟一段时间后才会有输出。实际系统中因为物体有质量,电路中电感电容充放电需要时间,所以具有惯性。

把零点置为1就是离散差分环节,离散差分环节是当前值减去上一个采样周期的值,这个环节是对上个采样周期的值乘一个系数

  • 超前滞后环节

一个超前滞后环节只能实现超前补偿或者滞后补偿,要实现超前和滞后补偿,要将一个超前和一个滞后串联起来。

下图是滞后补偿,可以看出经过滞后补偿的蓝色波形要比原波形(黄色波形)要滞后。

下图是超前补偿,补偿后的蓝色波形是超前的。

在超前滞后的设计中,一般是先计算出S域的参数,然后利用双线性变换等方法转换成离散域。

4.7 记忆模块、零阶保持器、一阶保持器

memory的输出上输入信号端上一仿真步长的值,ode45时,仿真步长是变化的;unit delay在设定的延迟时间之内输出值一直保持上一采样值,在这个延时之内可能会经历多个仿真步长。

零阶保持器可以用来做DA转换,输入零阶保持器的是一系列离散的数值,零阶保持器在下个离散信号没有到来之前,保持信号的值不变。其实,simulink的仿真里对于离散信号的输出波形可以看出,都是采用零阶保持的形式。

如下图,离散的正弦波波形本身就是零阶保持形式,而设置的零阶保持器的采样周期要更长,输出的是蓝色波形。

4.8 离散PID

积分采用前向欧拉、后向欧拉或者梯形算法。2DOF PID只是增加了一个参考点输入。

5 Logic and Bit Operations

5. 1 区间检查模块

5.2 组合逻辑模块

把输入按照从0递增,对应的输出就是行数从1递增。

利用组合逻辑模块可以根据SR触发器的真值表设计一个具有SR触发器功能的组合逻辑模块。对于simulink里没有的触发器等可以用组合逻辑模块来实现功能

5.3 位设置与位清零

这两个模块只能对定点数进行操作,不能对浮点数进行操作,模块设置的参数是位索引,表示对输入数字的第几位清零与置位。

5.4 位提取与移位运算模块

5.5 检测模块

用来检测位的变化的,U/Z表示上一次采样的值。

6 look up tables 查表模块

6.1 look  up Table

“表数据”里面是几个从小到大增长的值,断点里的值依次与表数据对应,输入值如果等于表数据的值,那么输出值是表数据对应的断点值,输出值如果不等于表数据的值,那么输出值将按照设定的插值算法进行输出。

还有2维度查表和n维查表如下图

三维矩阵的定义:

%A(行,列,第三维度层数)

A(:,:,1)=[1 2 3;4 5 6;7 8 9];
A(:,:,2)=3*ones(3);
A(:,:,3)=3*eye(3);



结果



val(:,:,1) =

     1     2     3
     4     5     6
     7     8     9


val(:,:,2) =

     3     3     3
     3     3     3
     3     3     3


val(:,:,3) =

     3     0     0
     0     3     0
     0     0     3

6.2 预查询表模块

6.3 直接查询与动态查询表模块

上面是直接查询模块,里面存放着输入的n维矩阵,通过输入矩阵的行数、列数、层数可以查询到对应的矩阵元素。还可以查询矩阵的行元素、列元素、二维矩阵等。该模块与1中模块的不同之处在于,输入的索引值只能是从1开始的矩阵的行数、列数、层数,而不能向1中模块那样设置索引值。

动态索引模块只能实现一维数组的动态索引,xdat输入要修改元素所处的位置, ydat输入元素要修改成什么值,而x是索引值。

6.4 正余弦查询模块

该模块就是用查表的方法在模块中存放着一个正余弦的表,对输入值进行查询,输出正余弦的值。

7 math operations

 7.1 与加相关的模块

前三个很简单,功能基本一样。

第四个模块输入只有一个,所以输入量是一个一维向量或者数组,用于对输入向量或数据的所有元素求和,或者对某一维度求和。

bias是偏移模块,设置一个偏移值。

7.2 与乘相关模块

SIider  gain是一个滑动可调的增益

最后一个模块是向量的点乘模块(1,2)点乘(3,4)=11

7.3 几种单目运算模块

第一个模块是取相反数

第二个模块是取模(对复数)或者取绝对值

第三个模块是大于零为1,小于零为0

第四个模块是加权采样时间模块,如下图表示的是对输入信号加一个采样时间。这个模块需要注意,从这个模块里可以得到仿真步长\采样时间。

7.4 数学函数、多项式模块

下图是数学函数模块,有指数,对数等

7.5 取整函数与最值函数模块

下图是圆整函数,是用来对输入取整的,floor是向下取整,ceil是向上取整,round是四舍五入取整,fix是向零取整。

输入端口数目为1时,输出输入向量或矩阵元素的最大值;输入端口为多个时,是对几个端口输入进行比较输出最值。

R输入几个,就比较几个u的输入得出最值,当R为1时,输出初始值。

7.6 三角函数、代数约束模块

三角函数模块函数有以下函数,其中atan2有两个输入,第一个输入是y,第二个输入是x,输出值是atan(y/x)

下面是时间使用外部信号的正弦波发生器,外部输入是一个时间信号,所以应该是按照时间上升的一个值。正弦类型是基于时间时,外部信号使用CLOCK信号;正弦类型是基于采样时,外部信号使用digital clock信号。

代数约束模块输入时f(z)方程,输出是z。使用时将输出z通过一系列运算构造处f(z)函数接上输入,并且需要给z一个初始值,通过迭代的方法得到方程的解。

7.7 分配模块、变形模块(Assignment、Reshape)

assignment用来为多维输出信号的指定元素赋值。每个元素的索引都是从输入端口或对话框里进行设置。

Reshape用来更改向量或矩阵输入信号的维度。

7.8 拼接模块

上面是矩阵拼接和向量拼接模块,矩阵拼接也可以进行向量的拼接。

7.9 复数相关的模块

第一个模块是输入幅值和相角输出复数;第二个模块是输入实部和虚部输出复数;第三个模块是输入负数,输出幅值和相角;第四个是输入复数输出实部和虚部。相角是弧度值。

8 模型校验库

 校验模块库的特点是校验出失败情况后可以直接停止仿真。

8.1 动静态校验模块

第一个模块是下限校验,第二个模块是上限校验,第三个模块是上下限校验,第四个模块是区间校验,当模块落在图中的灰色区域,表示运行错误,此时会根据设置停止仿真或者输出0,没有落在灰色区域输出1。第二行的功能与第一行是一样的,只是上下限是通过输入传进模块的,可以是动态的上下限。

8.2 其余校验模块

这个模块常用于AD转换时的校验,将模拟信号转换成数字信号的分辨率为\frac{X}{2^{n}-1},X是输入的模拟信号,n是数字信号的位数。将分辨率输入该模块进行校验。

9 模型扩展功能库

9.1 基于触发的线性化模块

上面的设置在matlab工作区生成了如下信息。

要生成那些信息可以在下面进行选择。

 fields(untitled_Trigger_Based_Linearization)%fields可以得到数组所用的域

ans =

  9×1 cell 数组

    {'a'         }
    {'b'         }
    {'c'         }
    {'d'         }
    {'StateName' }
    {'OutputName'}
    {'InputName' }
    {'OperPoint' }
    {'Ts'        }
 whos %可以查看当前工作空间中变量占用的空间和类型
  Name                                      Size            Bytes  Class                        Attributes

  ans                                       9x1              1022  cell                                   
  out                                       1x1              6723  Simulink.SimulationOutput              
  untitled_Trigger_Based_Linearization      1x3              7422  struct                    
>> f=fields(untitled_Trigger_Based_Linearization)%将结构体fields的域给f

f =

  9×1 cell 数组

    {'a'         }
    {'b'         }
    {'c'         }
    {'d'         }
    {'StateName' }
    {'OutputName'}
    {'InputName' }
    {'OperPoint' }
    {'Ts'        }

>> whos f%查看f占用的存储空间和类型
  Name      Size            Bytes  Class    Attributes

  f         9x1              1022  cell               

>> f(1)

ans =

  1×1 cell 数组

    {'a'}

>> f{1}

ans =

    'a'

9.2 基于时间的线性化模块

该模块实现的功能上一个模块是完全一样的,只是改成了基于时间的,也就是在工作区生成状态变量的时刻由基于触发改成基于时间的,当仿真时间等于模块内部设置的时间时,会在工作区生成该时刻的状态变量。

9.3 其余模块

下面的模块用于添加模块的注释。

下面的模块可以查看模块自动生成代码的情况

10 端口及子系统库

10.1 使能及其子系统

子系统模块比较容易理解,子系统模块增加Enable就是使能子系统模块,使能子系统模块如果使能信号有一个分量为正,子系统就工作,否则不工作。使能子系统模块可以设置启用时的状态保持或者重置,如下下图所示。

10.2 触发及其子系统

触发子系统只有在有触发信号的时刻,子系统才会运行,触发子系统必须是离散子系统。

10.3 微型子系统

微型子系统和之前的子系统相比,更加独立,属于非虚拟子系统。

10.4 代码重用子系统

属于非虚拟子系统。

10.5 模型及函数调用发生器模块

在model模块里输入simulink模型名称,可以将模型插入到新的模型之中。这个模型需要在matlab的搜索路径里。搜索路径的设置如下。

10.6 可配置子系统

10.7 使能和触发子系统

10.9 函数调用子系统

这是通过S函数调用的子系统。

10.10 for循环子系统

循环子系统在系统内完成循环。

在模型里的for iterator模块可以设置循环次数,迭代限制来源可以来自内部外部。还可以设置开始时的状态。

通过下面循环的搭建,我认为memory像是程序里的一个变量,可以在一个步长内存储一个变量的值。

10.11 while 循环

该模块可以选择while或者do while,对于while 如果初始条件IC为0,循环一次也不执行,对于do while,如果初始条件为0,循环至少执行一次。

初始条件如果成立,那么进入循环,以后的每一次循环需要满足两个条件,一个时cond输入为1,另一个时迭代次数小于最大迭代次数。最大迭代次数是为了防止程序进入死循环。

10.12 if /if action模块

if模块用于进行条件判断,那个条件成立,就执行该条件对应的if action模块。

10.13 switch、switch action模块

输入几种case的情况都不满足,那么执行default对应模块,如果没有default模块几种情况又都不满足,那么什么都不执行。

10.14 子系统实例模块

里面提供了一些子系统应用的实例

11 信号属性库 signal Attributes

 11.1 same DT 

用于检测输入信号的数据类型是否相同,如果不同,会产生提醒。

11.2 数据类型传播模块

需要改成信号向后继承。

下面给出了数据类型传播模块使用的一些例子。

11.3数据比例剥离、继承模块

把小数点给剥离

11.4 初始条件、信号转换模块

IC模块用于设置信号在0时刻的初始条件,对之后的信号值没有影响。

11.5 传输率过渡模块

该模块用于不同采样频率模块之间的连接。

11.6 信号规则模块

指定输入输出信号的属性,如果输入输出信号的属性和模块内指定的信号不同,会发出警告信号。

11.7 探测模块

11.8 加权采样时间模块、宽度模块

仅限TS输出输入信号的采样时间。该模块能够提取信号的采样时间,并对输入信号和采样时间进行运算。

12 信号通路库 signal routing

12.1 总线分配模块

对总线里的信号进行替换。

12.2 选择器模块、下标向量模块

重新排序将索引由[1 3]改成[3 1]就对行进行了重新排序。

12.3 合并模块

12.4 手动开关

鼠标双击进行开关切换。

12.5 多端口开关模块

12.6 Goto和From模块

一个from直接收一个goto,但是一个goto可以给多个from。

local表示Goto和From模块必须处在同一个子系统中,这是默认选项。global表示Goto和From模块只要不超出虚拟子系统(条件执行子系统除外),两者信号接通。

scoped此时引入下面的模块,这样不在同一子系统也是可见的。

12.7 数据存储、写入、读取模块

数据通过Data Store Write写入Data Store Memory,Data Store Read可以读取Data Store Memory中的数据。Data Store Memory在读写模块的相同层级(Data Store Read),或者在读写模块的上个层级(Data Store Write),那么都是有效的。

13 信号输出库(Sinks)

13. 1 文件及工作空间模块

to pile模块将数据写入一个.mat文件,这个文件名和变量名称在下面定义。

To Workspace将数据写入matlab的工作区内,不生成独立文件。

13.2 浮动示波器模块

浮动示波器模块通过下面红框选择要观察的信号。示波器可以保存收到的信号到工作空间生成变量。

13.3 XY Graph

上面输入x轴

下面输入y轴

两个输入都必须是随时间变化的函数信号。

13.4 Stop Simulation

输入非零值就终止仿真。通过与一个条件判断一起使用,当仿真使得设置的条件满足时,就终止仿真。

14 信号源库(sources)

 14.1 from输入源模块

from file模块写入要提取的文件名称就可以。

from workspace从工作空间提取变量对变量的格式有要求,所以可以利用sinks库里的to workspace模块,将要提取的变量a通过to workspace重新写入工作区生成变量b,from workspace提取变量b就可以了。

14.2  信号构造器和随机数模块

信号构造器可以图形化构造需要的波形,按住shift键点击节点可以左右移动。

随机数模块有两种

14.3 带限白噪声

14.4 重复序列

下图重复序列模块产生输出值与时间值一 一对应的重复序列

利用此模块也可以生成正弦波

重复阶梯序列如下

重复插值序列,插值方法不同,得到的重复序列不同。

14.5 计数器模块

14.6 时钟模块

时钟模块提供当前的仿真时间,连续时钟提供连续仿真时间,离散模块根据设置的采样时间提供离散仿真时间

15 用户自定义函数库(user-defined functions)

15.1  matlab  function

15.2 s-function

对于连续系统来说,核心是case1求导数的函数,这个函数输出是表达式里的导数值,这个函数是对状态变量进行更新的。

对于离散系统,核心是case1的离散状态更新,这里是对离散状态变量进行更新的。

function [sys,x0,str,ts,simStateCompliance] = my_sfuntmpl(t,x,u,flag)%%函数名和文件名要一样,t是仿真时间;x是状态,是一个n维的列向量;u是输入,也是n维的列向量,u(1),u(2)...
%%flag是一个标志
%SFUNTMPL General MATLAB S-Function Template
%   With MATLAB S-functions, you can define you own ordinary differential
%   equations (ODEs), discrete system equations, and/or just about
%   any type of algorithm to be used within a Simulink block diagram.
%
%   The general form of an MATLAB S-function syntax is:
%       [SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn)
%
%   What is returned by SFUNC at a given point in time, T, depends on the
%   value of the FLAG, the current state vector, X, and the current
%   input vector, U.
%
%   FLAG   RESULT             DESCRIPTION
%   -----  ------             --------------------------------------------
%   0      [SIZES,X0,STR,TS]  Initialization, return system sizes in SYS,
%                             initial state in X0, state ordering strings
%                             in STR, and sample times in TS.
%   1      DX                 Return continuous state derivatives in SYS.
%   2      DS                 Update discrete states SYS = X(n+1)
%   3      Y                  Return outputs in SYS.
%   4      TNEXT              Return next time hit for variable step sample
%                             time in SYS.
%   5                         Reserved for future (root finding).
%   9      []                 Termination, perform any cleanup SYS=[].
%
%
%   The state vectors, X and X0 consists of continuous states followed
%   by discrete states.
%
%   Optional parameters, P1,...,Pn can be provided to the S-function and
%   used during any FLAG operation.
%
%   When SFUNC is called with FLAG = 0, the following information
%   should be returned:
%
%      SYS(1) = Number of continuous states.
%      SYS(2) = Number of discrete states.
%      SYS(3) = Number of outputs.
%      SYS(4) = Number of inputs.
%               Any of the first four elements in SYS can be specified
%               as -1 indicating that they are dynamically sized. The
%               actual length for all other flags will be equal to the
%               length of the input, U.
%      SYS(5) = Reserved for root finding. Must be zero.
%      SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function
%               has direct feedthrough if U is used during the FLAG=3
%               call. Setting this to 0 is akin to making a promise that
%               U will not be used during FLAG=3. If you break the promise
%               then unpredictable results will occur.
%      SYS(7) = Number of sample times. This is the number of rows in TS.
%
%
%      X0     = Initial state conditions or [] if no states.
%
%      STR    = State ordering strings which is generally specified as [].
%
%      TS     = An m-by-2 matrix containing the sample time
%               (period, offset) information. Where m = number of sample
%               times. The ordering of the sample times must be:
%
%               TS = [0      0,      : Continuous sample time.
%                     0      1,      : Continuous, but fixed in minor step
%                                      sample time.
%                     PERIOD OFFSET, : Discrete sample time where
%                                      PERIOD > 0 & OFFSET < PERIOD.
%                     -2     0];     : Variable step discrete sample time
%                                      where FLAG=4 is used to get time of
%                                      next hit.
%
%               There can be more than one sample time providing
%               they are ordered such that they are monotonically
%               increasing. Only the needed sample times should be
%               specified in TS. When specifying more than one
%               sample time, you must check for sample hits explicitly by
%               seeing if
%                  abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD)
%               is within a specified tolerance, generally 1e-8. This
%               tolerance is dependent upon your model's sampling times
%               and simulation time.
%
%               You can also specify that the sample time of the S-function
%               is inherited from the driving block. For functions which
%               change during minor steps, this is done by
%               specifying SYS(7) = 1 and TS = [-1 0]. For functions which
%               are held during minor steps, this is done by specifying
%               SYS(7) = 1 and TS = [-1 1].
%
%      SIMSTATECOMPLIANCE = Specifices how to handle this block when saving and
%                           restoring the complete simulation state of the
%                           model. The allowed values are: 'DefaultSimState',
%                           'HasNoSimState' or 'DisallowSimState'. If this value
%                           is not speficified, then the block's compliance with
%                           simState feature is set to 'UknownSimState'.


%   Copyright 1990-2010 The MathWorks, Inc.

%
% The following outlines the general structure of an S-function.
%
switch flag,

  %%%%%%%%%%%%%%%%%%
  % Initialization %
  %%%%%%%%%%%%%%%%%%
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;%%flag=0调用初始化函数

  %%%%%%%%%%%%%%%
  % Derivatives %
  %%%%%%%%%%%%%%%
  case 1,
    sys=mdlDerivatives(t,x,u);%%flag=1,进行导数,连续仿真状态变量是求导

  %%%%%%%%%%
  % Update %
  %%%%%%%%%%
  case 2,%%flag=2,是离散系统进行更新状态用的,离散状态对于状态变量是每个采样周期更新状态
    sys=mdlUpdate(t,x,u);

  %%%%%%%%%%%
  % Outputs %
  %%%%%%%%%%%
  case 3,%%flag=3,进行输出的设置
    sys=mdlOutputs(t,x,u);

  %%%%%%%%%%%%%%%%%%%%%%%
  % GetTimeOfNextVarHit %
  %%%%%%%%%%%%%%%%%%%%%%%
  case 4,%%flag=4,离散系统计算下一个采样时间点
    sys=mdlGetTimeOfNextVarHit(t,x,u);

  %%%%%%%%%%%%%
  % Terminate %
  %%%%%%%%%%%%%
  case 9,%%模型的终止
    sys=mdlTerminate(t,x,u);

  %%%%%%%%%%%%%%%%%%%%
  % Unexpected flags %
  %%%%%%%%%%%%%%%%%%%%
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));

end

% end sfuntmpl

%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %%该函数用来进行模型的初始化,是必须要用的

%
% call simsizes for a sizes structure, fill it in and convert it to a
% sizes array.
%
% Note that in this example, the values are hard coded.  This is not a
% recommended practice as the characteristics of the block are typically
% defined by the S-function parameters.
%
sizes = simsizes;

sizes.NumContStates  = 0;%%连续状态变量的数目
sizes.NumDiscStates  = 0;%%离散状态变量的数目
sizes.NumOutputs     = 0;%%输出的数目
sizes.NumInputs      = 0;%%输入的数目
sizes.DirFeedthrough = 1;%%1表示有直接馈入,直接馈入指的是输出项目里面直接加减输入,即直接将输入加到输出上
sizes.NumSampleTimes = 1;   % at least one sample time is needed  %%

sys = simsizes(sizes);

%
% initialize the initial conditions
%
x0  = [];%%这是对状态变量进行初始化,有几个状态变量,方括号里就有几个初始值

%
% str is always an empty matrix
%
str = [];

%
% initialize the array of sample times
%
ts  = [0 0];%%第一个零代表采样时间,表示连续采样;第二个零表示偏移量。ts=[t1,t2],表示从t2开始,每隔t1采样一次

% Specify the block simStateCompliance. The allowed values are:
%    'UnknownSimState', < The default setting; warn and assume DefaultSimState
%    'DefaultSimState', < Same sim state as a built-in block
%    'HasNoSimState',   < No sim state
%    'DisallowSimState' < Error out when saving or restoring the model sim state
simStateCompliance = 'UnknownSimState';

% end mdlInitializeSizes

%
%=============================================================================
% mdlDerivatives
% Return the derivatives for the continuous states.
%=============================================================================
%
function sys=mdlDerivatives(t,x,u)%%在下面

sys = [];%%括号里写该函数的输出值,即表达式里上面带点的导数的变量

% end mdlDerivatives

%
%=============================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=============================================================================
%
function sys=mdlUpdate(t,x,u)

sys = [];

% end mdlUpdate

%
%=============================================================================
% mdlOutputs
% Return the block outputs.
%=============================================================================
%
function sys=mdlOutputs(t,x,u)

sys = [];

% end mdlOutputs

%
%=============================================================================
% mdlGetTimeOfNextVarHit
% Return the time of the next hit for this block.  Note that the result is
% absolute time.  Note that this function is only used when you specify a
% variable discrete-time sample time [-2 0] in the sample time array in
% mdlInitializeSizes.
%=============================================================================
%
function sys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime = 1;    %  Example, set the next hit to be one second later.
sys = t + sampleTime;

% end mdlGetTimeOfNextVarHit

%
%=============================================================================
% mdlTerminate
% Perform any end of simulation tasks.
%=============================================================================
%
function sys=mdlTerminate(t,x,u)

sys = [];

% end mdlTerminate

下面是plecs的c-script搭建的离散pid

16 最后的补充库

 16.1 直接传函ii

下面第二个模块与第一个模块功能相同,只是分子和分母的系数不从对话框输入,而是从外部输入。

16.2 补充数学库

下面的模块是进行加一和减一,左边两个是对实数进行操作,右面两个是对短整型进行操作。

下面两个模块是对输入减一和减去一个采样时间之后与零进行比较,输出较大的一个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值