主要内容

代码生成变种街区

从仿真软件代码生成器生成的代码金宝app®包含一个或多个模型变体子系统,变体模型,变异来源,变体水槽块。学习如何创建一个模型包含变种块,明白了创建一个简单的变体模型。学习如何创建一个定制模式顾问检查评估路径生成的代码从活跃的和不活跃的变体在不同系统模式,明白了创建自定义检查路径从一个模型评估活跃的和不活跃的变体(金宝app仿真软件检查)

请注意

在代码生成,一个警告的代码生成功能包装相关变体块可能会显示出来。变体块的块参数对话框中,点击代码生成然后选择可重用的功能函数包装下拉列表来解决这个问题。

代码生成的不同变体的选择,活跃的变体,默认的变体。为变异生成代码,设置以下条件变体子系统,变异来源,或变体沉块:

  • 选择表达式作为变量控制方式

  • 选择代码编译作为变体激活时间

生成的代码块周围是C预处理器条件变体子系统#如果,其他#,# elif,# endif。代码生成的变异源和变体沉块周围是C预处理条件#如果# endif。因此,选择积极的变异在编译时间和预处理条件确定哪些部分代码的执行。

构造变异模型和生成预处理器指令在生成的代码中,看到的例子使用变体模型来生成代码,使用C预处理条件

构建变体子系统和生成预处理器指令在生成的代码中,看到的例子使用变体子系统生成的代码,使用C预处理器条件

构造模型与变异源和汇并生成预处理器指令在生成的代码中,看到的例子代表变异源和汇在生成的代码块

限制变体子系统代码生成

生成预处理条件,块的类型,您可以将其放置在孩子不同子系统的子系统块是有限的。连接是不允许的变体子系统框图。然而,在代码生成过程中,一个VariantMerge块放置在每一个的输入外港块内的变异子系统框图。所有的子系统连接到每一个孩子VariantMerge块。

在下面的图中,代码生成过程使下面的连接和补充道VariantMerge块的sldemo_variant_subsystems模型。

相比一般的阻止合并VariantMerge块只能有一个参数是输入的数量。的VariantMerge块用于代码生成子系统内部的变种,而不是外部用于模型可用。输入的数量VariantMerge确定和连接如下图所示。

孩子不同的子系统的子系统块必须原子子系统。选择治疗作为原子单元子系统的参数块参数对话框中,子系统的原子。的VariantMerge块插入外港的子系统子系统如果不止一个孩子。如果源块VariantMerge块nonvirtual输入时,将显示一条错误消息在代码生成。你必须源块相邻,插入信号转换模块内部变异的选择。信号输入一个变体子系统块必须有相同的信号属性(例如,信号维度,港口宽度,和存储类)。的VariantMerge块不支持不同的信号属性,因为输金宝app入端口和输出端口共享相同的内存。您可以使用符号维度来生成代码为一位带着孩子的变体子系统子系统不同输出信号的维度。

生成的代码组件而不是编译条件

以下组件代码条件编译即使不仅仅是变体子系统或模型,有条件地编译引用它们。

  • rtModel数据结构领域

  • # include效用的文件

  • 全局常数参数结构字段引用的多个子系统激活不同的变体

  • 参数配置为使用一个进口,出口,或自定义代码生成存储类,是由多个子系统引用激活不同的变体

  • 参数配置为使用一个进口,出口,或自定义代码生成存储类,和变体模型使用的块

代码生成变种街区有一个变体的选择

建模模式中根尺寸块连接到一个变体块与一个变体的选择,仿真软件插入地面的隐藏块组合块,信号转换块,块合并一个变体。金宝app如果变体选择的求值结果为false,这产生的输出块组合0.0

例如,模型Varianttoground包含一个变异源块与一个变体的选择。当变量控制SYSCONST_A = = 6评估为true,输入子系统是一个正弦波。当SYSCONST_A = = 6的求值结果为false,输入子系统0.0

varianttoground.c文件包含这个代码:

*罪:“< Root > /正弦波”包含:* SignalConversion来自:< Root > /子系统的* / #如果SYSCONST_A = = 6 Varianttoground_B。VM_Conditional_Signal_Subsystem_0 =罪(Varianttoground_M - > Timing.t [0]);# / * SignalConversion来自其他:“< Root > /子系统”* / Varianttoground_B。VM_Conditional_Signal_Subsystem_0 = 0.0;# endif结束/ *罪:< Root > /正弦波的* /

生成的代码中的注释表明存在隐藏信号的转换。超链接的评论,你可以跟踪模型中原来的块,触发了隐藏块的插入。代码不包含变种合并块的评论,因为这一块没有关联生成的代码。变体合并块内部使用,不是在模型库中。金宝app

全球数据保护:信号和状态

块模型变体时,全球信号和状态是守卫在生成的代码与相应的变体。

考虑一个包含一个模型变异来源块。的变异来源块有条件V = = 1V = = 2

在生成的代码中,全球信号是谨慎的声明,模型初始化,定义的数据,如下所示。

信号保护:

声明:

/ *输出块信号* /#如果V = = 1 | | real_T V = = 2myOutput;/ *“< Root > / Gain3”* / # endif

模型初始化:

/ *出口全球信号* / #如果V V = = 1 | | = = 2 myOutput = 0.0;# endif

数据的定义:

*出口全球信号* *注意:出口全球信号屏蔽信号与一个出口全球*存储类的名称。代码一代声明内存*这些信号出口他们的符号。* * / #如果V V = = 1 | | = = 2走读生real_TmyOutput;/ *“< Root > / Gain3”* / # endif

全球数据保护:参数

当你为一个模型生成代码块包含变种,参数是在生成的代码中。

考虑一个模型常数块与块变异来源。

在生成的代码中,参数的常数块守卫在头文件如下所示。

/ *导出的数据定义* // *常量内存部分* // *定义自定义存储类:常量* /#如果V = = 2 constint32_TParameter2=1;# endif

守卫参考模型头

当一个模型模型参考块,条件是由于内联变体,指的是头文件和实例模型参考块是谨慎的。

考虑该模型与两个模型引用块条件由于内联变体。

当你为这个模型生成代码,指的是头文件和实例模型参考块保护,如以下代码所示。

# include“mWithTwoModelBlocks_Top_types.h”# include“multiword_types.h”#如果(= = 1)/ /守卫# define mWithTwoModelBlocks_Ref2_MDLREF_HIDE_CHILD_ # include“mWithTwoModelBlocks_Ref2.h”# endif #如果(B = = 1) / /保护# include“mWithTwoModelBlocks_Ref1.h”# endif

守卫功能块头

当一个模型功能块,条件是由于任何连接块,变体模型相关的头文件金宝app功能块在生成的代码中相应的变异情况。

考虑一个模型与一个功能块连接到一个变异来源块。在生成的代码中,头文件与变体守卫条件。

功能块连接块变异来源

的ifndef mSFunctionInclude_COMMON_INCLUDES_ # define mSFunctionInclude_COMMON_INCLUDES_ # include“rtwtypes.h”# include“rt_logging.h”#如果V = = 1 / /保护# include“myHeader.h”# endif # endif / * mSFunctionInclude_COMMON_INCLUDES_ * /