使用 MATLAB System 模块和 System object 创建自定义模块
本主题介绍 MATLAB System 模块,解释如何使用该模块实现您的 System object™,并描述如何针对您的 Simulink® 模型配置该模块。
System object
利用 System object,您可以使用 MATLAB® 语言实现您的算法。MATLAB System 模块允许您在 Simulink 中使用 System object。
使用 MATLAB System 模块之前,必须具有要与 MATLAB System 模块关联的 System object。System object 是一种特殊的 MATLAB 类。System object 专为实现和仿真输入随时间变化的动态系统而设计。有关创建 System object 的详细信息,请参阅自定义适用于 Simulink 的 System object。
为什么要使用 MATLAB System 模块?
使用 MATLAB System 模块,您可以:
将您的 System object 与 Simulink 集成
在 MATLAB 和 Simulink 中共享同一个 System object
在 Simulink 中使用您的算法之前,先在 MATLAB 中对算法进行单元测试
自定义对话框的自定义设置
通过更好的初始化进行高效仿真
处理状态
使用端口标签自定义模块图标
访问两种仿真模式
System object 存在于其他 MATLAB 产品中。MATLAB System 模块仅支持使用 MATLAB 语言编写的 System object。此外,如果一个 System object 具有对应的 Simulink 模块,则您不能为它实现 MATLAB System 模块。
注意
要在 Simulink 环境中将您的 System object 与 MATLAB System 模块结合使用,它必须具有一个可以不带任何参量而直接调用的构造函数。默认情况下,System object 构造函数具有此功能,因此您不需要自行定义构造函数。但是,如果您创建自己的 System object 构造函数,则必须保证能够不带参量地调用该构造函数。
选择正确的模块类型以在 Simulink 中包含 MATLAB 算法
在 Simulink 中包含 MATLAB 算法的机制有几种,例如:
MATLAB System 模块
MATLAB Function 模块
Interpreted MATLAB Function 模块
Level-2 MATLAB S-Function 模块
有关如何选择正确模块的帮助信息,请参阅比较自定义模块功能。
使用 MATLAB System 模块在 Simulink 中实现 System object
要在 Simulink 中实现您的具有自定义模块行为的 System object,请使用 MATLAB System 模块并按照以下步骤操作:
创建一个新模型,并将 MATLAB System 模块添加到您的模型中。

在模块对话框中,从新建列表中选择基本、高级;如果您要从模板创建一个新的 System object,则选择 Simulink 扩展。根据您的需要修改模板并保存 System object。
在 System object 名称中输入 System object 的完整路径名称。点击列表箭头。如果当前文件夹中存在有效的 System object,其名称将出现在列表中。
MATLAB System 模块图标和端口标签会更新为对应 System object 的标签。例如,假设您在当前文件夹中选择一个名为
lmsSysObj的 System object。模块将更新,如以下图窗中所示:
双击该模块。MATLAB System 模块对话框会反映 System object 参数。如果 System object 使用 MATLAB 语言,则该对话框包括源代码。
如果采取了以下操作,则不会出现源代码:
已将 System object 转换为 P 代码。
使用
getHeaderImpl方法覆盖了默认行为。

点击源代码,观察 System object 中的公共和活动属性是否作为模块参数出现在 MATLAB System 模块对话框中。
使用仿真方式参数选择您希望模型进行模块仿真的方式。(如果只有一个选项卡,此参数将出现在每个 MATLAB System 模块的底部;如果有多个选项卡,则出现在第一个选项卡的底部。)
注意
将模块与 System object 类名关联后,将无法使用同一个 MATLAB System 模块对话框指定新的 System object。在这种情况下,请右键点击 MATLAB System 模块,选择模块参数(MATLABSystem),并在 System object 名称中输入新的类名。
要用另一个 System object 实现模块,请右键点击 MATLAB System 模块并选择模块参数(MATLABSystem)。然后,使用模块对话框在 System object 名称中确定新的类名。有关详细信息,请参阅使用 MATLAB System 模块在 Simulink 中实现 System object。

