Matlab电路仿真笔记

更新时间:2024-05-06 21:16:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Matlab电路仿真软件包-simpowersystems

1.入门

1.1.SymPowerSystem是什么 1.1.1.介绍

在Matlab提供的simulink仿真环境下,与其他建模产品结合在一起,用于对电子、机械系统进行建模。要学会使用SymPowerSystem,应首先学会使用Simulink仿真。

1.1.2.设计中的仿真的作用(略) 1.1.3.SymPowerSystem仿真库

你可迅速将SymPowerSystem投入使用。该库包含了许多典型的功率设备模型,例如,变压器、导线、机械、能源电子等。这些仿真模型来源于产品手册,基于工程实际。 SymPowerSystem包含一个主要的库:powerlib。powerlib库显示了所有包含的模块和模块名称。

1.1.4.SymPowerSystem中的非线性模块(略) 1.1.5.仿真时需要的环境:

Maltab 和Simulink

1.2.如何使用该指南 1.2.1.对于新用户

将学会如下知识和技能:

(1) 使用该库创建和仿真电子电路模型

(2) 将一个电子电路于simulink模块连接在一起 (3) 分析电子电路的稳定状态和频率响应 (4) 离散化模型,以便加快仿真速度 (5) 使用矢量图仿真方法

(6) 构建自定义的非线性仿真模型

1.2.2.对于经验丰富的模块用户(略) 1.2.3.所有用户(略) 1.3.创建和仿真简单的电路 1.3.1.介绍

SymPowerSystem允许你对包含线性或非线性的电子电路进行建模和仿真。在本章节中,您将学习到:

(1) 浏览SymPowerSystems的powerlib库

(2) 如何利用SymPowerSystem创建一个简单的电路 (3) 如何将电路与simulink模块互联。 下述电路是即将创建的电路:

图1 要建模和仿真的电路

1.3.2.使用powerlib创建电路

(1) 使用如下命令打开powerlib:

powerlib

(2) 从powerlib的文件菜单下,允许“新建”菜单命令,新建一个空白电路稳定,

存为:circurt1

(3) 打开Electrical Sources库,复制其中的AC Voltage Source模块到circuit1中 (4) 双击AC Voltage Source,打开其属性设置对话框,按图1所示进行设置 (5) 改模块的名称为“Vs”

(6) 将elements库中的Parallel RLC Branch模块复制到circuit1中,按图1进行参数设置

(7) 用同样的方法加入其他模块到电路中

(8) 注意加入的传输线模块:传输线模块模型图如下(这是一段模型,一条导线通

常有若干段,每一段参数都一样,如图1所示):

该模型是对参数分布一致的传输线的模拟。它能传输的电信号最大频率近似为:

fmax=Nv/(8l)

其中,N---PI节数,

v---导线传输速度,v=1/(sqrt(L*C)) l----导线长度。

关于Series RLC Load模块:

描述该模块的有如下参数:

normal voltage Vn(Vms):额定电压(有效值) normal frequency(Hz):额定频率 active power(w):有效功率(有功功率)1

Inductive reactive power QL:感性无功功率 Capacitive reactive power QC:容性无功功率 (9)加一个电压测量模块(Voltage mesure block)到电路中,该模块位于mesurements库中 然后将simulink中的scope模块添加到电路中,并将其与电压测量模块互联。

1.3.3.将电子电路与simulink连接起来

电压测量模块(Voltage mesure block)是SymPowerSystem模块与simulink模块直接的接口。对于上面的例子,你实现了一种从电路到simulink信号的接口。电压测量模块将电压转换成simulink信号。

类似的,电流测量模块(current mesure block)能将电流转换为simulink信号。

你也可以将simulink信号连接到电路中,例如,你也可以将受控电压源加入到电路中。如图2所示。

1

电阻消耗的功率

图2

1.3.4.测量电压和电流

电压测量模块和电流测量模块有方向规定,标+为正向,规定的方向是从正到负,若电压值或电流值为+,则表示他们的方向与规定方向相同,否则,相反。

万用表模块(multimeter)则没有事先规定的方向,它是根据仿真结果仿真后才显示方向的。可以通过如下命令了解方向:

get_param(gcb,'Orientation')

1.3.5.连接电容和电感的基本原则

(1) 理想电压源不能与纯电容并联

(2) 理想电流源不能与纯电感串联。

违反上述原则,电路将无法仿真。必须修正。方法是在电容旁串联一个小电阻或在纯电感两端并联一个大电阻。

1.3.6.使用powergui模块仿真simpowersystem模型

powergui模块对于任何包含simpowersystems模块的simulink模型的仿真是必须的。他用于存储等价的simulink电路,这些电路用来表示simpowersystem模块的状态方程。当您在仿真中使用该模型,应遵循以下原则:

? 将powergui模块置于仿真图的顶层用以优化性能。然而,你也可以把它置于任何

?

需要的地方。例如,在一个子系统中。这不会影响系统功能; 其他(略)

1.4.简单电路分析 1.4.1.介绍

本节你将学习: ? ?

使用power_analyze命令获取模型的状态空间描述

使用powergui的图形用户接口计算电路的稳态电压和电流 ? 电路的频域分析

1.4.2.电路状态变量

电路状态变量是与电路中的电感和电容元件有关的状态变量。许多模块中包含了电感或电容,如并联RLC模块,PI SectionLine模块,等等。

电路的状态变量有电路中各电容的两端电压和流经各电感的电流组成。电路状态变量的名称由系统自动产生,其命名规则如下:

? ? ?

变量名由两部分组成:前导符_后缀。前导符和后缀之间用下划线隔开; 前导符为Il或Uc(Il表示流经电感的电路,Uc表示电容器两端的电压)‘ 后缀为模块名称。

1.4.3.使用power_analyze进行状态空间描述

你可以使用power_analyze获取一个电路模型的状态空间描述,例如输入下面的命令,可以获取上面创建的简单电路的状态空间描述信息:

[A,B,C,D,x0,electrical_states,inputs,outputs]=power_analyze('circuit1')

x’=Ax+Bu y=Cx+Du

要判定电路是否稳定,只要求A的特征值,看看A的特征值的实部是否都小于0,只有满足此条件,电路才是稳定的。

1.4.4.稳态分析

使用powergui的图形用户接口命令可以进行电路的稳态分析。 菜单命令:Analysis tools-->Steady-State Voltages and Currents

1.4.5.频率分析

powerlib包含了一个阻抗测量模块(Impedance Measurement),可以用于测量电路中任意两点间的阻抗。接下来,你将使用两种方法,利用该模块测量节点B2点的阻抗:

? ?

基于状态空间模型进行计算

使用阻抗测量模块和powergui模块进行测量

散化电路模型(discretize electrical model)。设置采样周期25e-6s。重新开始仿真,功率系统将使用Tustin方法(相应于梯形积分)并以25us采样周期进行离散化。

打开“Simulation > Simulation parameters > Solver”对话框,设置仿真时间为0.2s。启动仿真。

注:一旦系统被离散化,电路系统再无连续状态了。因此,如果你不需要变步长积分方法进行仿真,在“Simulation > Simulation parameters > Solver”对话框中,可选择Fixed-step 和 discrete选项,并设定固定步长为25us 为测量仿真时间,可运行下面的命令重新仿真:

tic; sim(gcs); toc

当仿真完成后,其间所经历的时间会显示在Matlab命令行窗口。

要返回连续仿真状态,打开powergui模块,选择“continuous”选项。如果比较一下连续仿真和离散仿真,你会发现离散仿真比连续仿真将近快3.5倍。

要比较两种仿真方法的精度,请完成下列三个仿真:

(1) 仿真连续系统,Ts=0 (2) 仿真离散系统,Ts=25us

(3) 仿真离散系统,Ts=50us

对于每一个仿真,将U2值保存到不同的变量中,相应的为U2c,U2d25,U2d50,使用下列命令绘制U2波形:

plot(U2c(:,1), U2c(:,2), U2d25(:,1),U2d25(:,2), U2d50(:,1),U2d50(:,2))

从上图中,可以看出,25us的离散化系统已经非常接近连续系统了,50us有较大误差。

