simulink动态系统建模仿真_第1页
simulink动态系统建模仿真_第2页
simulink动态系统建模仿真_第3页
simulink动态系统建模仿真_第4页
simulink动态系统建模仿真_第5页
已阅读5页,还剩259页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章高级仿真概念7.1过零检测7.2处理代数循环7.3高级积分器7.4仿真诊断选项设置7.5仿真性能优化设置 7.1过零检测

7.1.1过零检测的工作方式

状态变量中的不连续常常表征了动态系统的重要事件,例如,当弹球撞击地板时,撞击的位置是不连续的。由于不连续性常常表示动态系统的一个重大改变,因此对不连续点进行精确仿真是非常重要的,否则,仿真可能会导致错误的结论。还以仿真小弹球为例,如果在两次仿真步之间小球撞击了地板,那么被仿真的小球在半空中就会翻转方向,这就会使研究人员对小球的物理运动得出错误的结论。为了避免这样的错误,对不连续点进行仿真是非常重要的,当然,完全依赖仿真算法来确定仿真时间是不能满足这样的要求的。以定步长算法为例,定步长算法在固定步长的整数倍时刻计算状态变量的值,但是,谁也不能保证不连续点的出现时刻就在定步长的整数倍时刻。用户也可以减小步长以增大撞击到不连续点的可能性,但这无疑会增加仿真的执行时间。这样看来,变步长算法似乎可以解决这样的问题。变步长算法会动态地调整步长,当状态变量变化缓慢时增大步长,而当状态变量变化快速时减小步长,在不连续点处,变量的变化是非常迅速的。这样,从理论上来说,变步长算法应该可以准确地找到不连续点,而存在的问题是定位不连续点的精确性。为了找到不连续点,变步长算法必须采用越来越小的步长,这样就大大降低了仿真的效率。虽然这会放慢仿真的速度,但这样做对有些模块来讲是至关重要的,因为这些模块的输出可能表示了一个物理值,它的零值有着非常重要的意义,也有可能这些模块用来控制另外的一些模块。事实上,只有少数模块能够发出事件通知,而且可能与不止一个类型的事件发生关联,当一个模块通知说前一个时间步上发生了过零,那么变步长求解器就会缩小步长,即使绝对误差和相对误差是可以接受的,它也会告知系统有事件发生。这个事件的通知过程如图7-1所示。图7-1Simulink利用过零检测来解决这样的问题。它是在系统和求解器之间建立一种对话工作方式,对话包含的一个内容就是事件通知,Simulink将消息由系统传送到求解器,即系统告知求解器在前一个时间步上发生了一个事件,一个重要的事件就是“发生了一个过零!”,事件都由过零表示。过零通常在下面两个条件下产生:

(1)信号在上一个时间步改变了符号,即由正变负或者由负变正,包含变为0和离开0;

(2)模块在上一个时间步改变了模式,例如积分器进入了饱和区段。使用Simulink中的过零检测后,模块在仿真开始时注册一组过零变量,其中的每个变量都是可能含有不连续状态变量的函数,当发生不连续时,过零函数会从正值或负值穿越零。在每个仿真步结束时,Simulink会要求每个已注册过零变量的模块更新变量,然后检查在仿真时间步的结束时刻是否有变量改变了符号,如果有,则表示在当前这个时间步上系统出现了不连续点。

如果检测到过零,则Simulink会对每个改变符号的变量在前一时间步和当前时间步之间进行插值,以估算过零的准确时刻;然后,Simulink再逐渐增加时间步,并依次越过过零点进行仿真。利用这种方法,Simulink避免了对不连续点的仿真,而在很多情况下,这些不连续点处的状态变量的值可能都没有定义。7.1.2过零检测的实现方式

过零检测可以使Simulink精确地仿真不连续点,而不必过多地选用小步长。实际上,Simulink中的许多模块都支持过零检测,在实际建模仿真中,如果用户对所有的系统,包括含有不连续环节的系统都利用过零检测进行仿真,那么不仅仿真过程的速度更快,而且精度也会提高。

虽然Simulink中的许多模块都能够产生过零,但各个模块的过零类型是有差异的。下面举例说明带有过零的Simulink模块的过零检测方式。例如,对于Abs模块来说,当输入信号改变符号时将产生一个过零事件;而对于Saturation(饱和)模块来说,当过零检测功能检测到Saturation模块中的如下事件时产生过零:输入信号到达上限;

输入信号离开上限;

输入信号到达下限;

输入信号离开下限。

状态事件的检测依赖于模型内部过零信号的结构,这个信号并不受方块图的影响。对于Saturation模块,用来检测上限过零的信号为zcSignal=UpperLimit-u,这里,u是输入信号,UpperLimit是信号上限。此外,过零信号还具有方向属性,带有方向的过零通常用来驱动其他模块。这个方向属性值包括:

rising(上升沿R)—当信号上升穿越零时,或者信号由零值到正值时,产生过零;

falling(下降沿F)—当信号下降穿越零时,或者信号由零值到负值时,产生过零;

either(双边沿E)—当上升沿或下降沿发生时,产生过零。

图7-2说明了过零信号的方向属性。对于Saturation模块的上限,过零的方向就是either,这样,使用相同的过零信号就可以检测到上升沿和下降沿饱和事件。图7-2如果误差容限太大,则Simulink也有可能无法检测到过零。例如,如果过零在一个时间步内发生,而时间步的起始时刻值和终止时刻值并没有指示出符号变化,那么求解器有可能越过过零时刻而没有检测到过零。

图7-3表示的是一个过零信号,左图中的积分器越过了过零,右图中的求解器则检测到了过零事件。如果用户担心会出现这样的问题,则可以减小误差容限,以保证仿真算法的步长足够小。图7-3这里,把定义模块自身状态事件的Simulink模块看做具有内在过零的模块,如果用户需要明确地通知过零事件,则可以使用HitCrossing模块,这个模块在输入穿过零点时会产生一个过零,可以用它为不带过零能力的模块提供过零检测的能力。

把仿真参数对话框DataImport/Export选项面板中的Outputoptions选项设置为Refine

output或Produceadditionaloutput对于定位错过的过零检测是没有帮助的,但这两个选项有助于减少错过过零检测的机会。为了避免在检测时错过过零,用户应该改变最大步长或输出点的个数。7.1.3使用过零检测

对于某些模型,模型在不连续点处有可能会出现高频抖动。还以弹跳小球为例,将小球抛向空中,然后反复地撞击地面,每一次小球撞击地面时,Simulink在小球的速度和位置上都会遇到一个不连续点,由于这种撞击反复地出现过零检测,因此Simulink的仿真步长会变得越来越小。从本质上来说,这种仿真结果也不是很完善。

