比较自定义模块功能
创建自定义模块时,请考虑以下问题:
下表显示每个自定义模块类型如何解决这三个问题。
建模注意事项
自定义模块类型 | 状态动态建模 | 仿真性能 | 代码生成 |
---|---|---|---|
Interpreted MATLAB Function | 否 | 不太快 | 不支持 |
Level-2 MATLAB S-Function | 是 | 不太快 | 需要 TLC 文件 |
MATLAB Function | 否 | 快 | 支持,但存在例外 |
MATLAB System | 是 | 快 | 支持,但存在例外 |
S-Function | 是 | 快 | 需要 TLC 文件或非内联 S-Function 支持 |
C Caller | 否 | 快 | 支持 |
C Function | 是 | 快 | 支持 |
S-Function Builder | 是 | 快 | 支持 |
Simulink Function | 是 | 快 | 支持 |
Subsystem | 是 | 快 | 支持 |
Fcn | 否 | 很快 | 支持 |
要进行详细的自定义模块设计,请考虑以下问题:
自定义模块是否需要多个输入和输出端口?
与 Simulink® 引擎进行通信的回调方法是什么?哪些自定义模块能够实现所有这些回调方法或其中的一部分?
自定义模块对更新 Simulink 图的速度有多大影响?
建模状态行为
您需要为必须知道以前的部分或全部输出才能计算当前输出的模块的状态行为建模。有关详细信息,请参阅 状态变量。
自定义模块类型 | 注释 |
---|---|
Fcn, Interpreted MATLAB Function, C Caller | 不允许为状态行为建模。 |
MATLAB Function, C Function | 允许使用 persistent 变量为离散状态建模。 |
2 级 MATLAB® S-Function | 允许将 ContStates 或 Dwork 运行时对象方法与模块回调方法结合使用来为连续和离散状态行为建模。有关支持的方法列表,请参阅Write Level-2 MATLAB S-Functions 中的Level-2 MATLAB S-Function Callback Methods。 |
MATLAB System | 允许将 System object™ 的 DiscreteState 属性与模块回调方法结合使用来为离散状态行为建模。此模块使用 System object 方法作为回调方法:mdlOutputs (stepImpl , outputImpl )、mdlUpdate (updateImpl )、mdlInitializeConditions (resetImpl )、mdlStart (setupImpl )、mdlTerminate (releaseImpl )。有关详细信息,请参阅何谓 System object?。 |
C MEX S-Function, S-Function Builder | 允许与模块回调方法结合使用来为连续和离散状态行为建模。有关详细信息,请参阅 Callback Methods for C MEX S-Functions。 |
Simulink Function | 直接与引擎进行通信。您可以使用连续和离散 Simulink 模块库中的相应模块来为状态行为建模。当此函数的多个调用来自不同的调用方时,状态值在这些调用之间也保持不变。有关详细信息,请参阅Call a Simulink Function Block from Multiple Sites。 |
Subsystem | 直接与引擎进行通信。您可以使用连续和离散 Simulink 模块库中的相应模块来为状态行为建模。 |
仿真性能
对于大多数应用,所有自定义模块类型都能提供令人满意的仿真性能。可使用 Simulink 探查器了解实际的性能指标。有关详细信息,请参阅探查器如何捕获性能数据。
性能指标分为两种:接口成本和算法成本。接口成本是指数据从 Simulink 引擎移动到模块所需的时间。算法成本是指执行模块实现的算法所需的时间。
自定义模块类型 | 注释 |
---|---|
Fcn | 具有最高的仿真性能。该模块与 Simulink 引擎紧密集成,并针对仿真和代码生成进行优化。 |
Interpreted MATLAB Function | 其性能因接口而较低,但其算法成本与 MATLAB 函数相同。 从 Interpreted MATLAB Function 模块中访问或返回模块数据(例如输入和输出)时,Simulink 引擎会将这些数据打包为 MATLAB 数组。打包需要额外的时间,还会在通信过程中导致内存使用量暂时增加。如果通过此接口传递大量数据,如帧或数组,则性能可能会很低。 转换数据之后,MATLAB 执行引擎将执行算法。因此,算法成本与 MATLAB 函数相同。 |
2 级 MATLAB S-Function | 产生的算法成本与 Interpreted MATLAB Function 模块相同,但接口成本略高。因为 MATLAB S-Function 可以处理多个输入和输出,所以此模块的打包比 Interpreted MATLAB Function 模块更复杂。此外,Simulink 引擎会为您实现的每个模块方法调用 MATLAB 执行引擎,但 Interpreted MATLAB Function 模块只为 Outputs 方法调用 MATLAB 执行引擎。 |
MATLAB Function | 通过代码生成执行仿真,产生的接口成本与其他 Simulink 内置模块相同。 由于模块的实现,此模块的算法成本更难分析。一般情况下,此模块的函数与 MATLAB 函数的运行速度相同。 如果 MATLAB Function 模块中包含使用 coder.extrinsic 调用 MATLAB 执行引擎的代码,则会产生 MATLAB S-Function 或 Interpreted MATLAB Function 模块产生的所有成本。从 MATLAB Function 模块中调用 MATLAB 执行引擎会生成一条警告消息,以防您误执行此操作。为了降低算法成本,您可以禁用所有 MATLAB Function 模块的调试。 |
MATLAB System | 在解释执行模式下,性能与 Level-2 MATLAB S-function 类似,因为模型使用 MATLAB 执行引擎进行模块仿真。在代码生成模式下,性能与 MATLAB Function 类似,因为模型使用生成的代码进行模块仿真。有关详细信息,请参阅此表中的 MATLAB Function 条目。 |
C Caller, C Function | 由于自定义代码的解析和编译,首次模型仿真可能较慢。要在首次编译后加快仿真速度,请从配置参数中选择编译速度更快以加快编译速度,选择运行速度更快以加快仿真速度。 |
C MEX S-Function | 通过编译的代码执行仿真,产生的接口成本与 Simulink 内置模块相同。算法成本取决于 S-Function 的复杂度。 |
S-Function Builder | 此模块仅根据您提供的设定和 C 代码编译 S-Function。您也可以使用此模块作为模型中生成的 S-Function 的包装器。与 C MEX S-Function 相比,此模块的算法成本仅来自包装器。 |
Simulink Function、Subsystem | 如果包含在库中,当模块以常规子系统的形式存在于模型中时,它所产生的接口成本或算法成本不会超过正常情况下产生的成本。 性能与子系统中实现的算法的复杂度成比例。如果子系统包含在库中,当 Simulink 第一次加载任何未加载的库时,都会更新图或为仿真做好准备,此时就会产生一些开销。如果所有引用的库模块保持不变,则 Simulink 之后不会再重新加载库。模型的编译速度比不使用库时更快。 |
代码生成
如果您的模型只是一个大型系统的一部分,则需要代码生成。并非所有自定义模块类型都支持使用 Simulink Coder™ 进行代码生成。
自定义模块类型 | 注释 |
---|---|
Fcn | 支持代码生成。 |
Interpreted MATLAB Function | 不支持代码生成。 |
C Caller, C Function | 支持代码生成。 |
2 级 MATLAB S-Function | 仅当您使用 Target Language Compiler (TLC) 函数实现算法时才生成代码。在加速仿真和外部模式仿真中,您可以选择通过回调 MATLAB 执行引擎而不在 TLC 中实现算法,从而在解释模式下执行 S-Function。如果 MATLAB S-Function 是 SimViewingDevice ,Simulink Coder 产品会在代码生成过程中自动忽略此模块。 |
MATLAB Function, MATLAB System | 支持代码生成。但是,如果您的模块调用 MATLAB 执行引擎,则仅当对 MATLAB 执行引擎的调用不影响模块输出时,它才会使用 Simulink Coder 产品进行编译。在这种情况下,Simulink Coder 产品将忽略从生成的 C 代码中执行的这些调用。此功能允许您保留可视化代码,即使在生成嵌入式代码时也是如此。 |
C MEX S-Function, S-Function Builder | 两者都支持代码生成。
有关详细信息,请参阅 S-Function 和代码生成 (Simulink Coder)。 |
Simulink Function | 支持代码生成。 |
Subsystem | 只要子系统中包含的模块支持代码生成,就支持代码生成。有关详细信息,请参阅子系统 (Simulink Coder)。 |
多个输入和输出端口
以下类型的自定义模块支持多个输入和输出端口。
自定义模块类型 | 注释 |
---|---|
Fcn, Interpreted MATLAB Function | 仅支持一个输入端口和一个输出端口。 |
MATLAB Function | 支持多个输入和输出端口,包括总线。有关详细信息,请参阅在 MATLAB Function 模块中创建结构体和将总线连接到 MATLAB Function 模块。 |
MATLAB System | 支持多个输入和输出端口,包括总线。此外,您可以使用 getNumInputs 和 getNumOutputs 方法基于 System object 属性修改输入和输出端口的数量。 |
C Caller, C Function | 支持多个输入和输出端口,包括总线。 |
2 级 MATLAB S-Function、C MEX S-Function、S-Function Builder | 支持多个输入和输出端口。此外,您可以根据用户定义的参数修改输入和输出端口的数量。C MEX S-Function 和 S-Function Builder 支持总线。 |
Simulink Function | 支持多个输入和输出端口,包括总线。 |
Subsystem | 支持多个输入和输出端口,包括总线。此外,您可以根据用户定义的参数修改输入和输出端口的数量。有关详细信息,请参阅 Self-Modifiable Linked Subsystems。 |
更新 Simulink 图的速度
Simulink 会在每次仿真之前以及在用户请求时更新图。每个模块都会在图更新过程中产生一定的开销。
自定义模块类型 | 注释 |
---|---|
Fcn, Interpreted MATLAB Function | 图更新成本低。 |
MATLAB Function, C Caller, C Function | 仿真是通过代码生成执行的,因此这些模块在第一次更新时可能需要大量时间。但由于代码生成是增量式进行的,因此如果模块以及模块所连接的信号未发生变化,则 Simulink 不会重复更新模块。 |
MATLAB System | 比 MATLAB Function 快,因为不需要生成代码即可更新图。由于代码生成是增量式进行的,因此如果模块以及模块所连接的信号未发生变化,则 Simulink 不会重复更新模块。 |
C MEX S-Function、2 级 MATLAB S-Function | 仅当它覆盖了更新图时执行的方法时,才会产生比其他 Simulink 模块更高的成本。如果这些方法变得很复杂,则会大大增加更新图所需的时间。要查看更新图时执行的方法列表,请参阅 Simulink Engine Interaction with C S-Functions中的流程视图。更新图时,Simulink 会在模型初始化阶段调用所有相关方法,一直到 mdlStart (不含该方法)。 |
Simulink Function、Subsystem | 速度与子系统中实现的算法的复杂度成比例。如果子系统包含在库中,当 Simulink 第一次加载任何未加载的库时,都会更新图或为仿真做好准备,此时就会产生一些开销。如果所有引用的库模块保持不变,则 Simulink 之后不会再重新加载库。模型的编译速度比不使用库时更快。 |
回调方法
Simulink 模块通过模块回调方法与 Simulink 引擎进行通信,这些模块回调方法完全指定了模块的行为(Simulink Function 模块除外)。每个自定义模块类型允许您实现一组不同的回调方法。要了解模块如何与 Simulink 引擎进行交互,请参阅 Simulink Engine Interaction with C S-Functions。下表使用 S-Function Callback Methods名称表示模块回调方法。
自定义模块类型 | 注释 |
---|---|
Fcn, Interpreted MATLAB Function, MATLAB Function, C Caller | 这些模块都会创建 mdlOutputs 方法来计算给定输入值的输出值。您不能使用这些模块实现其他任何回调方法,因此不能为状态行为建模。 |
C Function | 允许实现 start、output 和 terminate 回调方法。允许对带持久数据的离散状态建模。 |
2 级 MATLAB S-Function | 允许实现更大部分的回调方法,包括您可以用来为连续和离散状态建模的方法。有关支持的方法列表,请参阅Write Level-2 MATLAB S-Functions 中的Level-2 MATLAB S-Function Callback Methods。 |
MATLAB System | 使用 System object 方法作为回调方法:mdlOutputs (stepImpl , outputImpl )、mdlUpdate (updateImpl )、mdlInitializeConditions (resetImpl )、mdlStart (setupImpl )、mdlTerminate (releaseImpl )。有关详细信息,请参阅 Simulink Engine Interaction with System Object Methods。 |
C MEX S-Function | 允许实现所有回调方法。 |
S-Function Builder | 允许实现 mdlOutputs 、mdlDerivatives 和 mdlUpdate 。 |
Simulink Function | 作为独立函数进行封装。此函数的任何调用方都将根据调用方的位置成为其中一种回调方法的一部分。 |
Subsystem | 直接与引擎进行通信。您可以使用连续和离散 Simulink 模块库中的相应模块来为状态行为建模。 |
比较用于代码生成的 MATLAB S-Function 和 MATLAB 函数
用于代码生成的 MATLAB S-Function 和 MATLAB 函数有一些根本的区别。
对于用于代码生成的 MATLAB S-Function 和 MATLAB 函数,Simulink Coder 产品可以为它们都生成代码。但是,MATLAB S-Function 需要 Target Language Compiler (TLC) 文件才能生成代码。用于代码生成的 MATLAB 函数不需要 TLC 文件。
MATLAB S-Function 可以使用任何 MATLAB 函数,而用于代码生成的 MATLAB 函数是 MATLAB 语言的一个子集。有关代码生成支持的函数的列表,请参阅C/C++ 代码生成支持的函数和对象。
MATLAB S-Function 可以对离散和连续的状态动态建模,而用于代码生成的 MATLAB 函数不能对状态动态建模。
扩展自定义模块功能
您可以使用回调和 MATLAB 图形扩展任何自定义模块的功能。
模块回调在仿真中的特定点执行用户定义的操作。例如,回调可以在仿真之前将数据加载到 MATLAB 工作区中,或者在仿真结束时生成仿真数据的图形。您可以将模块回调分配给任何自定义模块类型。有关可用回调的列表以及如何使用它们的详细信息,请参阅模块回调。
App 设计工具是 MATLAB 图形用户界面开发环境,提供用于轻松创建自定义用户界面的工具。有关使用 App 设计工具的详细信息,请参阅App 构建。
另请参阅
Fcn | Interpreted MATLAB Function | Level-2 MATLAB S-Function | MATLAB Function | MATLAB System | S-Function | S-Function Builder | Simulink Function | Subsystem | C Caller | C Function