主要内容

指定功能样品时间

样品倍

您可以指定S-functions的采样时间的行为mdlInitializeSampleTimes。你的s函数可以继承其利率从驱动它的块或定义自己的利率。

你可以指定功能率(即。样例次)

  • 基于块的样品时间

  • 出口样品时间

  • 混合基于块和出口样品时间

与基于块的样品时候,开工率的s函数指定一组块作为一个整体在初始化阶段的模拟。与出口样品时候,s函数指定样品的时间为每个输入和输出端口分别在初始化期间。在模拟阶段,与基于块的样品时间,s函数处理所有输入和输出每次样品冲击块发生。相比之下,与出口样品时候,阻塞过程特定端口只有一个样本出现端口。

例如,考虑两个样本率,0.5和0.25秒,分别为:

  • 在基于块的方法,选择0.5和0.25引导块执行输入和输出在0.25秒的增量。

  • 出口的方法,设置0.5输入端口和输出端口0.25导致块过程输入2赫兹以4赫兹和输出。

您应该使用和出口样品时间如果应用程序需要不平等的样本率为输入和输出执行或者你不希望运行的开销与输入和输出端口在最高采样率的块。

在某些应用程序中,一个功能块可能需要运行在一个或多个样本率内部输入或输出信号在其他利率。混合块和出口指定采样率的方法允许您创建这样的街区。

在典型的应用程序中,您指定只有一个基于块的样品时间。先进S-functions可能要求的规范和出口或多个块样品时间。

基于块的样品时间

C墨西哥人S-functions指定基于块的样品时间信息

接下来的两个小节将讨论如何指定C墨西哥S-functions基于块的采样时间。第三部分提出了一个简单的示例,展示了如何指定样例次mdlInitializeSampleTimes。一个详细的例子,看到mixedm.c

指定的数量在mdlInitializeSizes样例次

配置你的s函数用于基于块的样品时间,使用

ssSetNumSampleTimes(年代,numSampleTimes);

在哪里numSampleTimes > 0。这告诉仿真软件金宝app®引擎,你的s函数基于块的样品时间。引擎调用mdlInitializeSampleTimes,进而设置样例次。

在mdlInitializeSampleTimes设置采样时间和指定函数调用

mdlInitializeSampleTimes指定了两块执行信息:

你对指定样品的倍(sample_time, offset_time],使用这些宏

ssSetSampleTime(年代,sampleTimePairIndex,sample_time)ssSetOffsetTime(年代,offsetTimePairIndex, offset_time)

在哪里sampleTimePairIndexoffsetTimePairIndex从0开始。

对有效样本时间(大写值中定义的宏simstruc.h):

[CONTINUOUS_SAMPLE_TIME, 0.0] [CONTINUOUS_SAMPLE_TIME FIXED_IN_MINOR_STEP_OFFSET] [discrete_sample_period,抵消][VARIABLE_SAMPLE_TIME, 0.0]

此外,您可以指定样品时间是继承了驾驶,在这种情况下,函数只能有一个样品时间,

(INHERITED_SAMPLE_TIME, 0.0)

[INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]

请注意

如果你的s函数继承采样时间,你应该指定是否安全使用功能在参考模型中,即,模型引用另一个模型。看到指定模型参考样品时间继承为更多的信息。

以下指导方针可能有助于在指定样本时期:

  • 一个连续函数,变化小集成步骤应该注册(CONTINUOUS_SAMPLE_TIME, 0.0)样品时间。

  • 期间不会改变的一个连续函数小集成步骤应该注册[CONTINUOUS_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]样品时间。

  • 离散函数,以指定的速度变化应该注册离散采样时间

    (discrete_sample_period,抵消]

    在哪里

    discrete_sample_period> 0.0

    0.0 < =抵消<discrete_sample_period
  • 一个离散函数,以变量的速度变化应该注册变步离散(VARIABLE_SAMPLE_TIME, 0.0)样品时间。在C语言中墨西哥人S-functions,mdlGetTimeOfNextVarHit函数被调用的时间下一个样本为变步离散任务。的VARIABLE_SAMPLE_TIME只可以用变步解决。

如果你的时间没有内在的样本函数,你必须表明它是遗传的按照以下指南:

  • 作为输入变化的功能,即使在小集成步骤,应该注册(INHERITED_SAMPLE_TIME, 0.0)样品时间。

  • 作为输入变化的函数,但并没有改变在小集成步骤(意义,是小步骤)期间,应该注册[INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]样品时间。

检查样品在执行期间(在mdlOutputsmdlUpdate),用ssIsSampleHitssIsContinuousTask宏。例如,使用下面的代码片段检查连续样本:

如果(ssIsContinuousTask(年代,tid)) {}

确定第三个(离散)的任务,使用下面的代码片段:

如果(ssIsSampleHit(S, 2, tid) {}

仿真软件金宝app引擎总是指定一个索引0连续采样率,如果它存在,但是如果你使用你得到不正确的结果ssIsSampleHit(年代,0,tid)

例如:mdlInitializeSampleTimes

本例中指定的时期有两次离散样本0.01和0.5秒。

静态的空白mdlInitializeSampleTimes(SimStruct * S) {ssSetSampleTime(年代,0,0.01);ssSetOffsetTime(年代,0,0.0);ssSetSampleTime (S, 1, 0.5);ssSetOffsetTime (S, 1, 0.0);}/ * mdlInitializeSampleTimes结束。* /

指定出口样品时间

你不能使用和出口样品倍S-functions输入端口和输出端口。如果一个功能使用和出口样品时间和没有港口,s函数产生仿真软件模型更新或运行时错误。金宝app如果输入或输出端口的数量在一个函数是变量,额外保护应该添加到功能,以确保港口的总数不归零。

使用和出口样品*在你的C墨西哥人功能,您必须指定样品倍的数量和出口的功能mdlInitializeSizes方法:

ssSetNumSampleTimes(年代,PORT_BASED_SAMPLE_TIMES)

您还必须指定样品时间每个输入和输出端口的功能mdlInitializeSizes方法,使用下面的宏

ssSetInputPortSampleTime(年代,idx时期)ssSetInputPortOffsetTime(年代,idx抵消)ssSetOutputPortSampleTime(年代,idx时期)ssSetOutputPortOffsetTime(年代,idx抵消)

调用ssSetNumSampleTimes可以放置在出口之前或之后样品时间规定mdlInitializeSizes。然而,如果ssSetNumSampleTimes不配置功能使用和出口样品时间,任何样本时间设置端口将被忽略。

对于任何给定的端口,您可以指定

  • 一个特定的样本时间和周期

    例如,下面的代码集的样本时间函数第一个输入端口0.1和时间的偏移量0

    ssSetInputPortSampleTime(年代,0,0.1);ssSetInputPortOffsetTime (0, 0);
  • 继承了样本时间(1),即。,the port inherits its sample time from the port to which it is connected (see指定继承采样时间端口)

  • 常数样本时间(),即。,the signal coming from the port is constant (see指定固定样本时间(正)端口)

    请注意

    在触发子系统可用,你所有的功能港口必须继承(1)或常数样本时间()。有关更多信息,请参见配置和出口样品时间用于触发子系统

指定继承采样时间端口

指定端口的样品时间是继承了C墨西哥人功能,mdlInitializeSizes方法应设置它的时期1和它的抵消0。例如,下面的代码指定继承采样时间C墨西哥人s函数的第一个输入端口:

ssSetInputPortSampleTime (0, 1);ssSetInputPortOffsetTime (0, 0);

当你指定出口样品时间,仿真软件引擎调用金宝appmdlSetInputPortSampleTimemdlSetOutputPortSampleTime确定的遗传信号。

一旦所有的利率决定,引擎调用mdlInitializeSampleTimes。即使不需要初始化和出口样品时间在这一点上,引擎调用这个方法来给你的功能配置函数调用关系的机会。功能必须提供一个实现这个方法不管它使用和出口样品*或函数调用连接。尽管可以提供一个空的实现,您可能希望使用它来检查样品的适当性次块继承了在样本期间传播。使用ssGetInputPortSampleTimessGetOutputPortSampleTimemdlInitializeSampleTimes获得的值继承了样例次。例如,下面的代码mdlInitializeSampleTimes首先检查功能输入继承连续采样时间。

如果(! ssGetInputPortSampleTime(年代,0)){ssSetErrorStatus(年代,“不能继承连续样本时间。”)};

请注意

如果你指定功能港口继承他们的样品时间,您还应该指定是否安全使用功能在参考模型中,即,模型引用另一个模型。看到指定模型参考样品时间继承为更多的信息。

如果你写TLC代码生成内联代码从一个功能,如果TLC代码包含一个输出功能,您必须修改TLC代码如果这些条件是正确的:

  • 输出端口一个常数值。它使用或继承了样品的时间

  • 函数是一个多重速率的功能或使用和出口样品时间。

在这种情况下,TLC constant-valued代码必须生成代码输出端口通过使用函数OutputsForTID而不是函数输出。有关更多信息,请参见指定固定样本时间(正)端口

为了防止港口继承一个示例的时间,设置选项SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME的功能代码。在这种情况下,您可以使用薄层色谱功能输出为constant-valued输出端口生成代码。

指定固定样本时间()一个港口

如果您的功能使用和出口样品倍,它可以设置一个样本的时间在它的任何港口。出口样品的时间意味着信号进出港口保持不变。

一个端口输出一个恒定值,函数必须:

  • 使用ssSetOptions在其mdlInitializeSizes方法来添加对样本时间的支持金宝app:

    ssSetOptions(年代,SS_OPTION_ALLOW_CONSTANT_PORT_SAMPLE_TIME);

    请注意

    这个选项会导致功能的端口支持样品的时间金宝app,包括港口从其他块继承他们的样品时间。如果任何功能港口继承采样时间不能有一个样品的时间所示,出现一个错误。样时间这些端口使用mdlSetInputPortSampleTimemdlSetOutputPortSampleTime方法。

  • 设置端口的样品时间和它的抵消0,例如,

    ssSetInputPortSampleTime(年代,0,mxGetInf ());ssSetInputPortOffsetTime (0, 0);
  • 检查mdlOutputs方法的是否tid参数=CONSTANT_TID如果是这样,设置端口的输出的值,如果它是一个输出端口。

看到的一个例子如何创建端口输出一个恒定值,明白了sfun_port_constant.c的源文件sfcndemo_port_constant的例子。

如果你写TLC代码生成内联代码从一个功能,如果TLC代码包含一个输出功能,修改TLC代码如果所有这些条件都是正确的:

  • 输出端口一个常数值。它使用或继承了样品的时间

  • 函数是一个多重速率的功能或使用和出口样品时间。

在这种情况下,TLC constant-valued代码必须生成代码输出端口通过使用函数OutputsForTID而不是函数输出。这个函数OutputsForTID生成输出代码constant-valued组件的功能。如果您配置模型生成多任务处理代码,OutputsForTID还为周期性生成输出代码组件的功能。

例如,查看TLC文件sfun_port_constant.tlc对于C s函数sfun_port_constant.c在模型中sfcndemo_port_constant。在模型中,输入块S-Function2的整个仿真一个常数值。在s函数的代码,第一个输出端口继承的样品时间输入端口,所以输出端口也有一个常数值。功能代码直接指定一个恒定值,第二个输出端口。

在TLC代码中,如果港口有一个恒定值,函数输出不生成代码的输出端口。函数不生成代码的第二输出端口在任何情况下,因为港口总是一个常数值。

对于这个功能,OutputsForTID生成代码的输出端口有一个恒定的值。代码生成器调用函数OutputsForTID,并设置参数tid任务标识符对应的常量值。只有一个输出端口对应的任务标识符常量值,OutputsForTID然后生成代码的端口。

配置和出口样品时间用于触发子系统

使用一个C墨西哥人在触发子系统功能,和出口样品时间功能必须执行以下任务。

  • 使用ssSetOptionsmdlInitializeSizes方法来显示功能可以运行在一个触发子系统:

    ssSetOptions(年代,SS_OPTION_ALLOW_PORT_SAMPLE_TIME_IN_TRIGSS);
  • 设置所有的港口要么继承(1)或常数样本时间()在其mdlInitializeSizes方法。

  • 处理触发采样时间的继承mdlSetInputPortSampleTimemdlSetOutputPortSampleTime方法如下。

    由于功能港口继承他们的样品时间,仿真软件引擎调用金宝appmdlSetInputPortSampleTimemdlSetOutputPortSampleTime在样本期间传播。宏ssSampleAndOffsetAreTriggered可用于这些方法来确定功能驻留在触发子系统。如果s函数驻留在一个触发子系统,必须设置样品时间和调用哪个方法抵消的港口是打电话INHERITED_SAMPLE_TIME(1)。

    设置一个端口的样品时间和抵消INHERITED_SAMPLE_TIME表明,港口的样品时间触发,即。,it produces an output or accepts an input only when the subsystem in which it resides is triggered. The method must then also set the sample times and offsets of all of the other S-function input and output ports to have either triggered or constant sample time (),哪个是合适的,例如,

    静态孔隙mdlSetInputPortSampleTime (SimStruct *年代,int_T portIdx, real_T sampleTime real_T offsetTime){/ *如果S函数驻留在一个触发子系统,样品时间和抵消都等于INHERITED_SAMPLE_TIME传递给这个方法。因此,如果触发,以下行设置采样时间和抵消INHERITED_SAMPLE_TIME的输入端口。* / ssSetInputPortSampleTime (S portIdx sampleTime);ssSetInputPortOffsetTime (S portIdx offsetTime);/ *如果触发,设置输出端口来继承,* /如果(ssSampleAndOffsetAreTriggered (sampleTime offsetTime)) {ssSetOutputPortSampleTime(年代,0,INHERITED_SAMPLE_TIME);ssSetOutputPortOffsetTime(年代,0,INHERITED_SAMPLE_TIME);/ *注意,如果有额外的输入和输出端口功能,他们应该将继承或常数在这一点上,。* /}}

    没有办法的s函数驻留在一个触发子系统来预测模型引擎是否会调用金宝appmdlSetInputPortSampleTimemdlSetOutputPortSampleTime样品时间设置它的港口。出于这个原因,这两种方法都必须能够正确设置所有端口的样品时间所以引擎调用一次只有一个方法。

  • mdlUpdatemdlOutputs,使用ssGetPortBasedSampleTimeBlockIsTriggered检查功能是否驻留在一个触发子系统和如果是,使用合适的算法计算其状态和输出。

看到sfun_port_triggered.c的源文件sfcndemo_port_triggered示例模型,对如何创建一个函数的一个例子,可以用于触发子系统。

混合基于块和出口样品时间

混合的方法结合了基于块的分配样本倍,出口的方法。你第一次指定mdlInitializeSizes利率的总数,块的运作,包括块和输入和输出率,使用ssSetNumSampleTimes

然后设置SS_OPTION_PORT_SAMPLE_TIMES_ASSIGNED选项,使用ssSetOptions,告诉你要使用的模拟引擎和出口的方法来指定单独的输入和输出端口。接下来,在基于块的方法,您指定时间和补偿的所有块的利率,包括内部和外部使用

ssSetSampleTime ssSetOffsetTime

最后,在出口的方法,你为每个端口指定利率,使用

ssSetInputPortSampleTime (S idx周期)ssSetInputPortOffsetTime (S idx抵消)ssSetOutputPortSampleTime (S idx周期)ssSetOutputPortOffsetTime (S idx抵消)

注意每一个指定的端口速率必须同先前宣布的块率。例如s函数,看看mixedm.c

请注意

如果你使用SS_OPTION_PORT_SAMPLE_TIMES_ASSIGNED选择,你的s函数不能继承样品时间。相反,您必须指定每个输入和输出端口的速度运行。

多重速率的功能块

在一个多重速率的功能块,您可以封装代码定义每一个行为mdlOutputsmdlUpdate函数声明,决定一个示例。墨西哥人在C s函数,ssIsSampleHit宏观判断当前时间是一个示例指定样品时间。宏这个语法:

ssIsSampleHit (S st_index tid)

在哪里年代SimStruct,st_index标识一个特定的样品时间指数tid是任务ID (tid是一个参数mdlOutputsmdlUpdate功能)。

例如,这些语句在一个C墨西哥人s函数指定三个示例:一个连续的行为和两个离散行为。

ssSetSampleTime(年代,0,CONTINUOUS_SAMPLE_TIME);ssSetSampleTime (S, 1, 0.75);ssSetSampleTime (S, 2, 1.0);

mdlUpdate函数,以下语句封装代码定义了行为的样本时间0.75秒。

如果(ssIsSampleHit(年代,1,tid)) {}

第二个参数,1,对应于第二个样品时间,0.75秒。

使用以下行来封装的代码定义了连续样本的行为:

如果(ssIsContinuousTask(年代,tid)) {}

示例定义样本的时间连续的块

这个例子定义了一个样品时间是连续的一块。

/ *初始化样本时间和抵消。* /静态孔隙mdlInitializeSampleTimes (SimStruct * S) {ssSetSampleTime(年代,0,CONTINUOUS_SAMPLE_TIME);ssSetOffsetTime(年代,0,0.0);}

你必须添加这句话mdlInitializeSizes函数。

ssSetNumSampleTimes (S, 1);

的例子定义一个混合块样品时间

这个例子定义了一个混合功能块样品时间。

/ *初始化样本时间和抵消。* /静态孔隙mdlInitializeSampleTimes (SimStruct * S){/ *连续状态样本时间和抵消。* / ssSetSampleTime(年代,0,CONTINUOUS_SAMPLE_TIME);ssSetOffsetTime(年代,0,0.0);/ *离散状态样本时间和抵消。* / ssSetSampleTime 1 0.1);ssSetOffsetTime (S, 1, 0.025);}