更改模块图标和端口标签
您可以使用封装编辑器或通过向 System object 添加特定方法来自定义 MATLAB 系统图标、端口标签和对话框。
要设计 MATLAB System 图标和对话框,请使用封装编辑器(从 R2023b 开始)。您也可以将现有封装自定义迁移到封装编辑器。此功能让您无需再在 System object 文件中开发或维护方法。有关详细信息,请参阅Customize MATLAB System Icon and Dialog Box Using Mask Editor。
您也可以向 System object 添加方法来更改模块图标外观和模块对话框:
当您更改模块的图标外观和端口标签时:
要定义图标,请实现
getIconImpl方法。要定义端口标签,请实现
getInputNamesImpl方法以更改输入,实现getOutputNamesImpl方法以更改输出端口标签。
有关示例,请参阅Customize MATLAB System Block Appearance。
如果您不实现这些方法,默认情况下,System object 会使用来自
stepImpl方法的输入端口和输出端口名称。如果您使用非直接馈通,默认情况下,System object 会使用来自updateImpl的输入端口名称和来自outputImpl的输出端口名称。要更改 MATLAB System 模块对话框,请在 MATLAB System 模块的 System object 代码中实现
getPropertyGroupsImpl方法。在方法内部,实现以下类。描述 matlab.system.display 方法 定义属性组的头部文本。
将属性组合在一起。
将属性组合到一个单独的选项卡中。
将 MATLAB System 模块图标更改为图像
您可以在 MATLAB 编辑器中更改 MATLAB System 模块的图像。有关接受的图像文件的列表,请参阅 image。要将现有图像文件用于 MATLAB System 模块,请执行以下操作:
双击您的 MATLAB System 模块。
在模块对话框中,点击源代码。包含 System object 代码的 MATLAB 编辑器将打开。
在 MATLAB 编辑器中,从 System 模块下拉列表中选择添加图像图标。
在添加图像图标对话框中,点击浏览以选择所需的图像。
点击确定以将
getIconImpl方法的对应代码插入到您的 System object 中。
有关详细信息,请参阅Customize System Block Appearance Programmatically。
指定 MATLAB System 模块的采样时间
模块的采样时间是一个参数,它指示模块何时生成输出并最终更新其内部状态。要指定 MATLAB System 模块的采样时间,请通过调用 createSampleTime 方法来实现 getSampleTimeImpl 方法。要查询 MATLAB System 模块的当前采样时间和仿真时间,请使用 getSampleTime 和 getCurrentTime 方法。有关详细信息,请参阅指定 MATLAB 系统模块系统对象的采样时间。
要指定离散采样时间,请在
createSampleTime方法中,将'Type'设置为'Discrete',并设置'SampleTime'属性。要指定继承的采样时间,请在
createSampleTime中,将'Type'设置为'Inherited'。使用继承的采样时间时,您可以通过指定'AlternatePropagation'或'ErrorOnPropagation'名称-值对组来更改特定采样时间或在特定采样时间报错。要指定子步中不变的采样时间,请在
createSampleTime中,将'Type'设置为'Fixed In Minor Step'。将模块配置为具有可控采样时间且分辨率为 Tbase,其中 Tbase 是各次模块执行之间允许的最小时间间隔。在
createSampleTime方法中,将'Type'属性设置为'Controllable',将'TickTime'属性设置为 Tbase。您可以使用setNumTicksUntilNextHit在您的 MATLAB System 模块中设置 n。使用可控采样时间的模块的执行时间可被动态地设置为 Tbase 的 n 倍,然后该模块的下一执行时间为Tnext = n Tbase + T (1)
有关详细信息,请参阅采样时间的类型。要查看如何使用 System object 方法控制 MATLAB System 模块的采样时间的示例,请参阅指定 MATLAB 系统模块系统对象的采样时间。
模块仿真模式
您可以在 Simulink 模型中使用 MATLAB System 模块通过解释执行或代码生成进行仿真。
对于解释执行,模型使用 MATLAB 执行引擎进行模块仿真。
注意
对于解释执行,如果在“配置参数”对话框中将使用除法进行定点净斜率计算参数设置为 On 或只对整数的倒数使用除法,则可能会得到未优化的数值结果。得到这些未优化的数值结果是因为 MATLAB 代码不支持此参数。
对于代码生成,模型使用生成的代码进行模块仿真(要求使用代码生成支持的 MATLAB 代码子集)。要查看支持的函数列表,请参阅 C/C++ 代码生成支持的函数和对象。
解释执行与代码生成
使用有效的 System object 类名实现 MATLAB System 模块会启用仿真方式参数。如果只有一个选项卡,此参数将出现在 MATLAB System 模块对话框的底部;如果有多个选项卡,则出现在第一个选项卡的底部。使用仿真方式参数控制模块的仿真方式。下表描述如何根据您的目的选择正确的值。
| 操作 | 选择 | 优点 | 缺点 |
|---|---|---|---|
在第一次运行模型时,仅使用代码生成支持的 MATLAB 函数的子集对 MATLAB System 进行仿真和生成代码。选择此选项会导致仿真运行生成的代码。 | 代码生成(默认值) | 可能会提高性能。 | System object 仅限于代码生成支持的 MATLAB 函数的子集。仿真可能开始得更慢。 |
使用支持的所有 MATLAB 函数进行模型仿真。选择此选项可能会降低仿真性能。 | 解释执行 | System object 可以包含任何支持的 MATLAB 函数。启动时间更快。 | 可能会降低性能。如果 System object 中的 MATLAB 函数不支持代码生成,则 System object 必须包含传播方法。 |
为了利用更快的性能,请考虑在您的 System object 中使用传播方法。有关详细信息,请参阅Add and Implement Propagation Methods。
注意
如果您的 Simulink 模型设置为在普通模式下仿真,并且您通过代码生成使用 MATLAB System 模块,则各个 MATLAB System 模块可以通过代码生成来利用加速。如果 Simulink 模型设置为在加速模式或任何其他目标模式下仿真,则 MATLAB System 模块的仿真方式参数不起任何作用。但有一个例外,即如果模型设置为在加速模式下仿真,并且您将 MATLAB System 模块与解释执行模式结合使用,则该模块将在解释执行模式下运行。
使用代码生成的仿真
如果使用代码生成对 MATLAB System 模块进行仿真,则需要您的系统中安装有兼容的编译器。要查看支持的编译器列表,请打开支持和兼容的编译器,点击与您的操作系统对应的选项卡,找到 Simulink 产品系列表,并转至适用于模型引用、加速模式、快速加速模式和 MATLAB Function 模块列。
一个模型可以包含同一 MATLAB System 模块的多个副本。如果模块符合以下条件,则认为这些模块是相同的:
使用相同的 System object。
包含的输入和可调参数具有相同的信号、数据类型和复/实性。
包含的不可调参数具有相同值。
当模型具有同一模块的多个副本时,软件不会为每个模块重新生成代码。模型会重用第一次为该模块生成代码时的代码。
MATLAB System 模块的默认输入信号属性
如果 MATLAB System 模块有一个或多个输入端口未连接到另一个模块的输出端口,或者连接的端口具有欠定属性,则欠定属性的默认输入信号属性为:
| 数据属性 | 默认值 |
|---|---|
| 数据类型 | 双精度 |
| 大小 | [1 1] 标量 |
| 复/实性 | 实数 |
对 MATLAB System 模块使用非虚拟总线
MATLAB System 模块支持非虚拟总线作为输入和输出信号。对应的 System object 输入或输出必须为 MATLAB 结构体,其字段与非虚拟总线定义的字段匹配。如果 System object 输出是 MATLAB 结构体,它必须定义传播器方法。此外,getOutputDataTypeImpl 方法必须返回对应总线对象的名称。此总线对象必须存在于基础工作区中或存在于链接到模型的数据字典中。有关示例,请参阅Using Buses with MATLAB System Blocks。
注意
如果输出与输入的总线类型相同,请不要使用 propagatedInputDataType 方法来获取总线对象的名称。此时,您必须直接返回总线对象的名称。
MATLAB System 模块限制
不支持以下功能。
| 类别 | 限制 | 解决方法 |
|---|---|---|
System object | System object 的可调字符向量属性在 MATLAB System 模块中是不可调参数。 | — |
数据类型 |
| — |
采样时间 | 不能使用 MATLAB System 模块对连续时间系统或多速率系统建模。 | — |
线性化 | 不能使用基于雅可比的线性化。 | — |
全局变量 | 在模型的配置参数的仿真目标 > 自定义代码窗格中定义并由 System object 引用的全局变量不能与 Stateflow® 和 MATLAB Function 模块共享。 | 在“配置参数”对话框的仿真目标窗格中打开导入自定义代码选项。 |
调试 | 对基于代码生成的仿真进行 MATLAB 调试。 | 将 MATLAB System 模块的仿真方式参数设置为解释执行,然后进行调试。完成后,将仿真方式重置为代码生成。 |
定点工具 | 定点工具不会返回 MATLAB System 模块的设计最小值/最大值、最小值/最大值记录或自动定标信息。 | — |
模型覆盖率分析(Simulink Coverage™ 软件) | Simulink Coverage 不能为仿真方式参数设置为解释执行的 MATLAB System 模块执行模型分析。 | — |
MATLAB System 模块和 System object 示例
有关 MATLAB System 和 System object 的示例,请参阅:
| 示例 | 描述 |
|---|---|
此示例说明如何开发 System object 以在 MATLAB System 模块中使用,并以交互方式预览模块对话框。 | |
此示例说明如何自定义 MATLAB System 模块的外观。 | |
此示例说明如何自定义 MATLAB System 模块对话框。 | |
此示例说明如何指定 MATLAB System 模块的输出大小、数据类型和复/实性。 | |
此示例说明如何使用 System object 方法控制 MATLAB System 模块的采样时间。 | |
此示例说明如何扩展 System object 以在 Simulink® 中使用。 |