在Simulink的仿真参数设置对话框中,对话框的Solver选项面板和Diagnostics选项面板都提供了对过零进行的检测设置,用户可以根据需要对模型进行相应的设置。图7-4是仿真参数对话框中的Diagnostics选项面板,其中的Consecutivezerocrossingsviolation(连续过零检测)选项有两个选项供用户选择,即warning和error,当Simulink在仿真过程中检测到连续过零时,它会根据用户的设置在MATLAB工作区中显示警告信息或错误信息。图7-4如果发生两个过零事件的时间小于某个特定的间隔,那么Simulink会认为这两个过零是连续的。图7-5描述的是Simulink在连续时间步t1和t2上检测过零ZC1和ZC2之间的仿真时间线,如果dt<RelTolZC*t2,则Simulink会定义这两个过零是连续的,其中,dt是两个过零之间的时间,RelTolZC是Consecutivezerocrossingrelativetolerance(连续过零检测的相对误差)。Consecutivezerocrossingrelativetolerance参数在仿真参数对话框的Solver选项面板中进行设置,如图7-6所示。同时,用户还可以设置Numberofconsecutivezerocrossingsallowed(允许的连续过零的数目),如果Simulink检测到的连续过零的数目超过了限制值,那么它会根据用户在图7-4中指定的Consecutivezerocrossingsviolation诊断选项来显示警告消息或错误消息。当Simulink检测到非连续过零时,即连续过零已不再满足上述条件时,它会对过零重新进行计数。图7-6当选择变步长算法仿真模型时,Solveroptions选项区中的Zerocrossingcontrol选项可以控制是否启动过零检测,如图7-7所示。对于大多数模型来说,当选择较大步长仿真模型时,启动过零检测会加速仿真过程。但是,如果模型有极大的动态变化,则关闭过零检测会加速仿真过程,但会降低仿真结果的精确度。图7-7对于模型中的某些模块,用户可以在模块的参数对话框中不选择Enablezerocrossingdetection选项来关闭模块的过零检测,并设置Zerocrossingcontrol选项为Use

localsettings,表示只对模型进行局部过零检测。局部过零检测可以减少Simulink频繁地对模型进行过零检测,而模型中的其他模块同样可以获得使用过零检测带来的高精度。

表7-1列出了Simulink中具有过零的模块,每个模块的过零类型是不同的,有的过零只是用来通知求解器的模式是否发生了改变,另外一些过零类型则与信号有关,用来驱动其他模块。

例7-1使用过零检测。

图7-8中的模型是一个带有过零检测功能的模型。该模型采用Function模块和Abs模块计算对应输入的绝对值,由于Function模块不支持过零,因此有一些拐角点被漏掉了,而Abs模块由于能够产生过零,因此每当它的输入改变符号时,都能够精确地得到零点的结果。图7-8这里将SineWave模块中的Frequency(rad/sec)值设置为2,把模型中的输出数据传送到MATLAB工作区,在工作区中利用plot(tout,yout)命令绘制输出结果曲线,可得到如图7-9所示的结果。从图中可以看到,实线是Function模块的输出,该模块未检测到过零事件,因此输出曲线在拐点处漏掉了一些点,正弦波的绝对值输出不完全正确;虚线是Abs模块的输出,该模块检测到了过零事件,在MATLAB工作区中输入下列命令:

semilogy(tout(1:end-1),diff(tout))

该命令绘制了Abs模块在仿真过程中采样步长的变化曲线,如图7-10所示,从图中可以看到,该模型采用的是常规步长10-1进行仿真,当发生过零时步长缩小至10-14。图7-9图7-107.1.4关闭过零检测

如果用户想要在Simulink中建立用来表现不连续点的高频振荡模型,几乎是不可能的,实际上,这样的系统在物理上也是不可能实现的,如无质量的弹簧、带有零延迟的气压系统等。因为在这些系统中,颤振会产生反复的过零检测,仿真的步长会变得非常小,以致于会终止仿真。因此,如果用户不希望在模型中添加过零检测,则可以关闭过零检测。具体做法是:在图7-7所示的Solveroptions选项区中,设置Zerocrossingcontrol选项为Disableall,这样就完全避免了Simulink对模型进行频繁的过零检测。虽然关闭过零检测可以减少这样的问题,但用户也不会再获得过零检测提供的高精度。比较好的解决办法是确定模型中可能存在问题的原因。对用户来说,如果创建的模型在一个极小的区间内几次都通过零点,导致在同一个时间内系统会几次检测到过零,最终终止仿真,那么对于这样的系统,过零检测应当关闭。但如果此时有些模块的过零非常重要,则可以使用HitCrossing模块通知过零。当过零检测关闭后,系统的仿真速度有可能会得到很大的提高,而此时用HitCrossing模块产生的过零不会受影响。

例7-2关闭过零检测。

过零事件不仅表示信号穿过了零点,还意味着尖峰值的产生和饱和。

图7-11是一个精确检测过零信号的模型。模型中的正弦波信号分别送到Abs绝对值模块和Saturation饱和模块,在t=5时,Switch模块的输出从绝对值模块转换到饱和模块,Simulink中的过零功能自动检测出Switch模块改变输出的准确时间,而且求解器也会步进到过零事件发生的时刻,这种改变可以从输出波形中观察到。

在这个模型中,模型的输出根据时间的变化由输入的绝对值跳变到输入的饱和值,这个现象通过使用带有过零支持的模块进行描述,在系统响应中得到了理想的陡沿。如果这样的结果对用户来说意义不大,则可以关闭过零。图7-11双击Comtime模块,打开模块的内部结构图,如图7-12所示,这是一个时钟判断模型,Clock模块作为仿真时间与Constant模块的参数值进行比较;RelationalOperator是关系操作符模块,用来判断两个输入信号之间的关系。

分别在SimulationParameters对话框内打开和关闭过零检测,运行仿真。打开过零检测后的模型输出曲线如图7-13所示,Simulink自动检测出过零;关闭过零检测后模型的输出曲线如图7-14所示,这次得到的结果在t=5s时不是很理想,而且在达到饱和后还带有一些拐角。图7-11双击Comtime模块,打开模块的内部结构图,如图7-12所示,这是一个时钟判断模型,Clock模块作为仿真时间与Constant模块的参数值进行比较;RelationalOperator是关系操作符模块,用来判断两个输入信号之间的关系。

分别在SimulationParameters对话框内打开和关闭过零检测,运行仿真。打开过零检测后的模型输出曲线如图7-13所示,Simulink自动检测出过零;关闭过零检测后模型的输出曲线如图7-14所示,这次得到的结果在t = 5s时不是很理想,而且在达到饱和后还带有一些拐角。图7-12图7-13图7-14 7.2处理代数循环

Simulink中的代数环与数学意义上的代数循环是一样的,因为有些Simulink模块带有直接馈通(directfeedthrough)的输入端口,直接馈通定义为输出直接依赖于输入。换句话说,如果模块的输出方程中包含输入,那么这个模块就具备直接馈通特性,这就意味着这些模块的输出在未知进入输入端口信号值的情况下是无法计算出来的。下面列出了带有直接馈通输入端口的Simulink模块:MathFunction模块;

