Main Content

使用包含 MATLAB Function 模块的封装库子系统运行仿真并生成代码

此示例说明如何使用包含 MATLAB Function 模块的封装库子系统来运行仿真和生成 C 代码。对函数代码、子系统或封装属性的编辑会影响模型中该模块的所有实例,而对封装参数的更改只会影响所选模块。如果需要可以生成代码的自定义模块的副本,请使用封装库模块。有关详细信息,请参阅创建自定义库设计和创建自定义模块

导航模型

封装子系统包含一个 MATLAB Function 模块,该模块使用 conv 函数计算两个输入向量的卷积。封装参数 shape 允许您将归一化权重更改为 fullsamevalid。该模块使用以下 MATLAB 代码计算卷积:

function c = my_conv(a, b, shape)
if shape == 1
    c = conv(a, b, "full");
elseif shape == 2
    c = conv(a, b, "same");
else
    c = conv(a, b, "valid");
end

在此模型中,模块的顶部实例的 shape 参数设置为 full,中间实例设置为 same,底部实例设置为 valid。运行仿真以计算向量的卷积,并在 Display 模块中显示其值。

两个顶部模块实例输出不同向量大小,因为每个模块使用一个不同权重来计算卷积。请更改任一模块中的 shape 参数,并再次仿真以查看输出的变化。

从模型生成 C 代码

如果您有 Embedded Coder 或 Simulink Coder 许可证,您可以从这个示例生成代码,而无需更改参数或模块。然而,MATLAB Function 模块仅支持 MATLAB 函数的一个受限子集的代码生成。有关详细信息,请参阅 C/C++ 代码生成支持的函数和对象 (MATLAB Coder)

如果库模块的多个实例的参数和输入相同,则可以生成具有可重用函数的代码,这些函数表示每个相同的 MATLAB Function 模块。要启用此行为,您可以右键点击 MATLAB Function 模块,点击模块参数(子系统),然后打开代码生成选项卡。将函数打包设置为 Reusable function。有关详细信息,请参阅Generate Reusable Code from Library Subsystems Shared Across Models (Simulink Coder)

通过打开 Embedded Coder 或 Simulink Coder 并点击生成代码来生成代码。此模型为每个模块实例生成唯一 C 函数。要生成可重用函数,请将每个库子系统实例的 shape 参数设置为 full 并生成代码。生成的代码重用 my_conv_filtermy_conv_filter1 实例的逻辑,因为它们具有相同的模块输入和封装参数值。

   /*
    * Output and update for atomic system:
    *    '<S1>/MATLAB Function'
    *    '<S2>/MATLAB Function'
    */
   void MLFB_model_MATLABFunction(const real_T rtu_a[2], const
     real_T rtu_b[5], real_T rty_c[6])
   {
     int32_T b_k;
     int32_T i;
     for (i = 0; i < 6; i++) {
       rty_c[i] = 0.0;
     }
     for (i = 0; i < 2; i++) {
       for (b_k = 0; b_k < 5; b_k++) {
         int32_T tmp;
         tmp = i + b_k;
         rty_c[tmp] += rtu_a[i] * rtu_b[b_k];
       }
     }
   }

my_conv_filter2 实例使用不同函数,因为它使用不同输入。

   /* Output and update for atomic system: '<S3>/MATLAB Function' */
   void MLFB_model_MATLABFunction_p(const real_T rtu_a[3], const
     real_T rtu_b[3], real_T rty_c[5])
   {
     int32_T i;
     for (i = 0; i < 5; i++) {
       rty_c[i] = 0.0;
     }
     for (i = 0; i < 3; i++) {
       rty_c[i] += rtu_b[i] * rtu_a[0];
       rty_c[i + 1] += rtu_b[i] * rtu_a[1];
       rty_c[i + 2] += rtu_b[i] * rtu_a[2];
     }
   }

另请参阅

相关主题