主要内容

MATLAB 函数中初始化持久变量

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

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

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

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

如果您不遵循这些规范,在几种情况下会产生初始化错误:

  • 具有持久变量的 MATLAB Function 模块,其中允许直接馈通属性被清除

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

  • 实现摩尔状态机语义并使用具有持久变量的 MATLAB 函数的 Stateflow®

例如,以下函数 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 图

此模型包含具有一个 MATLAB 函数的 Stateflow 图,使用先前描述的 fcn 的第一个版本。

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

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

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

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

  • 图实现摩尔语义。

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

另请参阅

模块

函数

主题