simucpp系列教程(5)各模块的简要介绍

专栏所有文章见 simucpp系列教程


模块的命名方式为,单元模块以大写字母 U开头,矩阵模块以大写字母 M开头,复用/解复用模块除外。

单元模块分类介绍

下表是一些模块所具有的特殊特点,有很多模块具有下面的多个特点,下面按特点介绍。

端点模块IntegratorOutputUnitDelay
包含离散状态的模块InputNoiseOutputZOH
包含自定义函数的模块FCNFcnMISOInput
多输入单输出模块FcnMISOProductSum
包含输入增益的模块OutputProductSum
包含内部状态的模块IntegratorTransportDelayUnitDelay
信号源模块ConstantInputNoise

端点模块
  放在环路中不会引起代数环的模块。详见 模块次序表、代数环及其检测算法
包含离散状态的模块
  可以通过Set_SampleTime()设置采样(更新)周期的模块,每个周期的结束更新一次输出值,在 t ∈ [ n T , ( n + 1 ) T ) t\in[nT,(n+1)T) t[nT,(n+1)T)的时间段内输出值为 x ( n ) x(n) x(n)保持不变。以仿真步长 h = 0.01 h=0.01 h=0.01和采样周期 T = 1 T=1 T=1为例,在 t = 0 t=0 t=0 t = 0.99 t=0.99 t=0.99的100个采样点输出 x ( 0 ) x(0) x(0) t = 1.00 t=1.00 t=1.00 t = 1.99 t=1.99 t=1.99的100个采样点输出 x ( 1 ) x(1) x(1),以此类推。
包含自定义函数的模块
  自定义的函数有两种,FCNMISO使用多输入单输出的函数,FCN和INPUT使用单输入单输出的函数。
  有两种方法自定义函数,一种是使用lambda表达式(匿名函数),另一种是重写UserFunc类。
多输入单输出模块
  这些模块的不同之处在于,其它模块每次调用connect()函数设置的输入模块(孩子模块)会覆盖之前的设置,而这些模块每次调用connect()函数都会新添加一个输入模块。目前还没发现有需要覆盖设置的需求,因此多输入单输出模块暂时不能覆盖设置。
包含输入增益的模块
  可以通过Set_InputGain()函数设置输入增益的模块。PRODUCT和SUM模块的这个函数有两个参数,第一个是输入增益,第二个是该输入增益对应设置于哪个输入端口,默认或者"-1"表示设置最新添加的端口。
信号源模块
  没有输入端口,connect()函数为空。

单元模块单独介绍

  单元模块的共性在上一节中已经介绍,这一节介绍每个单元模块独有的特点。
常数模块 CONSTANT
可用输入模块代替,为方便使用而引入。输出常数。默认输出1。
自定义单入单出模块 FCN
默认将输入值输出。
自定义多入单出模块 FCNMISO
默认将第一个输入值输出。
放大器 GAIN
默认增益为1。
输入模块 INPUT
有两种输入模式,连续信号输入和离散信号输入。连续信号输入就是通过Set_Function()设置一个以时间自变量的自定义函数;离散信号输入就是从一个vector数组中读取数据,然后以给定的采样周期输出该数据。
连续模式下默认输出1,离散模式下如果没有提供数据默认输出0,如果仿真时间内提供的数据不够的话将持续输出最后一个值。
积分器 INTEGRATOR
噪声模块 NOISE
可用输入模块代替,为方便使用而引入。输出高斯白噪声。可指定采样周期。输出默认均值为0方差为1的标准正态分布。默认采样周期 − 1 -1 1,即每个仿真步长都输出新的采样点。
输出模块 OUTPUT
乘法器 PRODUCT
加法器 SUM
传输延迟模块 TRANSPORTDELAY
默认缓存一个采样点,缓存值默认0,默认输出0。由于仿真的离散性质,通过Set_DelayTime()函数设置的延迟时间会根据仿真步长计算出四舍五入应该缓存的采样点数。
单位延迟模块 UNITDELAY
用于构建离散传递函数。
零阶保持器 ZOH
在这里插入图片描述
  图中模块int1的输入是一个离散的控制器,但从图中的情况可以看出,如果输入模块in1的输出连续,则int1的输入也连续,不符合要求,此时就应该在in1的输出串接ZOH模块。int1的输入前串接也可。
  注意,零阶保持器在此处的作用是将连续平滑的信号转换成阶梯信号,而不是连续信号和离散信号之间的转换。

矩阵模块介绍

多路复用器 MUX
用于将多个单线信号转换成一个总线信号,即输入为多个单元模块。输出为一个矩阵模块。

多路解复用器 DEMUX
用于将一个总线信号分解成多个单线信号,即输入为一个矩阵模块。输出为多个单元模块。

组合模块介绍

下面的模块要大量用到std::vector<double>数据类型,而且在变量定义的时候也有点长,因此出于方便的考虑而添加自定义数据类型vecdble

typedef std::vector<double> vecdble;

在此特别说明以防使用时出现困惑。
连续传递函数
原型

TransferFcn(Simulator *sim,
        const std::vector<double> numerator,
        const std::vector<double> denominator,
        std::string name="tf");

以下示例表示
G ( s ) = 0.1 s + 1.5 10 s 2 + s + 1 G(s)=\frac{0.1s+1.5}{10s^2+s+1} G(s)=10s2+s+10.1s+1.5

TransferFcn* mdGs = new TransferFcn(&sim1, vector<double>{0.1, 1.5}, vector<double>{10, 2, 0});

内部结构为可控标准型,结构图如下
在这里插入图片描述
模块的Set_InitialValue()函数的输入和Get_OutValue()的输出参数均为std::vector<double>类型,分别设置上图中从左到右积分器组的初始值和获得积分器组的当前输出值。
离散传递函数
原型

DiscreteTransferFcn(Simulator *sim,
    const std::vector<double> numerator,
    const std::vector<double> denominator,
    std::string name="dtf");

以下示例表示
D ( z ) = 6.64 − 6.008 z − 1 1 − 0.3679 z − 1 D(z)=\frac{6.64-6.008z^{-1}}{1-0.3679z^{-1}} D(z)=10.3679z16.646.008z1

DiscreteTransferFcn* mdDz = new DiscreteTransferFcn(&sim1, vector<double>{6.64, -6.008}, vector<double>{0.3679});

对于下面的一般形式
D ( z ) = b 0 + b 1 z − 1 + b 2 z − 2 1 − a 1 z − 1 − a 2 z − 2 D(z)=\frac{b_0+b_1z^{-1}+b_2z^{-2}}{1-a_1z^{-1}-a_2z^{-2}} D(z)=1a1z1a2z2b0+b1z1+b2z2
对应simulink中的结构图如下
在这里插入图片描述
参数numerator写作

vector<double>{b0, b1, b2};

参数denominator写作

vector<double>{a1, a2};

由于离散传递函数的特殊结构,使用时要注意一下正负号,遵循奥本海姆《离散时间信号处理》第三版中的约定,对应直接Ⅱ型IIR结构。模块的Set_InitialValue()函数的输入和Get_OutValue()的输出参数均为std::vector<double>类型,分别设置上图中从上到下延迟器组的初始值和获得延迟器组的当前输出值。
求和器
积分器的简单离散化。结构如图所示。
在这里插入图片描述
状态空间传递函数
使用状态空间建立模型。
原型

    StateSpace(Simulator *sim, const zhnmat::Mat& A, const zhnmat::Mat& B,
        const zhnmat::Mat& C, const zhnmat::Mat& D, bool isc=true, std::string name="sts");
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值