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

导航模型
封装子系统包含一个 MATLAB Function 模块,该模块使用 函数计算两个输入向量的卷积。封装参数 shape 允许您将归一化权重更改为 convfull、same 或 valid。该模块使用以下 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_filter 和 my_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];
}
}另请参阅
MATLAB Function | MATLAB Function 模块编辑器