Gain模块;

Integrator模块的初始条件端口;

Product模块;

有非零D矩阵的State-Space模块;

Sum模块;

分子与分母具有相同阶次的TransferFcn模块;

具有相同零点和极点数的Zero-Pole模块。7.2.1代数约束

Simulink中的某些模块是不具有直接馈通特性的,如Discretes模块库中的UnitDelay模块。当具有直接馈通输入端口的模块直接由同一模块类型的输出所驱动,或者由其他具有直接馈通端口的模块反馈到其输入端时,这时就构成了一个代数循环。在一个代数环中,由于它们之间是相互依赖的,所有的模块都要求在同一时刻计算输出,这与通常意义上仿真的顺序概念相抵触,因此最好能通过手工的方法对方程进行求解。以图7-15这个简单的标量代数环模型为例。从数学角度来说,Sum模块的输出z等于输入u减z,即z = u-z。为了计算求和块的输出,Simulink需要知道它的输入,但是输入恰恰是它自己!对于这个代数环,我们知道从数学的角度上可以解算出输出z,也就是z=u/2。但是,对于大多数代数循环则无法这样简单地求解。

在图7-16所示的模型中,向量代数循环中存在两个状态变量z1和z2,这需要解方程组,若状态变量更多的话,则用手工求解方程就不是很合适了。图7-15Simulink自带了一个内置的代数环求解器,用以求解代数环问题。也可以用MathOperations库中的AlgebraicConstraint(代数约束)模块,该模块可以方便地建立代数方程的模型,并在模块对话框内指定初始状态的估计值,该模块强制输入信号F(z)为零,并输出一个代数状态z,由于这个模块的输出必须经过反馈回路影响输入,因此,模块会调整其输出使其输入为零。

标量代数循环表示的是一个标量代数方程或F(z)=0方程,其中,z是循环中某一模块的输出,函数F由模块输出到输入的循环组成。在图7-12所示的模型中,F(z)= z-(u - z);在图7-16所示的模型中,方程为图7-16当模型中包含了约束方程F(z)= 0时,模型中就存在了代数循环。如果用户建立的模型中有一系列内在相互制约的系统,或者用户想要建立微分/代数系统(Differential/Algebraicsystem,DAE),则需要约束方程。

当模型中包含了代数循环时,Simulink在每个时间步都会调用循环算法进行求解,循环算法会反复进行求解以确定最终结果。因此,具有代数循环的模型与不具有代数循环的模型相比,仿真速度要慢得多。为了求解F(z)=0,Simulink循环求解器使用Newton法(牛顿法)进行求解,虽然这个方法很有效,但对有些代数环,如代数状态z未给定一个较好的初始状态值,这时使用Newton法可能造成代数环不收敛。用户可以在代数循环的连线上放置一个IC模块,该模块通常用来指定信号的初始值,在其他时刻则使用当前值。另一个在代数环中指定初始估计值的方法就是使用AlgebraicConstraint模块。图7-17中的模型使用AlgebraicConstraint模块为代数状态变量提供了一个初始估计值,用户可以在模块对话框内给出代数状态的初始估计值,以改进代数循环算法的效率,不同的初始估计给出了不同的结果。模型中的状态变量x满足方程(x-2)(x+1)=0,即x2-x-2=0。图7-177.2.2非代数的直接馈通环

通常,由直接馈通模块组成的循环是代数循环,但也有一些例外,如包含触发子系统的循环和由输出到积分器重置端口的循环。

触发子系统在两次触发事件之间保持其输出为常值,因此,求解器可以利用系统前一时刻的输出来计算当前时刻的输入。事实上,当求解器遇到包含触发子系统的循环时,就不必再使用代数循环算法。注意:由于求解器利用触发子系统的上一次输出来计算反馈输入、子系统和反馈通道上的所有模块,因此可能在其输入端产生一个采样间隔的延迟,这样,当仿真一个带有触发反馈环的系统时,Simulink会显示警告信息,以提示用户产生这样的延迟。

以图7-18中的系统模型为例,触发子系统TriggeredSubsystem的输出直接反馈到输入,构成了非代数的直接馈通环。图7-18系统求解方程为z=u1 + u2=1 + u这里,u是上一次触发子系统输出的z值。系统的输出是一个阶梯函数,如图7-19所示。图7-19现在,从系统模型中删除触发器,系统如图7-20所示,这时,加法子系统u2端口的输入等于当前时间步上子系统的输出,系统的数学表达式为z=z+1,这样的系统在数学上是无解的。图7-207.2.3切断代数环

在有些情况下,Simulink能够有效地求解代数环,但也要考虑速度因素。解算代数环的Newton法需要进行多次迭代,而且在每个时间步上都要运行这种迭代运算,这必然会造成带有代数环的模型仿真速度减慢。因此,通过手工求解或利用MATLAB中的符号工具箱进行推导是首选的方法。

还有一个常用的技巧就是在反馈回路中加入存储单元或延迟单元以“切断”代数环。尽管这种方法很容易操作,但是不推荐这样做,因为它改变了系统的动态,而且若设置了一个不好的初始估计值,则有可能还会造成系统不稳定。如图7-21中的模型,第一个模型在代数环中没有加入存储模块,第二个模型在代数环中加入了一个存储模块而断开了代数环,两个模型运行后得到了完全不同的结果,第二个模型的输出数据被放大了。图7-21对于这样的模型,比较好的解决办法就是解算出模型中代数环环节中输出与输入的比例系数。这里z=Az+Bu,则可以得到(1-A)z=Bu,那么z=(1 - A)-1*B*u,其中,A、B是矩阵,因此可以重新建立模型,模型中增益模块的增益值设置为inv(eye(2)-A)*B*u,如图7-22所示。这时再运行模型得到的结果将与第一个模型中的结果相同。图7-227.2.4消除代数环

如果Simulink模型中的代数环包含了下面几种模块,那么Simulink会消除某些代数环:

AtomicSubsystem模块;

EnabledSubsystem模块;

Model模块。对于包含AtomicSubsystem模块或EnabledSubsystem模块的代数环,若要启动代数环消除功能,可选择模块参数对话框中的Minimizealgebraicloopoccurrences选项。如果代数环中包含了Model模块,则要启动代数环消除功能时,可在模型的ConfigurationParameters对话框中ModelReferencing选项面板上选择Minimizealgebraicloopoccurrences选项,如图7-23所示。图7-23

ConfigurationParameters对话框中Diagnostics选项面板中的MinimizealgebraicloopOccurrences选项可以用来指定当模型中出现代数环时Simulink所采取的动作,可以选择的选项为none、warning和error,如图7-24所示。如果选择warning或error选项,并在模型中设置了自动消除代数环功能,那么当模型中出现代数环时,若Simulink无法消除代数环,它会在MATLAB工作区中显示警告信息或错误信息。图7-24缺省时,代数环最小化功能是关闭的,因为它与Simulink中的条件输入分支的优化处理及实时工作区中的单输出/更新函数的优化不兼容。如果用户需要对代数环中包含的AtomicSubsystem模块和EnabledSubsystem模块进行优化,那么必须手动消除代数环。

