主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MATLAB 函数中初始化持久变量

持久变量是 MATLAB® 函数中的局部变量,在函数调用期间将其值保留在内存中。如果您从模型生成代码,则必须为 MATLAB 函数初始化一个持久变量。有关详细信息,请参阅 persistent

在 Simulink® 模型中使用包含持久变量的 MATLAB 函数时,应遵循以下准则:

  • 仅通过访问常量来初始化函数中的持久变量。

  • 确保函数的控制流不依赖于初始化是否发生。

如果不遵循这些准则,则以下几种情况会导致初始化错误:

  • MATLAB Function 模块包含持久变量,其中允许直接馈通属性已清除

  • MATLAB Function 模块包含持久变量,位于具有 State Control 模块的模型中,其中状态控制设置为同步

  • Stateflow® 图实现了 Moore 机器语义,并使用带有持久变量的 MATLAB 函数

例如,下面的函数 fcn 使用持久变量 nfcn 违反了这两条准则。n 的初始值取决于输入 u,并且 return 语句会中断函数的正常控制流。因此,当在具有上述条件之一的模型中使用此代码时,会产生错误。

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = u;
        y = 1;
        return
    end
    
    y = n;
    n = n + u; 
end

为了防止出现错误,请通过将持久变量设置为常值并删除 return 语句来初始化持久变量。fcn 的这个修改版本初始化了持久变量而不会产生错误:

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = 1;
    end
    
    y = n;
    n = n + u; 
end

无直接馈通的 MATLAB Function 模块

该模型包含一个 MATLAB Function 模块,它使用前面描述的 fcn 的第一个版本。MATLAB Function 模块输入是方波,由 Sign 和 Sine Wave 模块提供。MATLAB Function 模块在每个时间步骤将 u 的值添加到持久变量 n 中。

对模型进行仿真。仿真返回错误,因为:

  • 持久变量 n 的初始值取决于输入 u

  • return 语句中断了函数的正常控制流。

  • MATLAB Function 模块的允许直接馈通属性已被清除。

修改 MATLAB Function 模块代码,如 fcn 的修正版本所示。再次对模型进行仿真。

State Control 同步模式下的模块

该模型包含一个 MATLAB Function 模块,它使用前面描述的 fcn 的第一个版本。MATLAB Function 模块输入是方波,由 Sign 和 Sine Wave 模块提供。MATLAB Function 模块在每个时间步骤将 u 的值添加到持久变量 n 中。该模型包含一个 State Control 模块,其中状态控制设置为 Synchronous

对模型进行仿真。仿真返回错误,因为:

  • 持久变量 n 的初始值取决于输入 u

  • return 语句中断了函数的正常控制流。

  • 该模型包含一个 State Control 模块,其中状态控制设置为 Synchronous

修改 MATLAB Function 模块代码,如 fcn 的修正版本所示。再次对模型进行仿真。

Stateflow 图实现摩尔语义

该模型包含一个 Stateflow 图和一个 MATLAB 函数,该函数使用前面描述的 fcn 的第一个版本。

MATLAB 函数在每个时间步骤将活动状态确定的值(1-1)添加到持久变量 n 中。

对模型进行仿真。仿真返回错误,因为:

  • 持久变量 n 的初始值取决于输入 u

  • return 语句中断了函数的正常控制流。

  • 该图实现了摩尔语义。

修改 MATLAB 函数代码,如 fcn 修正版本所示。再次对模型进行仿真。

另请参阅

模块

函数

主题