主要内容

自定义块功能的比较

当创建一个自定义块时,考虑:

下表显示了每个自定义块类型如何解决这三个问题。

造型方面的考虑

自定义块类型 模型状态动力学 仿真性能 代码生成
MATLAB解释函数 没有 那么快 不支持
二级MATLAB s函数 是的 那么快 需要TLC文件
MATLAB函数 没有 支持异常
MATLAB系统 是的 支持异常
是的 需要TLC文件或非内联S-Function支持
C调用者 没有 支持
C函数 是的 支持
是的 支持
仿真软件的功能 是的 支持
是的 支持

对于定制块的详细设计,请考虑:

模型状态行为

您需要对需要部分或全部先前输出的块的状态行为建模,以计算当前输出。看到状态变量获取更多信息。

自定义块类型 笔记
MATLAB解释函数C调用者 不允许您对状态行为建模。
MATLAB函数C函数 允许您使用持续的变量。
2级MATLAB®功能 控件对连续和离散状态行为进行建模ContStatesDwork运行时对象方法与块回调方法相结合。有关支持的方法的列表,请参见二级MATLAB s函数回调方法编写二级MATLAB s函数
MATLAB系统 允许您使用建模离散状态行为DiscreteState属性的System对象,结合块回调方法。这个块使用System对象™方法来实现回调方法:mdlOutputsstepImploutputImpl),mdlUpdateupdateImpl),mdlInitializeConditionsresetImpl),mdlStartsetupImpl),mdlTerminatereleaseImpl).有关更多信息,请参阅什么是系统对象?
C MEX s -功能s函数生成器 允许您结合块回调方法对连续和离散状态行为建模。有关更多信息,请参见C MEX s -函数的回调方法
仿真软件的功能 直接与引擎通信。您可以使用来自连续和离散的Simulink块库的适当块对状态行为建模。当对该函数的多个调用来自不同的调用方时,这些调用之间的状态值也是持久的。有关更多信息,请参见从多个站点调用Simulink函数块
子系统 直接与引擎通信。您可以使用来自连续和离散的Simulink块库的适当块对状态行为建模。

仿真性能

对于大多数应用程序,所有自定义块类型都提供令人满意的模拟性能。使用Simulink分析器来获得实际的性能指示。看到分析器如何捕获性能数据获取更多信息。

两类性能指标分别是接口开销和算法开销。接口成本是将数据从Simulink引擎移动到块中所花费的时间。算法成本是执行块实现的算法所花费的时间。

自定义块类型 笔记
MATLAB解释函数 由于接口的原因,性能较慢,但与MATLAB函数具有相同的算法开销。
当块数据(如输入和输出)被访问或从MATLAB解释函数block中,Simulink引擎将这些数据打包到MATLAB数组中。这种打包需要额外的时间,并在通信期间导致内存临时增加。如果通过这个接口传递大量数据,比如帧或数组,性能可能会非常慢。
一旦数据转换完成,MATLAB执行引擎就会执行算法。结果表明,该算法的代价与MATLAB函数相同。
二级MATLAB s函数 所引起的算法开销与MATLAB解释函数块,但接口成本略高。由于MATLAB的s -函数可以处理多个输入和输出,因此打包要比MATLAB解释函数块。此外,Simulink引擎为您实现的每个块方法调用MATLAB执行引擎,而MATLAB解释函数块调用MATLAB执行引擎仅为输出方法。
MATLAB函数 通过代码生成执行仿真,并产生与其他Simulink内置块相同的接口成本。
由于该块的实现,该块的算法成本更难分析。平均而言,这个块的函数和MATLAB函数的运行速度大致相同。
如果MATLAB函数块的代码使用coder.extrinsic调用到MATLAB执行引擎,它会产生所有的代价,即MATLAB S-Function或MATLAB解释函数块。调用从MATLAB执行引擎MATLAB函数Block产生一个警告,以防止您无意中这样做。
为了减少算法开销,可以禁用所有调试MATLAB函数块。
MATLAB系统 在解释执行模式下,性能与二级MATLAB s函数因为该模型使用MATLAB执行引擎来模拟块。在代码生成模式下,性能与MATLAB函数因为模型使用生成的代码模拟块。有关更多信息,请参见MATLAB函数该表中的条目。
C调用者C函数 由于解析和构建自定义代码,第一次模型模拟可能会较慢。为了加速第一次编译后的模拟,从配置参数中,选择更快的构建为了更快的编译和选择快速跑为了更快的模拟。
C MEX s -功能 通过已编译的代码进行模拟,并引起与Simulink内置块相同的接口成本。算法代价取决于s -函数的复杂度。
s函数生成器 此块仅根据您提供的规范和C代码构建S-Function。您还可以将此块用作模型中生成的S-Function的包装器。与C MEX S-Function相比,此块的算法开销仅来自包装器。
仿真软件的功能,子系统 如果包含在库中,则不会引入接口或算法成本,如果块作为模型中的常规子系统存在,则通常会产生这些成本。
性能与子系统中实现的算法的复杂度成正比。如果子系统包含在库中,当Simulink在图第一次更新或为模拟准备时加载任何未加载的库时,将会产生一些开销。如果所有引用的库块保持不变,Simulink随后不会重新加载库。编译模型比不使用库的模型要快。