1.7.矢量仿真方法简介 1.7.1.介绍

本节你将学会: ? ?

将矢量仿真方法用于简单的线性电路中 了解该方法的优点和局限性

到目前为止,你已经学会了两种仿真电路的方法: ? 使用连续simulink求解器及变步长进行仿真 ?

用离散化方法及固定步长进行仿真 本节介绍的是第三种方法-矢量求解法进行仿真

1.7.2.何时使用矢量求解法

矢量求解法主要用于研究功率系统的电子机械振荡,这类系统一般由大型的发电机和电动机组成。例如,可以使用这种方法对三相系统和机械类的多机械系统进行仿真。然而,该不方法不仅仅局限在机械的暂态稳定性研究领域,完全可以拓展应用到任何线性系统上。

在一个线性电路中,如果你所感兴趣的仅仅是当开关处于关或开的状态下所有电压和电流的幅值和相位,那么,就没有必要求解由电阻、电容和电感交互作用而带来的差分方程(也即状态空间模型)。你仅仅需要求解相对而言简单得多的与电压和电流相位有关的代数方程组,这正是矢量求解法所要解决的问题。顾名思义,该方法以矢量描述电压和电流。矢量是一个复数,可以用来表示特定频率下的正弦电压和电流。矢量既可以用笛卡尔坐标(Cartesian coordinates)表示(复数的实部与虚部),也可以用极坐标(polar coordinates)表示。在忽略电路状态的情况下,矢量求解法无需特定的求解器用于求解系统的电路部分。因此仿真速度要快得多。但应始终记住,这种快速求解技术只能给出某个特定频率下的结果。

1.7.3.电路暂态过程的矢量仿真

下面你将会把矢量求解法应用到一个简单的线性电路上。打开powerlib的演示实例库,打开通用演示库(General Demos library),选择名称为“暂态分析”的示例,一个名为power_transient的系统打开了,如下图所示:

可以通过各模块参数设置对话框,看看各模块设置的参数。

(1)激活powergui中的矢量求解法

现在,你将使用矢量求解法仿真同样的电路。这种选项可以通过打开powergui来设定,具体设置请参考在线帮助。设定该选项后,continues变为phasors,在启动仿真前,还需指定输出到示波器上的信号的格式。

(2) 选择矢量信号测量的格式 双击“Voltage Measurement”模块或“Current Measurement”模块,可以看到有一个菜单,通过该菜单可设置矢量信号的四种输出格式:complex(复数,默认),real-imag(实部-虚部),magnitude-angle(幅度-角度),magnitude(幅度)。当你要处理的信号为复数信号时,由于示波器(scope)只能观察信号幅度,因此,这里选择“magnitude”。

重新启动仿真,60Hz的电压和电流的幅度显示在示波器(scope)上。从连续仿真和矢量仿真得到的波形上,可以看出他们的波形是有区别的。但他们反映了统一规律。 注意到:连续仿真情况下,电路波形状态改变出现在断路器打开时电流的下一个0点位置。而对于矢量仿真,电路波形状态改变与断路器开关时刻是同步的。

(3) 处理电压和电流矢量

“complex”格式允许运用复数运算和矢量处理,无需将实部和虚部分离。例如,假设你要计算负载的功耗(有功功率P和无功功率Q),而复数功率s可通过下式计算:

S?P?jQ?*

12?U?I

*这里的I是电流矢量的共轭复数。1/2用于将电压和电流的幅度从峰值转换为有效值。

设置电压和电流的输出值均为“complex”格式,利用来自Simulink Math库的模块,实现功率的测量,如下图所示:

2.高级组件和技术 2.1.功率电子简介

2.2.仿真变速发动机的控制 2.3.三相系统和机械 2.4.构建和定制非线性模型 2.4.1.介绍

SimPowerSystems提供了大量非线性元器件模型。然而,有时,你可能需要定制自己的模型并将其与SimPowerSystems提供的标准器件模型相连。定制的模型可能是一种用来模拟一段电弧或变阻器的非线性电阻,也可能是可饱和的电感,一种新的类型的发电机或电动机等等。