这里以图7-25所示的模型为例说明Simulink中消除代数环的功能是如何实现的。模型中的AtomicSubsystem模块和Gain模块构成了代数环,因为AtomicSubsystem模块的输出是输入的函数,受输入信号的影响。图7-25如果把ConfigurationParameters对话框中Diagnostics选项面板中的Algebraicloop选项设置为error,则当仿真模型时,模型中的代数环就会以红色高亮显示,并同时显示错误对话框,如图7-26所示。这是因为用户关闭了代数环求解器,Simulink无法求解模型中出现的代数环。图7-26用鼠标右键单击AtomicSubsystem模块,选择SubsystemParameters命令,在打开的AtomicSubsystem参数对话框中选择Minimizealgebraicloopoccurrences选项,如图7-27(a)所示。选择模型窗口中Tools菜单下的Signal&ScopeManager命令,打开信号与示波器管理器,将Scope示波器与AtomicSubsystem模块的输出信号关联。然后单击启动仿真命令开始仿真,示波器中AtomicSubsystem模块的输出信号如图7-27(b)所示。此时Simulink在模型编译时消除了代数环,使仿真正常进行。(a)(b)图7-277.2.5高亮显示代数环

对于包含代数环的系统,用户可以在更新、仿真或调试模型时高亮显示代数环。

如果要使Simulink在更新或仿真系统模型时高亮显示模型中的代数环,那么用户可以在ConfigurationParameters对话框中的Diagnostics选项页内将Algebraicloop(代数环)诊断选项设置为error,如图7-28所示。这会使Simulink在仿真过程中显示错误对话框(即DiagnosticViewer,诊断查看器),并重新绘制表示代数环的方块图的颜色。Simulink通常使用红色来表示构成代数环的模块和连线,以突出显示代数环;当关闭错误对话框时,系统会恢复方块图的原色。图7-28如果用户在调试模型,那么可以在MATLAB命令窗口中利用Simulink中的ashow命令高亮显示代数环。

例如,图7-29是用原色显示的hydcyl演示模型的方块图,模型中各子系统模块的前景色和背景色利用Format菜单下的Foregroundcolor和Backgroundcolor命令设置了不同的颜色。图7-29将该模型中ConfigurationParameters对话框中Diagnostics选项页下的Algebraicloop选项设置为error后,Simulink在仿真系统时打开错误对话框,提示用户模型中出现了代数环,同时重新更新方块图的颜色。这里Simulink将代数环绘制为红色,以突出显示模型方块图中的代数环,如图7-30所示。图7-30 7.3高 级 积 分 器

Simulink的Continues库中的Integrator模块是积分器模块,它对输入信号进行积分,并输出当前时间步上输入的积分值。下面的方程说明了模块的输出y是其输入u和初始状态y0的函数,这里,y和u都是当前仿真时间t的向量函数。Simulink可以用多种不同的数值积分方法来计算积分器模块的输出,每种方法在特定的应用环境下各有优缺点。实际上,Simulink把Integrator模块看做一个具有一个状态和输入的动态系统,它的输入是状态的时间导数,即用户可以在ConfigurationParameters对话框中的Solver选项页内选择最适合自己应用程序的积分算法,所选择的求解器会用当前时刻的输入值和前一个时间步的状态值来计算当前时间步上Integrator模块的输出值。为了支持这种计算模式,Integrator模块必须保存当前时间步的输出值以备求解器计算下一个时间步的输入值,同时,模块也提供给求解器一个初始条件,用来在仿真开始执行时计算模块的初始状态,初始条件的缺省值为0。模块的参数对话框也允许用户为初始条件指定其他的值,或者在模块中创建一个初始值输入端口。7.3.1积分器模块参数对话框

双击Integrator模块,可打开Integrator模块的参数对话框,如图7-31所示。在该对话框内,用户可以进行下列设置:

定义积分的上限和下限。

创建一个将模块的输出(状态)重新设置为模块初始值的输入,这取决于输入的变化情况。

创建一个可选的状态输出,该输出允许用户使用模块的输出值来触发模块的重置功能。图7-31

1.定义初始条件

用户可以在对话框内将初始条件定义为参数,或者选择从外部信号输入初始条件,如图7-32(a)所示。

若要把初始条件定义为模块参数,可在Initialconditionsource列表中选择internal,并在Initialcondition参数文本框内输入数值。

若要从外部提供初始条件,可在Initialconditionsource列表中选择external,则在Integrator模块的输入端出现一个附加的输入端口,如图7-32(b)所示。(a)(b)图7-322.限制积分

为了防止输出超过指定的范围,用户可以选择Limitoutput复选框,并在下面的参数文本框内输入适当的范围值,这个操作可以使模块作为一个受限积分器,如图7-33(a)所示。当输出到达限制值时,Simulink会关闭积分动作。在仿真过程中,用户可以改变这个限制,但是不能改变输出是否受限,因为模块的输出是按照下面的规则来确定的:

当积分小于或等于Lowersaturationlimit参数值,而且输入是负值时,输出被限制在Lowersaturationlimit范围内。(a)(b)图7-33为了生成一个指示状态受限时间的信号,可选择Showsaturationport复选框,那么会有一个饱和端口出现在模块输出端口的下方,如图7-33(b)中的Integrator模块所示。这个信号有三个值:1表示应用上限;0表示积分不受限制;-1表示应用下限。当用户选择这个选项时,模块有三个过零:一个用来检测模块何时进入上饱和限;一个用来检测模块何时进入下饱和限;一个用来检测模块何时离开饱和区。3.重新设置状态

Integrator模块可以根据外部信号重新把状态设置为指定的初始条件。为了使模块重新设置其状态,可选择Externalreset参数列表中的一个选项值,那么会在模块输入端口的下方出现一个触发端口,同时标出所选值的触发类型,如图7-34所示。

选择rising,当重置信号有上升沿时触发状态重置;

选择falling,当重置信号有下降沿时触发状态重置;

选择either,当有上升信号或下降信号出现时触发状态重置;

选择level,当重置信号为非零时,触发重置并保持输出为初始条件。图7-344.关于状态端口

选择Integrator模块参数对话框中的Showstateport选项后,将在积分器模块的顶部出现一个附加的输出端口,即状态端口,如图7-35所示。

状态端口的输出与模块的标准输出端口一样,但不具有下列特性:如果模块在当前时间步上重置,那么状态端口的输出值是模块还没有被重置时标准输出端口的值,状态端口的输出比Integrator模块输出端口的输出早一个时间步。因此,可以使用户在创建下列模型时避免代数环的出现:图7-35图7-367.3.2创建自重置积分器