代码生成

如果您的模型是更大系统的一部分,则需要代码生成。并非所有自定义块类型都支持仿真软件编码器™

自定义块类型 笔记
MATLAB解释函数 不支持代码生成。
C调用者C函数 支持代码生成。
二级MATLAB s函数 仅当使用目标语言编译器(TLC)函数实现算法时才生成代码。在加速和外部模式仿真中,您可以选择在解释模式下通过回调MATLAB执行引擎来执行S-Function,而不需要在TLC中实现算法。如果MATLAB s函数为SimViewingDevice,仿真软件编码器Product在代码生成期间自动省略该块。
MATLAB函数MATLAB系统 支持代码生成。但是,如果您的块调用MATLAB执行引擎,它将使用仿真软件编码器只有当对MATLAB执行引擎的调用不影响块输出时,才会使用product。在这种情况下,仿真软件编码器product从生成的C代码中省略了这些调用。该特性允许您保留可视化代码,即使在生成嵌入式代码时也是如此。
C MEX s -功能s函数生成器

两者都支持代码生成。

  • 对于非内联的s -函数,仿真软件编码器product在生成代码时使用了C MEX函数。

  • 对于C MEX S-Functions,如果需要内联S-Function或为手写代码创建包装器,则必须为S-Function编写TLC文件。

  • 对于S-Function Builder,您可以选择生成包装器TLC选项来自动生成TLC文件。

看到s -函数和代码生成(仿真软件编码器)获取更多信息。

仿真软件的功能 支持代码生成。
子系统 只要子系统中包含的块支持代码生成,就支持代码生成。有关更多信息,请参见子系统(仿真软件编码器)

多输入输出接口

这些类型的自定义块支持多个输入和输出端口。

自定义块类型 笔记
MATLAB解释函数 只支持单输入和单输出端口。
MATLAB函数 支持多个输入输出端口,包括总线信号。看到如何构造输入输出接口与总线信号获取更多信息。
MATLAB系统 支持多个输入输出端口,包括总线信号。属性可以根据系统对象属性修改输入和输出端口的数量getNumInputs而且getNumOutputs方法。
C调用者C函数 支持多个输入输出端口,包括总线信号。
二级MATLAB S-Function, C MEX S-Function,s函数生成器 支持多输入输出接口。此外,您还可以根据用户自定义的参数修改输入和输出端口的数量。C MEX S-Function和s函数生成器支持总线信号。
仿真软件的功能 支持多个输入输出端口,包括总线信号。
子系统 支持多个输入输出端口,包括总线信号。此外,您还可以根据用户自定义的参数修改输入和输出端口的数量。看到可自修改的链接子系统获取更多信息。

更新的速度动态仿真模块

Simulink在每次模拟之前和用户请求时更新图表。每个块都会在图更新过程中引入一些开销。