在本节中,你将学习如何在simulink中定制自己的非线性模型。这里以一个简单的可饱和的非线性电感和非线性电阻为例来说明。

2.4.2.一个非线性电感的建模

考虑一个工作在额定频率为fnom=60Hz、额定电压Vnom=120V RMS的2H的电感。从0-120V RMS范围内,电感值为一个常数:2H,当电压超过其额定电压时,电感饱和,将为0.5H,下图绘制的是该电感的非线性特征曲线,电流量(current)和磁通量(flux)的刻度为每单位(per unit),额定电压和电流被选为每单位的基准值。

流经电感的电流是磁通量?的非线性函数,依次,磁通量是电感两端电压的非线性函数,该关系可用下列方程描述:

v?L?didt?d?dt 或 ???vdt

i??L(?)

因此,该电感的非线性模型可以用一个受控电流源来描述,电流i是电压v的非线性函数,如下图所示:

“非线性电感的实现”一节给出了一个包含2H非线性电感的电路,该非线性电感与两个电压源(1个120V、60Hz的交流电压源和一个直流电压源)和一个5欧的电阻串联。

所有用于构建非线性电感的元件都被组合在一个名为非线性电感的子系统中,电感的两端标有“in”和“out”。注意,第2个输出返回的是磁通量?,也被加到子系统中,将该输出连接到scope模块,可以观察磁通量的变化。

该非线性模型使用了两个powerlib模块和两个simulink模块。这两个powerlib模块分别是电压测量模块(用于读取电感两端的电压)和控制电流源模块(controled current source),根据模型上的标示,该电流的箭头方向是从输入到输出。如上图所示。

两个simulink模块分别是积分模块(用来计算来源于电压输入的得到的磁通量),和一个查表模块(look_up table)(用来描述i和?的关系特征)

powerl_extra的两个Fourier(傅里叶)模块用于分析电流的基本成分和直流成分。按上图建立仿真模型,为实现i=f(?),在查表模块中指定下列两个向量。

Vector of input values (flux) [-1.25 -1 1 1.25 ] *(120*sqrt(2)/(2π*60)) Vector of output values (current) [-2 -1 1 2]*(120*sqrt(2)/(4π*60)) 将你的电路保存为circuit7,为两个电源设置下面的参数: AC source

? Peak amplitude 120*sqrt(2) ? Phase 90 degrees ? Frequency 60 Hz DC source

? Amplitude0 V

调整仿真时间为1.5s,选择ode33tb积分算法作为默认参数,并开始仿真。仿真结果与计算一致。

2.4.3.定制自己的非线性模型

simulink提供了一种面板(mask)工具,来为你自定的模型创建对话框,你可以一个指定下列几个提示和变量:

Nominal voltage (Volts rms):Vnom Nominal frequency (Hz):Fnom Unsaturated inductance (H):L

Saturation characteristic [i1(pu) phi1(pu); i2 phi2; ...]:sat 最终的结果如下图所示:

下列代码在模板初始化时准备了两个向量,Current_vect 和 Flux_vect,以用于look_up table模块。

% Define base current and Flux for pu system I_base = Vnom*sqrt(2)/(L*2*pi*fnom); Phi_base = Vnom*sqrt(2)/(2*pi*fnom);

% Check first two points of the saturation characteristic if ~all(all(sat(1:2,:)==[0 0; 1 1])),

h=errordlg('The first two points of the characteristic must be [0 0; 1 1]','Error'); uiwait(h);

end

% Complete negative part of saturation characteristic [npoints,ncol]=size(sat); sat1=[sat ; -sat(2:npoints,:)]; sat1=sort(sat1);

% Current vector (A) and flux vector (V.s) Current_vect=sat1(:,1)*I_base;

Flux_vect=sat1(:,2)*Phi_base;

打开查表模块对话框,输入如下两个变量名:

Vector of input values (flux) Flux_vect Vector of output values (current) Current_vect 关闭对话框,重新开始仿真,可得到同样的系统。

2.4.4.非线性电阻的建模

非线性电阻的建模与非线性电感的建模类似。

一个典型的例子是金属氧化物电阻器具有下列伏安特征:

?vi?I0??V?0?? ???

这里 v, i =瞬时电压和电流 Vo =保护电压 Io =参考电流

α =非线性特征指数 (典型值在10-50之间) 下图显示了非线性电阻的应用。

上面的方程是一个代数方程,其在状态空间中是一个代数循环,尽管simulink也能完成循环运算,但是会减低仿真速度,为此,通常在不改变原始非线性特征的前提下在中间加入一个一阶传递函数环节1/(1+Ts),通常取T为较小的值,如(T=0.01us)。使用工具封装该非线性电阻模块的参数。

2.4.5.创建自己的库

simpowersystems允许用户创建自己的模块库,要创建自己的模块库,选择“file >new library”,一个新的simulink:Untitled的窗口打开了。将你创建的非线性电感模块和非线性电阻模块拷贝到该窗口中,保持该库就可用了。

2.4.6.将你的模型与别的非线性模型连接起来

应当考虑电流源不能与电流源串联,电流源不能与纯电感串联,若遇到此种情况,可用考虑在电流源旁边并联一个极大的电阻。

2.4.7.使用模型构建命令创建模型

通常,不建议这样做,有兴趣的,可以参考Matlab相关帮助,下面给出一个例子: add_block('powerlib/Elements/Pi Section Line','Mymodel/Block1'); add_block('powerlib/Measurements/Voltage Measurement', 'Mymodel/Block2');

set_param('Mymodel/Block1','position',[340,84,420,106]); set_param('Mymodel/Block2','position',[520,183,545,207]);

Block1PortHandles = get_param('Mymodel/Block1','PortHandles'); Block2PortHandles = get_param('Mymodel/Block2','PortHandles');

add_line('Mymodel',Block1PortHandles.LConn(1), Block2PortHandles.LConn(1));

add_line('Mymodel',Block1PortHandles.RConn(1), Block2PortHandles.LConn(2));

writeDocFeedbackSurveyLink();

3.附录 3.1.常用模块

3.1.1.阻抗测量模块(impedance mesurement block)

(1)描述

阻抗测量模块用于测量线性电路中的两个节点间的阻抗,两节点间阻抗是频率的函数。将其输入分别接到电路上的两个节点,便可以使用powergui的分析工具计算两节点间的阻抗了。该模块不改变电路的特性。

3.1.2.断路器(breaker)

(1)描述

断路器实现了一种可以通过外部或内部控制电路开、关时刻的电路。该模型包含了一个串联RC缓冲器电路,可以把它连接到电路断路器上。如果断路器刚好与感性电路、开路电路或电流源串联,就必须使RC缓冲器电路连到其中。

当断路器被设为外部控制模式(external control mode),一个simulink输入就会出现在断路器的图标上,控制信号必须为0或1(0表示开关断开,1表示开关闭合)。 当断路器设为内部控制模式(internal control mode),开关时刻由其参数设置对话框设定。

当断路器处于闭合状态,其等效于一个电阻Ron。Ron可以被设为很小的值(典型值为10m欧),从而与外电阻比较而言可以忽略。当断路器处于断开状态,其等效于一个无穷大的电阻。

灭弧过程是通过在控制信号由1变为0后的第一个电流为0的时刻断开断路器来模拟的。条件如下表所示。 操作 断路器闭合 条件 控制信号变为1(对离散系统,控制信号保持为1的时间应至少为采样周期的3倍) 控制信号变为0 流过断路器的电流为0 断路器断开 注:断路器模块对直流电路可能不合适。对于直流电路,推荐使用理想开关作为开关元器件。

(2)对话框和参数

Breaker resistance Ron(断路器电阻Ron) 该参数不能设为0

Initial state(初始状态)

断路器的初始状态,设为1表示闭合,设为0表示断开。

当设为1时,SimPowerSystems自动初始化电路的所有状态和断路器电流,以确保仿真开始时电路就进入稳态。

Snubber resistance Rs(缓冲器电阻Rs) 单位,欧姆,若将此值设为inf(无穷大),则相当于电路中不包含缓冲器。

Snubber capacitance Cs(缓冲器电容Cs)