如果用户需要创建这样一个积分器,也就是积分器根据其输出值重新设置初始值,那么最好使用Integrator模块的状态端口实现这个功能,因为这样可以使用户避免在模型中创建代数环。以图7-37中的模型为例,这个模型试图利用积分器的输出创建一个自重置积分器,也就是把输出减1,再反馈回积分器的重置端口,但是,这样会使模型建立一个代数环。当仿真这个模型时,仿真过程在T=1.41421356237311时停止,仿真错误诊断器提示在积分器模块内出现了一个代数环。Simulink无法判断积分器的输出值,因为若要计算积分器模块的输出,Simulink需要知道模块的重置信号值,反之亦然,由于这两个值是相互依赖的,因而Simulink无法确定其中的任何一个值。因此,如果用户试图仿真或更新这个模型,Simulink会发出一个错误信号。图7-37现在改进图7-37中的模型,在积分器模块中利用状态端口重置积分器,从而使模型避免了代数环的出现,如图7-38(a)所示。

在这个模型中,重置信号的值依赖于状态端口的值,状态端口的值在当前时间步上比积分器模块输出端口的值提前得到,这样,Simulink可以确定在计算模块的输出之前是否需要重新设置模块,因此也就避免了代数环。运行仿真后,示波器模块显示的模型的输出信号如图7-38(b)所示。图7-38例7-3积分器重置。

要求建立一个积分器,输入为1,初始条件为-50,如果输出超过20,则重置为-100。

在这个例子中,模块的输出驱动模块自身的重置端,这样当输出超过20时,积分器重置到初始条件值。由于在同一个时间步内需要用输出值来确定是否需要重置,因此就产生了一个直接馈通环。可以利用状态端口来解决这样的问题,因为状态值(与输出值相同)在进行判断时已经在输出之前计算得到了。初始条件通过外部源确定,当初始条件由外部给出时,必须使用一个IC模块为信号提供一个初始值。

在这个例子中,IC模块的值设置为-50,其他时间的重置值由常值模块提供,等于-100,积分器的输入是一个常数1。建立的积分器重置模型如图7-39(a)所示。图7-39在ConfigurationParameters对话框内设置仿真时间为250s,观察到的示波器输出波形如图7-39(b)所示,可以看到输出信号的初始值为-50,当输出超过20时,重新设置输出值为-100。

例7-4重置弹力球。

一个弹力球以15m/s的速度从距水平位置10m的高度抛向空中,球的弹力为0.8,当球到达地面时,重新设置其初始速度为0.8*x,x是重置时刻球的速度,即积分器的状态。

球的抛物线运动满足下列公式:其中:v为球的速度;v0为球的初始速度;g为重力加速度;h为球从起始位置开始的高度;h0为球的初始高度,即球距地面的高度,因此球距地面的实际高度为h+h0。利用重置积分器建立的系统模型如图7-40(a)所示,其输出波形如图7-40(b)所示。

设置Velocity积分器的Externalreset参数为falling,Initialconditionsource参数为external,即初始条件由外部给定,并选择Showstateport复选框显示状态端口,设置IC模块的初始值为15。设置Position积分器的Initialcondition为10,设置Initialconditionsource参数为internal。

在仿真参数对话框内选择变步长ode23求解器,设置Maxstepsize为0.1,运行仿真,在示波器中观察波形。球的速度显示在示波器上面的窗口,球的位置显示在示波器下面的窗口,这个系统使用重置积分器,当弹力球到达地面时改变球的方向。图7-40(a)(b)7.3.3在使能子系统间传递状态

当用户需要在两个使能子系统之间传递状态时,利用状态端口可以避免在模型中出现代数环,以图7-41所示的模型为例。图7-41在这个模型中,由Constant常值模块输入信号来驱动两个使能子系统A和B,这两个子系统可对输入信号进行积分。PulseGenerator模块能够生成一个使能信号,用来在两个子系统之间进行切换,以交替执行子系统A和子系统B。每个子系统的使能端口都被设置为重置,这样,当子系统被激活时,两个子系统都将重新设置其积分器。重置积分器可以使积分器读取积分器初始条件端口的数值,每个子系统内积分器的初始条件端口都与另一个子系统内积分器的输出端口相连。这种连接的目的是为了使输入信号的连续积分在两个子系统之间交替执行,但是,这样的连接产生了一个代数环。为了计算子系统A的输出,Simulink需要知道子系统B的输出,反之亦然,因为这两个输出是相互依赖的,Simulink无法给出任何一个子系统的输出值。因此,如果用户试图更新或仿真这个模型,则Simulink都会产生一个错误。

可对这个模型进行改造,即在模型中使用积分器的状态端口,当传递状态时,避免了在模型中产生代数环,如图7-42所示。图7-42在图7-42中的模型中,子系统A中的积分器的初始条件依赖于子系统B中的状态端口,反之亦然。在同一个时间步内,状态端口的数值比积分器输出端口的数值更新的要早,这样,Simulink可以计算出任何一个积分器的初始条件,而不必知道另一个积分器的最终输出值。

对图7-42中的模型进行仿真,观察示波器的波形,仿真结果如图7-43所示。图7-43 7.4仿真诊断选项设置

7.4.1仿真算法诊断设置

选择ConfigurationParameters对话框中Select树状列表中的Diagnostics选项,初始时显示的是Solver(仿真算法诊断)选项面板,如图7-44所示,这个面板用来设置与算法有关的某些诊断选项。图7-441. Algebraicloop

当Simulink编译模型时,如果检测到模型中有代数环,则指定Simulink对代数环采取的处理方式。如果设置该选项为error,则Simulink会显示错误消息,并高亮显示模型中包含代数环的方块图。关于代数环的详细内容,参看第7.2节。2. Minimizealgebraicloop

如果代数环中包含了特定的子系统(如AtomicSubsystem或EnabledSubsystem),而且子系统的输入端口具有直接馈通特性,那么当子系统中至少有一个模块的输入端口不具有直接馈通特性时,Simulink可以消除代数环。如果Simulink消除代数环操作失败,则使用该选项可以设置Simulink或者忽略这种操作,或者显示警告消息,或者显示错误消息。关于消除代数环的详细内容,参看第7.2.4节。3. Blockpriorityviolation

当Simulink在编译模型时检测到模块优先级指定错误时,使用该选项可以设置Simulink或者忽略这种错误,或者显示警告消息,或者显示错误消息。

4. Minstepsizeviolation

如果Simulink检测到下一个仿真步长小于为模型指定的最小步长,那么使用该选项可以设置Simulink或者忽略这个问题,或者显示警告消息,或者显示错误消息。如果为模型指定的误差容限要求步长小于指定的最小步长,则有可能会出现这个问题。5. Samplehittimeadjusting

如果Simulink在运行模型时对采样时间进行了微弱的调整,那么使用该选项可以设置Simulink或者忽略这个问题,或者显示警告消息,或者显示错误消息。如果Simulink的采样时间与模型中其他任务的采样时间接近,则Simulink有可能会改变这个采样时间。如果Simulink认为这种差别仅仅是由于数值错误(例如,精度问题或四舍五入问题)产生的,那么它会把变化速度较快的任务的采样时间改变到与变化速度较慢的任务的采样时间相匹配。

