主要内容

生成代码中模块参数可调性的限制

如果模块参数、MATLAB® 变量或 Simulink.Parameter 对象在生成代码中显示为存储在内存中的数据(例如全局变量),则它是可调的。例如,当您将存储类 ExportedGlobal 应用于参数对象时,该参数对象在生成代码中显示为可调。当您将默认参数行为设置为可调时,MATLAB 变量和参数对象在生成代码中显示为可调。根据定义,模型参量也显示为可调。

在某些条件下,代码生成器无法保持参数、变量、对象或表达式的可调性。在这种情况下,代码生成器或者内联数值,或者使用 const 关键字声明数据,从而阻止您在代码编译或执行期间更改该值。

要在模型中检测这些条件,请将模型配置参数检测可调性损失(请参阅Detect loss of tunability)设置为警告错误

可调表达式限制

您可以将模块参数值指定为使用 Simulink.Parameter 对象或工作区变量的表达式。例如,您可以使用表达式 5 * gainParam。有关使用表达式设置模块参数值的一般信息,请参阅使用数学表达式、MATLAB 函数和自定义函数。有关用于设置 Simulink.Parameter 对象值的表达式的限制,请参阅Code Generation of Parameter Objects With Expression Values

可调工作区变量在生成代码中显示为可调的 Simulink.Parameter 对象或工作区变量。例如,如果您应用 Auto 之外的存储类,或您将默认参数行为设置为可调,则对象或变量是可调的。

包含一个或多个可调工作区变量、模型参量或可调封装参数的表达式称为可调表达式。该表达式是可调的,因为代码生成器尝试在代码中保留该表达式。由于代码生成器保留该表达式,因此您可以在代码执行期间更改参数数据的值。

代码生成器会在生成代码中将某些表达式简化为一个内联数值。内联会使表达式中的工作区变量呈现为不可调。为避免由于不支持的表达式导致可调性损失,请遵循以下规范:

  • 不支持涉及复数 (i) 工作区变量或参数对象的表达式。

  • 某些运算符和函数会导致代码生成器简化表达式并删除可调性。要确定某个运算符或函数是否会导致可调性损失,请使用下表中的信息。

    类别运算符或函数

    1

    + - .* ./ < > <= >= == ~= & |

    2

    * /

    3

    abs, acos, asin, atan, atan2, boolean, ceil, cos, cosh, exp, floor, log, log10, sign, sin, sinh, sqrt, tan, tanh

    4

    : .^ ^ [] {} \ .\ ' .' , ;

    • 使用类别 1 中的运算符不会损失可调性。

    • 只要表达式中有至少一个操作数是标量,就使用类别 2 中的运算符。例如,支持标量/标量和标量/矩阵操作数组合,但不支持矩阵/矩阵组合。

    • 您可以将可调工作区变量用作类别 3 中函数的参量。如果您使用其他函数,代码生成器会删除参量的可调性。

    • 不支持类别 4 中的运算符。

  • FcnIf 模块不支持在代码生成中或在引用模型中使用可调表达式。

  • 您可以编写创建和修改变量的封装初始化代码。如果您在一个表达式中使用这些变量,则该表达式在生成代码中不可调。此限制也适用于具有封装初始化代码的 Simulink® 库模块。例如,为 BitwiseBit SetBit Clear 模块指定位运算的模块参数是不可调的,因为该参数用于模块的封装初始化代码。

  • 您可以为组成表达式的 Simulink.Parameter 对象或工作区变量指定数据类型。只要这些变量和对象的数据类型与对应模块参数的数据类型相同或是 double,代码生成器就可以保留可调性。

  • 具有空元素的总线和结构体类型在生成代码中不支持可调表达式。作为一种解决办法,您可以使用替代约定,例如使用 -1 来表示空元素值。

如果代码生成器保留包含至少一个整数类型元素的参数表达式的可调性,则生成代码的仿真和执行可能会产生在数值上不一致的结果。在生成代码中计算表达式会导致溢出,而该表达式在仿真期间会进行饱和处理。有关详细信息,请参阅Numerical Consistency of Model and Generated Code Simulation Results

线性模块参数可调性

这些模块具有 Realization 参数,该参数会影响这些模块的数值参数的可调性:

  • Transfer Fcn

  • State-Space

  • Discrete State-Space

要设置 Realization 参数,您必须使用命令提示符:

set_param(gcb,'Realization','auto')

对于 Realization 参数,您可以选择以下选项:

  • general:模块的数值参数在生成代码中显示为可调。

  • sparse:生成代码将模块的参数表示为变换后的值,从而提高效率。参数不可调。

  • 自动:默认值。如果模块的一个或多个参数是可调的(例如,因为您使用可调参数对象来设置参数值),则该模块使用 general 实现。否则,该模块使用 sparse 实现。

    要在外部模式仿真期间调节这些模块之一的参数值,该模块必须使用 general 实现。

参数结构体

Organize Data into Structures in Generated Code中所述,您可以在生成代码中创建参数数据的结构体。

  • 如果参数结构体是可调的,则结构体的数值字段在生成代码中是可调的。但是,如果某个字段包含不可调实体(例如多维数组),则结构体字段不可调。

  • 您无法将参数结构体内的单个子结构体或字段声明为可调。您无法使用 Simulink.Parameter 对象作为结构体字段的值。在这种情况下,您必须将整个结构体存储在参数对象中。

另请参阅

主题