单位:法拉,若将此值设为0,则相当于不包含缓冲器,设为inf则为一个纯阻性缓冲器

Switching times(开关切换时刻)

这是一个向量,用于指定开关切换状态的时刻,各时刻的开关状态取决于初始开关状态。例如,若初始状态为闭合,则向量的第1个元素对应的时刻断路器将断开,第2个元素对应的时刻断路器将闭合,等等。若选中“External control of switching times”选项,则开关时刻由外部控制,此处没必要设置。

External control of switching times(外部控制开关时刻)

若选中了此选项,请加入一个外部simulink输入,来控制断路器的开关。开关时刻由连接到此断路器上的外部逻辑输入信号定义(0或1)

mesurements(测量)

选定“branch voltage”用于测量断路器上的压降; 选定“branch current”用于测量流经断路器的电流;

选定“Branch voltage and current”用于测量压降和电流 将Multimeter模块加入电路,便可以显示上面选定的参数。

(3)使用注意事项

当该模块与电感或电流源串联时,必须在其中加入缓冲器电路。在大多数情况下,可使用纯电感缓冲器(此时将“Snubber capacitance Cs”设为inf),而缓冲器电阻设为高阻值的电阻(1e6等)。由于模型限制,开关电阻不能设为0。

必须使用刚性积分算法仿真这种带有断路器的电路。ode23t且以默认参数通常可以得到较高的仿真速度。

对于离散化的模型,控制信号保持为1的时间应至少为采样周期的3倍,否则,电路相当于开路。

(4)应用举例

3.1.3.二极管(Diode)

3.1.4.被控电流源(controled current source)

被控电流源模块将simulink输入转换为等效的电流源,产生的电流受模块的输入信号控制。正向电流方向与该模块中的箭头方向一致。可用指定的交流和直流初始化被控电流源,若想在稳态下仿真,模块的输入必须连接到与初始值相应的正弦或直流信号上。

注:在矢量仿真中,连接到该模块的输入必须为复数值,此时需要手工设置。

(1)对话框与参数

Initialize

若选定该选项,则将用指定的Initial current, Initial phase, 和Initial frequency parameters初始化该模块。

Source type

设置电流源类型是直流电流源还是交流电流源 Initial current

初始峰值电流(A)

Initial phase

初始相位(度数),对直流电源来说,不存在初始相位。 Initial frequency 初始频率 mesurements

选定电流选项使得可用mutimeter测其电流

3.1.5.if模块

if模块,连同包含action port模块的action子系统,用于实现标准的类似于C语言的if-else逻辑。下图显示了一个完整的if-else控制流:

3.1.6.Merge模块

3.2.创建模块封装(block mask) 3.2.1.关于封装(mask)

(1)何谓封装

封装是一种定制的用户接口,利用该接口,模块用户可以对模块的内部参数进行设置。 (2)封装特点 封装包含如下特征: ? 封装图标(icon)

? 封装参数

simulink允许为一个封装的模块定义一组可调的参数,并将这些参数存储在封装工作空间中(mask workspace)。

? 封装参数对话框

simulink允许封装参数设置对话框以取代默认的标准子系统对话框。 ? 封装初始化代码 ?

封装工作空间

3.2.2.一个封装子系统的例子

(1)介绍

要封装的模型用如下表达式表示: y=mx+b 如图所示

通常情况下,当你双击一个子系统,就会出现一个新窗口,显示该子系统的内部组成。本例将自定义一个封装对话框和封装图标,如下图所示:

(2)创建封装对话框提示

?

选定要封装的subsystem模块,Edit>mask subsystem,按下图所示输入:

不懂,请看在线帮助。若系统不支持中文字符提示,请在命令行中运行下列命令: set_param('circuit4', 'SavedCharacterEncoding', 'windows-1252')

(3)创建封装描述和帮助文本

(4)创建block图标

可使用绘图命令改变子系统上的默认图标。

3.2.3.封装一个模块

(1)关于模块封装

可以利用模型编辑器(model editor)封装子系统,模型,S函数模块,以及利用set_param命令封装内建模块。

2

(2)封装一个子系统

