主要内容

自定义块功能的比较

在创建自定义块时,请考虑:

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

造型方面的考虑

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

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

模拟状态行为

您需要对一个块的状态行为建模,该块需要它的一些或所有以前的输出来计算它的当前输出。看到状态变量更多信息。

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

仿真性能

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

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

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

代码生成

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

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

两者都支持万博1manbetx代码生成。

  • 对于非内联的s - function,万博1manbetx仿真软件编码器product在代码生成过程中使用C MEX函数。

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

  • 在S-Function Builder中,您可以选择Generate wrapper TLC选项来自动生成TLC文件。

看到s函数和代码生成(万博1manbetx仿真软件编码器)更多信息。

万博1manbetx仿真软件的功能 万博1manbetx支持代码生成。
子系统 万博1manbetx只要子系统中包含的块支持代码生成,就支持代码生成。有关更多信息,请参见子系统函数的控制生成(嵌入式编码)

多个输入输出端口

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

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

更新速度万博1manbetx

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

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

回调方法

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

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

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

用于代码生成的MATLAB s函数和MATLAB函数有一些根本的区别。

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

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

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

扩展自定义块功能

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

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

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

另请参阅

|||||||||

相关的话题