如何向 Simulink 添加 C++ S-function
在我们之前的示例中,如 Matlab Level 2 S-Function 示例:正弦波(连续输出),我们展示了如何用 C++ 创建简单的 S-function。
以下是如何向 Simulink 添加 C++ S-function:
步骤 1:创建 S-function 的源代码文件
在 Matlab/Simulink 中打开的目录中,创建一个新文件,例如 sine_wave_generator.cpp。有关 C++ 代码示例,请参见 Matlab Level 2 S-Function 示例:正弦波(连续输出)。
我建议使用 Visual Studio Code 而不是 Matlab 作为 C++ 编辑器。
步骤 2:编译 S-function
打开终端并运行
mex sine_wave_generator.cpp我不建议在 Matlab 中运行此命令,尽管这是可能的。我建议始终使用系统终端。
编译过程仅在输出的最后一行为 MEX completed successfully. 时才成功。
如果你看到任何其他输出,你需要调试问题。
常见问题有:
- 如何修复 Matlab mex 错误:You can’t use ‘macro parameter character #’ in vertical mode.
- 缺少额外的库或包含路径:如何通过 ‘mex’ 编译 Matlab/Simulink S-function 时链接额外的库
- 如果你使用现代 C++ 的特性,你可能需要选择正确的 C++ 标准:如何使用 ‘mex’ 编译 Matlab/Simulink S-function 时指定 C++ 版本
步骤 3:创建新的 Simulink 模型
为了测试,我建议创建新的 Simulink 模型而不是重用旧的模型。
步骤 4:添加 S-function 模块
首先点击对话框添加新模块:

现在,点击 User-defined functions 并选择 S-function 模块。即使你使用的是 Level 2 s-function,也不要选择 Matlab Level-2 S-function 模块。Level 2 S-function 在普通的 S-function 模块上也能正常工作。

将此模块拖到主 Simulink 模型区域中,即另一个窗口中通常就在 library browser 对话框后面的大片白色空白区域:

步骤 5:配置 S-function 模块
双击 S-function 模块以打开配置对话框:

在对话框中,编辑 Name 并输入 S-function 的名称。
S-function 的名称始终是 .cpp 文件的名称(不带 .cpp 扩展名)。
在我们的例子中,C++ 文件名为 sine_wave_generator.cpp,因此 S-function 的名称为 sine_wave_generator。
按 Apply 保存更改并关闭对话框。
步骤 6:在 Simulink 中连接 S-function 模块
在我们的示例中,我们可以将 S-function 模块连接到 Scope 模块以可视化输出。
这不是强制性的,但这是验证 S-function 是否按预期工作的好方法。
要添加 Scope 模块,再次点击导航栏中的 Library browser 图标:

点击 Sinks 并选择 Scope 模块:

将 Scope 模块拖到主 Simulink 模型区域中:

关闭 Library browser 对话框。
现在,将 S-function 模块的输出连接到 Scope 模块的输入:

连接的模块现在应该如下所示:

步骤 7:运行 Simulink 模型
点击 Simulink 工具栏中的 Run 按钮运行仿真:

步骤 8:检查示波器
如果一切按预期工作,你现在可以双击 Scope 模块查看 S-function 的输出:

这将打开一个新窗口,显示 S-function 的示波器输出:
