文档

代表变异源和汇在生成的代码块

您可以使用变异来源变体水槽块感知多个实现的模型在一个单一的、统一的框图。每个实现取决于您所设置的条件变异来源变体水槽块。万博1manbetx动态仿真模块®传播这些条件包括上游和下游块根输入和输出端口。

您可以生成:

  • 从仿真软件模型包含的代码万博1manbetx变体水槽变异来源块。

  • 代码包含预处理控制每个变体的活化条件的选择。

  • 预处理条件,允许没有活跃的变体的选择。

代表变异源和变体沉块模型万博1manbetx

这个例子展示了如何变异源块模型元素的条件。

  1. 从模型块库,加1万博1manbetx正弦波函数块,两个添加三块,获得块,两个外港,两个变异来源块到一个新的模型。

  2. 打开正弦波函数块。为正弦类型参数,选择基于样本。为时间(t)参数,选择利用仿真时间。为样品时间参数,插入的值0.2

  3. 四份正弦波函数块。

  4. 连接和名称块如图所示。

  5. 插入的值2,3,4Gain2,Gain3,Gain4块,分别。

  6. 为模型的名称inline_variants_example

  7. 打开参数对话框变异来源

  8. 版本控制端口1列,替换Variant_1V = = 1。端口2,取代Variant_2V = = 2

  9. 打开参数对话框变体Source1

  10. 版本控制列,取代Variant_1W = = 1。端口2,取代Variant_2W = = 2

  11. 在MATLAB命令窗口,使用这些命令来定义VW作为万博1manbetxSimulink.Parameter对象。

    V = 万博1manbetxSimulink.Parameter;V。Value = 1; V.DataType='int32'; V.CoderInfo.StorageClass = 'custom'; V.CoderInfo.CustomStorageClass = 'Define'; V.CoderInfo.CustomAttributes.HeaderFile='inline_importedmacro.h' W = Simulink.Parameter; W.Value = 2; W.DataType='int32'; W.CoderInfo.StorageClass = 'custom'; W.CoderInfo.CustomStorageClass = 'Define'; W.CoderInfo.CustomAttributes.HeaderFile='inline_importedmacro.h'

    在这个示例中,变量控制变量万博1manbetxSimulink.Parameter对象。对于代码生成,如果你使用万博1manbetxSimulink.Variant对象指定变量控制,使用万博1manbetxSimulink.Parameter对象或MATLAB变量来指定他们的条件。。

    变量定义为控制变量万博1manbetxSimulink.Parameter对象可以有一个这样的存储类:

    • 定义指定头文件

    • ImportedDefine指定头文件

    • CompilerFlag

    • SystemConstant (AUTOSAR)

    • 用户定义的自定义存储类,它定义了数据作为一个宏指定头文件

    如果你使用标量变量控制变量来模拟模型,您可以将这些变量转换成万博1manbetxSimulink.Parameter对象。看到不同控制变量转换成仿真软件。万博1manbetx参数对象(万博1manbetx模型)。

  12. 模拟模型。

    输入端口1的主动选择变异来源因为不同控制变量的值V1。输入端口2的积极选择变体Source1因为不同控制变量的值W是2。不活跃的选择从执行,和他们的路径是灰色显示的图。

控制变量的选择选择指定条件

您可以生成代码中每个变量的选择是C预处理器内封闭条件#如果# endif。编译器在编译时选择积极的变异和预处理条件确定哪些部分代码的执行。

  1. 在模型编辑器中万博1manbetx,选择模拟>模型配置参数

  2. 选择代码生成面板,设置系统目标文件ert.tlc

  3. 报告窗格中,选择创建代码生成报告

  4. 在你的模型中,打开参数对话框变异来源

  5. 选择分析所有选择在更新图和生成预处理条件参数。在一个更新图或模拟,当您选择该参数,仿真软件分析所有变体的选择。万博1manbetx这种分析提供了代码生成的早期验证准备变体的选择。在代码生成,当您选择该参数,代码生成器生成预处理器控制每个变体的活化条件的选择。

  6. 清除覆盖不同的条件和使用下面的变体参数。

  7. 清除允许控制零活跃的变体参数。

  8. 打开参数对话框变异来源1。重复步骤5 - 7所示。

  9. 构建的模型。当完成代码生成,显示代码生成报告。

检查生成的代码

  1. 在代码生成报告,选择inline_variants_example.c文件。

  2. inline_variants_example.c文件,调用inline_variants_example_step函数和inline_variants_example_initialize函数是有条件地编译如图所示:

/ *模型阶跃函数* /空白inline_variants_example_step (void) {real_T rtb_Sine4;real_T rtb_VariantMerge_For_Variant_So;/ *罪:“< Root > / Sine1”* / #如果V = = 1 rtb_Sine4 =罪(inline_variants_example_DW (real_T)。反* 2.0 * 3.1415926535897931/10.0);# endif / * V = = 1 * / / *罪:“< Root > / Sine1”* / / *罪:“< Root > / Sine2”包含:*罪:“< Root > / Sine3”*金额:< Root > /添加的* / #如果V = = 2 rtb_Sine4 =罪(inline_variants_example_DW (real_T)。counter_i * 2.0 * 3.1415926535897931/10.0) +罪(inline_variants_example_DW (real_T)。counter_f * 2.0 * 3.1415926535897931/10.0);# endif / * V = = 2 * / / *罪:“< Root > / Sine2”* / / *外港:“< Root > /着干活”包含:*获得:“< Root > / Gain3”* / inline_variants_example_Y。着干活= 3.0 * rtb_Sine4;/ *获取:“< Root > / Gain2”* / #如果W = = 1 rtb_VariantMerge_For_Variant_So = 2.0 * rtb_Sine4;# endif W = = 1 / * * / / *获得结束:“< Root > / Gain2”* / / *罪:“< Root > / Sine4”包含:*罪:“< Root > / Sine5”*总和:“< Root > / Add1”* / #如果W = = 2 rtb_VariantMerge_For_Variant_So =罪(inline_variants_example_DW (real_T)。counter_fe * 2.0 * 3.1415926535897931/10.0) * 2.0 +罪(inline_variants_example_DW (real_T)。counter_e * 2.0 * 3.1415926535897931/10.0);# endif / * W = = 2 * / / *罪:“< Root > / Sine4”* / / *外港:“< Root > / Out2”包含:*获得:“< Root > / Gain4”* / inline_variants_example_Y。Out2 = inline_variants_example_P。Gain4_Gain * rtb_VariantMerge_For_Variant_So; ... }

的变量rtb_Sine4rtb_VariantMerge_For_Variant_So持有的输入值变异来源块。请注意,这些变量的代码是有条件的。的变量inline_variants_example_Y.Out1inline_variants_example_Y.Out2持有的输出值变异来源块。请注意,这些变量的代码不是条件。

生成代码与零控制活跃的变体

您可以生成代码块连接到输入和输出块变异来源的条件。

  1. 变异来源,打开参数对话框。选择的参数允许控制零活跃的变体

  2. 变异来源1,打开参数对话框。选择的参数允许控制零活跃的变体

当您选择允许控制零活跃的变体参数,您可以为一个模型,其中包含生成代码变异来源变体水槽块即使你指定一个值变异控制变量不允许一个活跃的变体。选择一个值变异控制变量不允许一个活跃的变种,而不是选择允许控制零活跃的变体参数,产生一个错误。

生成的代码inline_variants_example。注意到的inline_variants_example.c文件,变量的代码inline_variants_example_Y.Out1inline_variants_example_Y.Out2是有条件的。

/ *模型阶跃函数* /空白inline_variants_example_step (void) {…#如果V = = 1 | | inline_variants_example_Y V = = 2。着干活= 3.0 * rtb_Sine4;# endif / * V = = 1 | | V = = 2 * /…#如果(V = = 1 & & W = = 1) | | (V = = 2 & & W = = 1) | | inline_variants_example_Y W = = 2。Out2 = 4.0 * rtb_VariantMerge_For_Variant_So;# endif / * (V = = 1 & & W = = 1) | | (V = = 2 & & W = = 1) | | W = = 2 * /…

全局数据保护的限制

外部端口而且大多数DWork向量,信号,和州,预处理条件(#如果# endif)围绕全球数据变量声明。模型中启用全球C API代码块输出信号,全球块参数和离散和连续状态,预处理条件不环绕全球数据变量声明。C API的信息,请参阅使用C API之间交换数据和外部代码生成(万博1manbetx仿真软件编码器)。

状态日志限制

有一些罕见的情况下,预处理条件不围绕全局数据结构包含状态变量的声明。为模型,包含变异来源块或变体水槽阻塞,也包含维护状态信息,如单位延迟块,排除预处理条件周围状态变量声明可以导致不匹配仿真和代码生成的结果。

例如,假设有一个模型变异来源块和四个变量的选择。其中一个选择包含块与状态信息。如果你模拟的模型与积极的变异除了包含状态信息的变量选择,没有登录状态数据。在模型。h文件,生成的代码还初始化这些全局状态变量0因为#如果# endif警卫不包围状态变量声明。如果您创建了一个模型.mat文件从一个模型. exe文件,并比较它的模拟输出,结果不匹配。对于这个例子,仿真输出是空的,因为没有记录的状态数据。的模型.mat文件包含多个值0

如果活动包含状态信息的变体是变体的选择,结果做匹配。

相关的话题

这个主题有帮助吗?