使用包含 MATLAB Function 模块的封装库子系统运行仿真并生成代码
此示例说明如何使用包含 MATLAB Function 模块的封装库子系统来运行仿真和生成 C 代码。对函数代码、子系统或封装属性的编辑会影响模型中该模块的所有实例,而对封装参数的更改只会影响所选模块。如果需要可以生成代码的自定义模块的副本,请使用封装库模块。有关详细信息,请参阅创建自定义库和设计和创建自定义模块。
导航模型
封装子系统包含一个 MATLAB Function 模块,该模块使用
函数计算两个输入向量的卷积。封装参数 shape 允许您将归一化权重更改为 conv
full
、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 模块编辑器