在第二个示例,抵消使仿真软件引擎调用金宝appmdlUpdate函数在这些时间:0.025秒,0.125秒,0.225秒,等等,在0.1秒的增量。

下面的语句,这表明有多少样本*定义,也出现在mdlInitializeSizes函数。

ssSetNumSampleTimes (S, 2);

多重速率的S-Functions和样品时间计算

为解决固定步,仿真软件使用整数运算,而不是浮点运金宝app算,计算样品的时间。因此,任务时间相应的样品时间的整数倍数。

这个计算方法成为重要如果你考虑执行布尔逻辑基于任务次多重速率的S-functions。例如,考虑一个功能,有两个样品。这一事实(ssIsSampleHit(年代,idx1) = = true & & ssIsSampleHit(年代,idx2) = = true,无法保证ssGetTaskTime(年代,idx1) = = ssGetTaskTime(年代,idx2)。

同步多重速率的功能块

如果任务运行在不同的利率需要共享数据,您必须确保由一个任务生成的数据是有效的,当访问另一个任务运行速度不同。您可以使用ssIsSpecialSampleHit宏观的mdlUpdatemdlOutputs常规的多重速率的功能,以确保共享数据是有效的。这个宏的回报真正的如果打击发生在一个样本率和样本也发生在另一个率在相同的时间步。因此允许更高的速率较慢的速度所需的任务提供数据任务速度慢的任务可以容纳。当使用ssIsSpecialSampleHit宏,样品时间越慢必须是一个整数倍数的样品时间越快。

例如,假设你的模型有一个输入端口操作在一个利率(样本时间指数(0)和一个输出端口操作以较慢的速度(示例1)指数的时间。此外,假设您希望输出端口输出当前输入的值。下面的例子说明了这个宏的使用。

如果(ssIsSampleHit(年代,0,tid){如果ssIsSpecialSampleHit (0, 1, tid){/ *转移输入输出内存。* /…}}如果ssIsSampleHit(年代,tid){/ *发出输出。* /…}

在这个例子中,第一个块运行样本冲击发生时输入的速度。如果打击也发生在输出率,传输的输入输出内存块。第二块发生当一个示例运行速度输出。它的内存区域转移输出块的输出。

注意,那些高收入的任务总是运行速度较慢,前任务。因此,输入任务在前面的例子总是在运行输出任务,确保有效数据输出端口总是存在。

指定模型参考样品时间继承

如果你的C墨西哥人s函数继承其样本*的块驱动它,你的s函数应该指定引用模型包含功能是否能从父母继承样本时间模型。如果s函数的输出不依赖于其继承的样品时间,使用ssSetModelReferenceSampleTimeInheritanceRule宏设置功能样品时间继承规则USE_DEFAULT_FOR_DISCRETE_INHERITANCE。否则,设置规则DISALLOW_SAMPLE_TIME_INHERITANCE不允许继承采样时间为参考模型,包括S-functions的输出取决于他们继承采样时间,从而避免无意的模拟错误。

请注意

如果你的s函数不设置这个标志,仿真软件引擎假定它并不排除引用模型包含从继承一个示例。金宝app然而,引擎可选地警告你,引用的模型包含S-functions不指定一个采样时间继承规则(见块的输出取决于继承采样时间)。

如果你不确定一个现有的s函数输出取决于其继承采样时间,检查它是否调用下列C宏:

  • ssGetSampleTime

  • ssGetInputPortSampleTime

  • ssGetOutputPortSampleTime

  • ssGetInputPortOffsetTime

  • ssGetOutputPortOffsetTime

  • ssGetInputPortSampleTimeIndex

  • ssGetOutputPortSampleTimeIndex

或薄层色谱功能:

  • LibBlockSampleTime

  • CompiledModel.SampleTime

  • LibBlockInputSignalSampleTime

  • LibBlockInputSignalOffsetTime

  • LibBlockOutputSignalSampleTime

  • LibBlockOutputSignalOffsetTime

如果你的s函数不调用任何这些宏或函数,其输出不依赖于继承采样时间,因此它的使用是安全的,在参考模型中,继承他们的样品时间。

采样时间继承规则的例子

函数的一个例子,从继承采样时间排除了一个参考模型,考虑一个具有以下的功能mdlOutputs方法:

静态孔隙mdlOutputs (SimStruct *年代,int_T tid) {const real_T * u = (const real_T *) ssGetInputPortSignal (S, 0);real_T * y = ssGetOutputPortSignal (S, 0);y [0] = ssGetSampleTime(年代,tid) *你[0];}

这个功能是其继承了样本的输出时间,因此它的输出取决于其继承的样品时间,因此它是不安全的使用在一个参考模型。由于这个原因,这个功能应指定其模型引用继承规则如下:

ssSetModelReferenceSampleTimeInheritanceRule(年代,DISALLOW_SAMPLE_TIME_INHERITANCE);

另请参阅

||

相关的话题