需要注意的是,随着仿真时间的继续,这些采样时间的改变有可能会在数值仿真结果和实际的理论结果之间产生矛盾。在把该选项设置为warning且Simulink检测到采样时间改变时,MATLAB命令窗口会显示如下警告消息:

Warning:Timingenginewarning:Changingthehittimefor…

如果该选项设置为none,则Simulink不会显示任何消息。6. Consecutivezerocrossingviolation

如果Simulink检测到连续过零的数目已经达到允许的最大值,那么使用该选项可以设置Simulink或者忽略这个问题,或者显示警告消息,或者显示错误消息。当Simulink检测到这个约束时,它会报告当前的仿真时间,累计的连续过零的数目,以及检测到的过零模块的类型和名称。关于过零检测的详细内容,参看第7.1节。7. Unspecifiedinheritabilityofsampletime

如果模型中包含S-函数,而S-函数未指定它们是否继承来自父模型的采样时间,那么使用该选项可以设置Simulink或者忽略这个问题,或者显示警告消息,或者显示错误消息。只有当仿真算法设置为定步长离散算法,而且Periodicsampletimeconstraint选项设置为Ensuresampletimeindependent时,Simulink才会检测这个条件。8. Solverdatainconsistency

一致性检验是一个调试工具,它可以用来验证Simulink中ODE算法中的某些假设条件,它的主要作用是确保S-函数与Simulink的内嵌模块遵守相同的规则。由于一致性检验会在性能上造成重大损失(最高会降低40%),因此它通常被设置为none。当然,使用一致性检验可以验证S-函数,并有助于用户查找和确定仿真过程中造成某些不希望结果的原因。这里介绍一下一致性检验的执行方式。在对模型进行仿真时,为了执行高效积分运算,Simulink会存储时间步上的特定值(也就是把数值存储在缓冲区中),以备下一个时间步使用。例如,在一个仿真时间步结束时的微分值通常在下一个时间步的起始时刻被重新使用,因此,Simulink的仿真算法利用这种方法就可以避免冗余的积分运算。那么,当使能一致性检验时,Simulink会在时间步的起始时刻重新计算数值,并与缓存中的数值相比较,如果数值不相同,就会产生一致性错误。Simulink通常会在如下方面比较计算的数值:

输出;

过零;

微分;

状态。一致性检验的另一个目的就是当在给定的t时刻调用模块时,可以确保模块产生常值输出。这对于钢体算法(ode23s和ode15s)是非常重要的,因为当计算Jacobian(雅可比)矩阵时,模块的输出函数在同一时刻t处可能会被多次调用。9. Automaticsolverparameterselection

如果Simulink改变了仿真算法中的参数设置,那么使用该选项可以设置Simulink或者忽略这个问题,或者显示警告消息,或者显示错误消息。例如,假设用户用连续算法来仿真离散模型,并设置这个选项为warning,那么当Simulink把算法类型改变为离散算法时,在MATLAB命令窗口中会显示警告消息。10. Extraneousdiscretederivativesignals

Model模块可以把模型作为模块包含在另一个模型中,模块的输入端口和输出端口对应于模型顶层的输入端口和输出端口。模型中的离散信号通过Model模块传递到带有连续状态的模块的输入端,如Integrator模块,但Simulink无法确定它为了解决模型精度问题而用来重置算法的最小速率的位置。因此,如果将这个选项设置为error,则当编译模型时,Simulink会终止仿真过程,并显示一个错误消息;如果将这个选项设置为none或warning,则无论何时当离散信号值改变时,Simulink都会重新设置仿真算法。假设离散信号的确是输入到带有连续状态的模块的信号源,那么这样做可以确保模型仿真的精度。但是,如果离散信号不是输入到带有连续状态的模块的实际信号源,那么在离散信号改变的速率上重置算法可能会导致模型的算法会频繁地重新设置,而这可能并不是必需的,因此这样就会使仿真速度造成不必要的降低。图7-45中的模型说明了这个诊断选项的基本原理。在图7-45中,信号s有可能但不是必然要经过Model模块进入到Integrator模块,从Model模块输出的信号被标记为s?则表示这是不可能的。仅通过检查顶层模型就能确定Integrator模块的信号源实际是s,因为s是连续信号和离散信号的和,不连续点以离散模块A的采样速率出现在信号s上,也就是,一秒钟出现一次。假设s?实际就是s,为了解决顶层模型的精度问题,Simulink必须一秒钟就重置一次算法,但是,检查模型后会发现信号s?实际是图7-46中的信号X。图7-45图7-46这里,信号X与信号s类似,都是连续信号与离散信号的和,但是,在X上的不连续点每两秒出现一次,而s上的不连续点每一秒出现一次,因此,为了准确地仿真顶层模型,Simulink需要每隔两秒重置算法。但是,由于在编译顶层模型时,Simulink无法进入到Model模块中的模型,因此也就无法确定用于求解模型时需要重置算法的最小速率。正因如此,如果将这个选项设置为error,则当用户试图更新或仿真模型时,Simulink会显示错误消息。如果将这个选项设置为none或warning,则无论何时当s值发生改变时,Simulink都会重置算法。11. Statenameclash

该选项用来检测状态名冲突,可以设置为none或warning,如果设置为warning,则当出现状态名冲突时,Simulink会显示警告消息;如果设置为none,则忽略对状态名的检测。7.4.2采样时间诊断设置

选择Diagnostics选项下的SampleTime命令,将显示如图7-47所示的SampleTime选项面板,这个面板用来设置当Simulink检测到与模型采样时间有关的编译错误时可以采取的不同处理方式。图7-471.Sourceblockspecifies-1sampletime

信号源模块(例如,SineWave模块)指定的采样时间为-1。若将该选项设置为none,则可以让Simulink忽略这个问题;若设置为warning,则显示警告消息;若设置为error,则显示错误消息。

2.Discreteusedascontinuous

作为离散模块的UnitDelay模块继承了与其输入端相连模块的连续采样时间。若将该选项设置为none,则可以让Simulink忽略这个问题;若设置为warning,则显示警告消息;若设置为error,则显示错误消息。3.Multitaskratetransition

在运行多任务模式下的两个模块之间出现了无效的速率转换。若将该选项设置为none,则可以让Simulink忽略这个问题;若设置为warning,则显示警告消息;若设置为error,则显示错误消息。

4.Singletaskratetransition

在运行单任务模式下的两个模块之间出现了无效的速率转换。若将该选项设置为none,则可以让Simulink忽略这个问题;若设置为warning,则显示警告消息;若设置为error,则显示错误消息。5.Multitaskconditionallyexecutedsubsystem

如果Simulink检测到模型满足下面的任一条件,那么使用该选项可以设置Simulink或者忽略这个问题,或者显示警告消息,或者显示错误消息。