3.2.2节已经做了介绍。此处略。

(3)封装内置模块

通过直接封装内置模块而不是将他们放到一个子系统中,可以减小你的模型的大小。要封装一个内置模块:

?

选择模型中的模块

? 键入下列Matlab命令: set_param(gcb,'Mask','on')

? 在模块的快捷菜单中选择“Edit Mask”命令,就可用它编辑该模块的封装了。

2

simulink不支持封装端口模块(port block),如Inport,Outport,Trigger等 确保封装的参数名称与已知模块参数名称不同。

3.2.4.封装编辑器(mask editor)

(1)创建子模块(略) (2)icon面板(略) (3)参数面板(略)

(4)控件类型(control types)

通过下图所示对话框进行设置:

(5)初始化面板(initialization pane)

初始化面板允许你输入matlab命令初始化封装的子系统。 在下列情况下,simulink将执行初始化命令: ? 装入模型 ? ? ?

封装模块的图形外观发生变化,如旋转。 在同一模型内或不同模型间复制封装模块时 开始仿真或更新模块图时

? 对模块对话框作出任何参数改变时 初始化面板包含下列控件:

? 对话框变量

列出了所有与模块封装参数有关的变量 ? 初始化命令

输入任意合法的Matlab命令。 ? ? ? ?

允许库模块改变其内容

不要在初始化命令中创建动态对话框 避免使用以L_和M_开头的变量名 避免使用set_param命令 初始化命令的局限性:

(6)文档面板(document pane)

在上一节已经做了介绍,现在仅介绍新的内容:也就是,在定义在线帮助内容时,不仅可以直接输入帮助文本内容,也可以使用下列帮助文本:

URL 说明 (以 http:, www, file:, ftp:, or mailto:开始) web 命令(launches a browser)

eval 命令(evaluates a MATLAB string) html文本

举例:

http://www.mathworks.com file:///c:/mydir/helpdoc.html

web([docroot '/My Blockset Doc/' get_param(gcb,'MaskType')... '.html'])

eval('!Word My_Spec.doc')

3.2.5.将封装参数与模块参数链接起来

3.2.6.创建动态封装参数对话框 3.2.7.封装库模块 3.3.仿真动态系统

3.3.1.模型编译(model compilation)

当你选择“开始仿真”命令时,仿真便进入第1阶段,在此阶段,simulink引擎将启动模型编译器,模型编译器将模型转换为可执行的形式,此过程就称为编译。具体地讲,编译

器将完成以下工作:

? ? ? ? ? ? ?

模型参数值的计算

确定那些没有明确指定的信号属性,如名称,数据类型、数值类型、维数等,并检查每个模块是否接受连接到其输入端的信号。

simulink使用所谓的“属性传播”来确定那些未指定的属性。这个过程是将源信号的属性遗传给目标信号的属性的过程。 执行模块优化。

扁平化模型结构,即以子模块实际保护的模块替代子模块; 确定模块的排序

确定那些没有明确指明采样间隔的模块的采样间隔

3.3.2.链接阶段(link phase)

这个阶段,simulink引擎将为模块图的执行分配内存空间(信号、状态和运行时参数),同时也分配运行时为保持每个模块中间信息的内存。对于内置模块,模块的主要数据结构被称为SimBlock,它存储的是模块的输入与输出缓冲区、状态、工作向量的指针。

(1)method excution lists(方法执行列表)

在链接阶段,simulink也负责创建方法执行列表,该表列出效率最高的模块次序,以便按这个次序激活模型的模块方法,计算模块的输出。

(2)模块属性

simulink允许你为模块分配更新属性。simulink按优先级高低来决定执行顺序。

3.3.3.仿真循环阶段(simulation loop phase)

链接阶段结束后,进入仿真循环阶段。simulink引擎从仿真开始到结束时间内,利用模型提供的信息,每隔一个间隔,计算一次系统的状态和输出。那些状态和输出计算的连续时间点,称为时间步(time step)。相邻两个时间步的时间长度称为步长。步长取决于求解器的类型,系统的连续状态、连续系统是否有不连续点。