自定义块类型 笔记
MATLAB解释函数 图表更新成本低。
MATLAB函数C调用者C函数 模拟是通过代码生成来执行的,所以这个块在第一次更新时会花费大量的时间。但是,由于代码生成是增量的,如果块和连接到它的信号没有改变,Simulink就不会重复地更新块。
MATLAB系统 速度比MATLAB函数因为没有生成代码来更新图表。由于代码生成是增量的,如果块和连接到它的信号没有改变,Simulink就不会重复更新块。
C MEX S-Function,二级MATLAB S-Function 只有当它覆盖更新图时执行的方法时,才会比其他Simulink块产生更大的成本。如果这些方法变得复杂,它们会大大增加更新图表所需的时间。在更新图表时执行的方法列表,请参见中的流程视图Simulink引擎与C S-Functions的交互.当更新图时,Simulink在模型初始化阶段调用所有相关的方法,包括,mdlStart
Simulink函数,子系统 速度与子系统中实现的算法的复杂度成正比。如果子系统包含在库中,当Simulink在图第一次更新或为模拟准备时加载任何未加载的库时,将会产生一些开销。如果所有引用的库块保持不变,Simulink随后不会重新加载库。编译模型比不使用库的模型要快。

回调方法

Simulink块通过块回调方法与Simulink引擎通信,这些方法完全指定了块的行为(除了Simulink Function块)。每个自定义块类型允许您实现一组不同的回调方法。要了解块如何与Simulink引擎交互,请参见Simulink引擎与C S-Functions的交互.该表使用s函数回调方法名称作为等价物。

自定义块类型 笔记
MATLAB解释函数MATLAB函数C调用者 都创建一个mdlOutputs方法,在给定输入值的情况下计算输出值。您不能使用这些块之一实现任何其他回调方法,因此不能对状态行为建模。
C函数 允许实现启动、输出和终止回调方法。允许使用持久数据对离散状态建模。
二级MATLAB s函数 允许实现更大的回调方法子集,包括可用于建模连续和离散状态的方法。有关支持的方法的列表,请参见二级MATLAB s函数回调方法编写二级MATLAB s函数
MATLAB系统 为回调方法使用System对象方法:mdlOutputsstepImploutputImpl),mdlUpdateupdateImpl),mdlInitializeConditionsresetImpl),mdlStartsetupImpl),mdlTerminatereleaseImpl).有关更多信息,请参见Simulink引擎与系统对象方法的交互
C MEX s -功能 允许实现一组完整的回调方法。
s函数生成器 允许实现mdlOutputsmdlDerivatives而且mdlUpdate
仿真软件的功能 打包成一个独立的函数。此函数的任何调用者都会根据调用者的位置成为其中一个回调方法的一部分。
子系统 直接与引擎通信。您可以使用来自连续和离散的Simulink块库的适当块对状态行为建模。

比较MATLABS-Functions来MATLAB代码生成函数

MATLAB s函数和MATLAB函数在代码生成方面有一些根本的区别。

  • 仿真软件编码器product既可以为MATLAB s函数生成代码,也可以为MATLAB函数生成代码。然而,MATLAB s函数需要一个目标语言编译器(TLC)文件来生成代码。MATLAB函数的代码生成不需要TLC文件。

  • MATLAB s函数可以使用任何MATLAB函数,而用于代码生成的MATLAB函数是MATLAB语言的一个子集。有关代码生成所支持的函数的列表,请参见C/ c++代码生成支持的函数和对象

  • MATLAB s函数可以模拟离散和连续的状态动态,而MATLAB代码生成函数不能模拟状态动态。

扩展自定义块功能

您可以使用回调和MATLAB图形扩展任何自定义块的功能。

块回调在模拟中的特定点执行用户定义的操作。例如,回调可以在模拟之前将数据加载到MATLAB工作空间中,或者在模拟结束时生成模拟数据图。您可以将块回调分配给任何自定义块类型。有关可用回调的列表以及有关如何使用它们的详细信息,请参见块回调

App Designer是MATLAB图形用户界面开发环境,提供了用于轻松创建自定义用户界面的工具。看到应用程序构建获取有关使用应用程序设计器的更多信息。

另请参阅

|||||||||

相关的话题

Baidu
map