模型中使用了多任务处理算法,并且模型中包含了运行在多速率模式下的使能子系统;

模型中包含了能够重置状态的条件执行子系统,而且这个子系统本身又包含了一个异步子系统。

这样的子系统在实时系统中由模型生成代码的过程中可能会产生坏数据或不确定的动作,在第一种情况下,考虑使用单任务处理算法,或者使用单速率使能子系统;在第二种情况下,考虑把异步子系统移到条件执行子系统的外部。6.Taskswithequalpriority

由模型表示的目标的异步任务与其他目标的异步任务具有相同的优先级,如果目标允许各个任务之间具有不同的优先级,则这个选项必须设置为error。7.EnforcesampletimesspecifiedbySignalSpecificationblocks

SignalSpecification模块允许用户指定与其输入端口和输出端口相连的信号的属性。如果指定的属性与其端口连接模块指定的属性相冲突,那么当编译模型时,Simulink会显示错误消息。对于这个选项,当SignalSpecification模块指定的信号源端口的采样时间与信号目的端口的采样时间不同时,将该选项设置为none,可以让Simulink忽略这个问题;设置为warning时,显示警告消息;设置为error时,显示错误消息。7.4.3数据验证诊断设置

选择Diagnostics选项下的DataValidity命令,将显示如图7-48所示的DataValidity选项面板,这个面板用来设置当Simulink检测到模型定义的数据的完整性受到威胁时可以采取的处理方式。图7-481.信号有效性诊断设置

图7-49中的Signals选项区是与信号有关的检验设置选项。图7-491) Signalresolution

Signalresolution(信号解析)就是把基本工作间中已有的Simulink.Signal对象与模型中命名的信号关联起来的过程,如果信号与信号对象有相同的名称,则Simulink可以把信号与对象关联起来,然后将信号解析为对象。对于某些模块,如UnitDelay模块和DataStoreMemory模块,用户可以把这些模块中命名的状态解析为Simulink.Signal对象,也就是说,这个过程不但可以解析信号,也可以解析状态。

当信号被解析为信号对象时,信号对象就指定了信号的属性,多个信号可能会有相同的名称,所有的同名信号可以被解析为同名的信号对象,并且具有对象指定的属性,改变信号对象的任何参数值也就改变了解析为该对象的所有信号的同样参数值。把信号解析为信号对象的必要条件是对象必须存在于基本工作间,并且与信号有相同的名称。但是,信号无法解析为同名对象,只是因为对象有这样的要求:用户必须为解析提供某些说明,除非这些说明已经存在,否则解析无法进行。局部信号解析控制:为了控制单个信号的解析,可右键单击信号来打开信号属性对话框,在Signalname文本框内输入希望的信号对象的名称,并选择Signalnamemustresolvetoasignalobject选项,如果Signalname中输入的是有效的信号对象,那么该选项将指定这个信号进行局部解析,而不会进行全局解析。局部解析也称为显式解析,因为单个信号明确地描述了它要求的解析。若不希望进行指定的局部解析,可不选择Signalnamemustresolvetoasignalobject选项。全局信号解析控制:用户可以指定Simulink自动解析任何已命名的没有进行局部解析的信号。这种解析也称为隐式解析,因为没有明确描述进行的解析,所以这种解析在匹配的信号名和对象名之间进行隐式定义。

缺省时,Simulink不会使用隐式信号解析,用户必须明确指定使用隐式信号解析。通过设置Signals选项区中Signalresolution选项的值,用户可以控制全局信号解析,这个选项的可选值如下:

Explicitonly:不执行隐式信号解析,只执行指定的显式(局部)信号解析。

Explicitandwarnimplicit:执行隐式信号解析,并为每个隐式解析记录一个警告信息。

Explicitandimplicit:执行隐式信号解析,但不记录警告。

2) Divisionbysingularmatrix

Simulink中Product模块的作用是对输入信号进行乘或除。当该模块参数对话框中的Multiplication参数设置为Matrix(*)时,模块的输出是对标记为“*”的输入矩阵的乘积和标记为“/”的输入矩阵的求逆。在这种矩阵乘积模式下,当模块的输入在求逆时,Product模块将检测到奇异矩阵(不可逆),如果是这样,则把该选项设置为none时,可以让Simulink忽略这个问题;设置为warning时,显示警告消息;设置为error时,显示错误消息。3) Underspecifieddatatypes

Simulink在模型的数据类型传递过程中无法推断出信号的数据类型。如果出现这个问题,那么将该选项设置为none时,可以让Simulink忽略这个问题;设置为warning时,显示警告消息;设置为error时,显示错误消息。

4) Detectoverflow

当信号值或参数值发生溢出,也就是信号值或参数值太大时,将使信号或参数的数据类型无法表示这些数据。如果出现这个问题,那么将该选项设置为none时,可以让Simulink忽略这个问题;设置为warning时,显示警告消息;设置为error时,显示错误消息。5) InforNaNblockoutput

在当前时间步上,模块的输出值是Inf或NaN,将该选项设置为none时,可以让Simulink忽略这个问题;设置为warning时,显示警告消息;设置为error时,显示错误消息。

6) “rt”prefixforidentifiers

如果在代码生成过程中,参数名、模块名或者信号名的前面出现了rt字符,也就是Simulink的对象名,则该选项的缺省设置会使代码生成过程终止,并显示错误消息。这个设置可以防止用户无意中在生成的标识符名称前使用了rt,从而造成与Simulink对象名的不必要冲突。2.参数有效性诊断设置

图7-50中的Parameters选项区是与参数有关的检验设置选项。图7-501) Detectdowncast

模块的输出计算要求把参数的指定类型转换为较小数值范围的类型,例如,从uint32类型转换为uint8类型,这个选项只对可选参数有效。如果出现这个问题,那么用户可以利用该选项或者忽略这个问题,或者显示警告信息,或者显示错误信息。2) Detectoverflow

对于指定的数据类型,该数据类型范围内的参数值无法满足模型对数值的要求,也就是希望的数值对于给定的数据类型来说,或者范围太大,或者范围太小,实际数值超过了边界范围。例如,假设参数值是200,而设定的参数数据类型是uint8,由于uint8类型的最大可表示值是127,因此就会出现数值溢出。需要注意的是,参数溢出与参数的精度降低是不同的,当理想的参数值处在数据类型允许的范围内能够进行缩放而无法准确表示时,这种情况下会造成数据的精度降低。参数溢出和数值精度降低都是量化误差,两者之间的差别非常微小,Detectoverflow选项可以报告所有的量化误差。如果出现这个问题,那么用户可以利用该选项或者忽略这个问题,或者显示警告信息,或者显示错误信息。3) Detectunderflow

如果希望的参数值非常小,而参数的数据类型没有足够的精度来表示这个数值,那么就会出现数值下溢,在这种情况下,参数值可能会变为零,这就与希望的数值存在了差别。如果出现数值下溢,那么用户可以利用这个选项或者忽略这个问题,或者显示警告信息,或者显示错误信息。4) Detectprecisionloss

Simulink检测到的模型中参数的数据类型不具备足够的精度来准确地表示参数值,从而使数据损失了一定的精度。参数的精度降低与参数溢出是不同的。如果出现数值精度降低,那么用户可以利用这个选项或者忽略这个问题,或者显示警告信息,或者显示错误信息。5) Detectlossoftunability

如果可调的工作区变量被封装初始化代码修改,或者被用于含有Simulink不支持的运算符或函数的算术表达式中,那么这个变量就不再可调。用户可以利用这个选项来报告损失了这种可调性,选择none,则不报告这个问题;选择warning,则显示警告消息(缺省值);选择error,则显示错误消息。3.数据存储有效性诊断设置

图7-51中的DataStoreMemoryBlock选项区是与DataStoryMemory模块和Simulink.Signal对象有关的检验设置选项。图7-511) Detectreadbeforewrite

模型试图在还未存储数据的时间步上读取数据。在该设置选项中,可以选择的选项如下:

Uselocalsettings:对于DataStoreMemory模块定义的每个数据存储,使用模块定义的设置。这个选项会对全局数据的存储进行检测。

DisableAll:关闭对模型可以访问的所有数据存储的检测。

EnableAllAsWarning:在MATLAB命令行显示警告信息。

EnableAllAsErrors:终止仿真,并在错误诊断对话框中显示错误消息。

2) Detectwriteafterread

在当前时间步上,模型从数据存储区中先读取数据,然后再把数据重新存储到数据存储区。这个选项的可选内容与上个选项相同。

3) Detectwriteafterwrite

在当前时间步上,模型试图连续存储两次数据。这个选项的可选内容与上个选项相同。4) Multitaskdatastore

一个任务是从DataStoreMemory模块中读取数据,另一个任务是向DataStoreMemory模块写数据,如果两个任务之间互不干扰,那么这个操作是安全的。如果出现多任务数据操作情况,那么用户可以利用这个选项或者关闭检测,或者显示警告信息,或者显示错误信息。

5) Duplicatedatastorenames

如果模型中包含了多个DataStoreMemory模块,而且这些模块都指定的是相同的数据存储名称,那么在这种情况下,用户可以利用这个选项或者忽略这个问题,或者显示警告信息,或者显示错误信息。4.调试数据有效性诊断设置

图7-52中的Debugging选项区是与模型调试有关的检验设置选项。图7-521) Arrayboundsexceeded

这个参数是边界检验选项,它可以使Simulink执行这样的检验:在仿真运行过程中,当模块存储数据时,检验是否把数据写在了分配给模型的内存之外。如果模型中包含了用户编写的存在错误的S函数,那么这种情况是有可能发生的。通常,只有在模型中包含了用户编写的S函数时才执行这个检验。这是因为,如果使能这个检验,则当每次执行模块时,Simulink都会对模型中的每个模块执行边界检验。这当然会减慢模型的执行速度。为了避免模型执行速度的不必要降低,最好是当用户怀疑模型中所包含的用户编写的S函数中含有bug时,再使能这个选项。在许多情况下,这个检验并不是必需的,因为这个检验是十分耗时的。但是,如果模型中加入了用户编写的模块(例如S函数),那么这些检验应当打开以避免出现性能或内存使用方面的问题。2) ModelVerificationblockenabling

这个参数允许用户使能或关闭在当前模型中的模型验证模块。在该设置选项中,可以选择下面的选项:

Uselocalsettings:根据每个模块中的Enableassertion参数的值使能或关闭模块,如果模块的Enableassertion参数是on,则使能模块,否则关闭模块。

Enableall:不管模块中的Enableassertion参数的值为何值,使能模型中所有的模型验证模块。

Disableall:不管模块中的Enableassertion参数的值为何值,关闭模型中所有的模型验证模块。7.4.4类型转换诊断设置

选择Diagnostics选项下的TypeConversion命令,将显示如图7-53所示的TypeConversion选项面板。当Simulink在模型编译过程中检测到数据类型转换问题时,利用这个选项面板中的三个选项可以设置Simulink对这个问题采取的处理方式。图7-531) Unnecessarytypeconversions

DataTypeConversion模块可以把任何Simulink数据类型的输入信号转换为模块中Outputdatatypemode参数、Outputdatatype参数和/或Outputscaling参数指定的数据类型。输入可以是实数信号或复数信号,如果输入是实数,则输出也是实数;如果输入是复数,则输出也是复数。但是在模型中添加DataTypeConversion模块进行数据类型转换是没有必要的。这个参数项提供的功能就是当Simulink检测到模型中出现了这种不必要的类型转换时,选择none选项则忽略这个问题,选择warning选项则显示警告信息。2) Vector/matrixblockinputconversion

Simulink按照下列规则把向量转换为行矩阵或列矩阵,或者把行矩阵或列矩阵转换为向量。

如果与向量信号连接的输入要求一个矩阵信号,那么Simulink会把向量转换为行矩阵或列矩阵;

如果与行矩阵或列矩阵连接的输入要求一个向量信号,那么Simulink会把矩阵转换为向量;

如果模块的输入信号既有向量信号,也有矩阵信号,而且所有的矩阵输入都是一行矩阵或一列矩阵,那么Simulink会把向量一个个转换为行矩阵或列矩阵。3) 32-bitintegertosingleprecisionfloatconversion

如果Simulink在仿真过程中检测到模型中有32位的整数数值被转换为浮点数值,那么选择none选项可以忽略这个问题,选择warning选项可以显示警告信息。用户可以根据实际情况选择是否打开这个检验,因为这种数值转换可能会降低数值的精度。7.4.5连接诊断设置

选择Diagnostics选项下的Connectivity命令,将显示如图7-54所示的Connectivity选项面板。当Simulink在模型编译过程中检测到模块连接问题时,利用这个选项面板中的选项可以设置Simulink对这个问题采取的处理方式。图7-541.Signals(信号)诊断设置

Signals选项区中的选项用来设置与信号有关的检测。

1) Signallabelmismatch

Simulink在仿真过程中检测到纯虚信号有共同的源信号,但却用了不同的标签。将该选项设置为none时,可以让Simulink忽略这个问题;设置为warning时,显示警告消息;设置为error时,显示错误消息。

2) Unconnectedblockinputports

Simulink在仿真过程中检测到模型中包含了没有连接输入的模块。将该选项设置为none时,可以让Simulink忽略这个问题;设置为warning时,显示警告消息;设置为error时,显示错误消息。3) Unconnectedblockoutputports

Simulink在仿真过程中检测到模型中包含了没有连接输出的模块。将该选项设置为none时,可以让Simulink忽略这个问题;设置为warning时,显示警告消息;设置为error时,显示错误消息。

4) Unconnectedline

Simulink在仿真过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论