循环阶段又分为两个子阶段:循环初始化阶段和循环往复阶段。初始化阶段过后,便进入循环往复。每隔一个时间步长循环一次。

在仿真开始后,模型指定初始状态和系统输出。在每一步,simulink计算新的值、新的输出。simulink提供了数据显示和记录模块,可以在仿真过程中显示和记录过程数据。

3.3.4.求解器(solvers)

simulink在仿真过程中要反复计算状态和输出,这就需要用到一序列的算法,simulink已经编制了这些算法的程序,称为求解器。

Configuration Parameters对话框允许你选择合适的求解器。

(1)定步长求解器和变不长求解器 (2)连续与离散求解器

对于连续和离散混合模型,只能使用连续求解器。

离散求解器也包含定步长和变步长两种。

3.3.5.零交点探测器(zero-crossing detectors) 3.3.6.代数循环(algebraic loop)

一些simulink模块拥有直接注入的输入端,这意味着若不知道这些输入端口的信号值,就无法计算模块的输出值。具有直接注入输入端口的模块有:

? ? ? ?

Math Function block Gain block

Integrator block's initial condition ports

Product blockState-Space block when there is a nonzero D matrix

? Sum block

? Transfer Fcn block when the numerator and denominator ? are of the same order

? Zero-Pole block when there are as many zeros as poles 当一个带有直接注入的输入端口由同一模块的输出驱动时(要么直接驱动,要么由别的带有直接注入端口的反馈间接驱动),通常就会出现代数循环。代数循环的例子就是如下所示的简单的标量循环:

从数学角度来讲,该循环暗示z=u-z,即z?12u,这就是求解表达式。但大多数代数循

环就无法通过这种检查自动计算。

创建带多个代数状态变量(如z1,z2等)的向量代数循环是非常容易的。如下图所示。

使用Algebraic Constraint模块是建模代数方程和指定初始化估值的一个方便的方法。该模块将它的输入信号f(z)限制到0,并输出代数状态z。该模块输出一个值,该值对于在模块的输入端产生一个零点是必须的。输出必须通过反馈直接影响到输入,例如,该反馈通道单独包含带有直接注入的模块。在代数限制模块对话框中,你可以提供一个初始的代数状态值以改善代数循环求解器的效率。

一个标量代数循环表示的是一个代数方程或形如F(z)=0的限制方程,这里的z是循环中的一个模块的输出,而函数F由从循环中别的模块到该模块的输入间的反馈通道组成。在上上一个例子中F(z)=z-(u-z)。在本例中,代数方程为:

z1+z2-1=0 -z1+z2-1=0

当一个模型中包含F(z)=0的限制时就会出现代数循环。这种限制可能是作为一个你所创建的系统的物理内部连接的因果关系而出现的,或者你建立的正是一个代数/差分系统(DAE)。

当一个模型包含代数循环时,simlink将在每一个时间步中调用循环求解子程序,以求得其结果。包含代数循环的模型求解过程比不包含代数循环的模型要耗时。

为求解F(z)=0,simulink循环求解器使用牛顿法求解偏导数方程。尽管该方法鲁棒性好,但若没有合适的代数状态初始化值,则可能得不到结果。因此,你可以在代数循环中通过在那条线上(处于循环中)加入一个IC模块来为那条线指定一个初始估值。如上所示,另一个方法是通过使用代数限制模块指定初始值。

只要可能,请为循环中的代数状态变量指定初始估值,也就是使用IC模块或Algebraic Constraint模块。

(1)高亮代数循环

当你更新、仿真或调试模型时,可以使simulink高亮代数循环。

为了在仿真或更新时使simulink高亮自己探测到的代数循环,请在“Configuration Parameters”对话框的“Diagnostics”面板上,设置“Algebraic loop”为error。

(2)消除代数循环

simulink能消除包含下列模块的代数循环:

? Atomic Subsystem ? Enabled Subsystem ? Model

为了能使simulink能够自动消除涉及Atomic subsystem和Enabled Subsystem的代数循环,在模块参数对话框中选择“Minimize algebraic loop occurrences”选项。

本文来源:https://www.bwwdw.com/article/3gtg.html

Top