在 MATLAB 函数中初始化持久变量
持久变量是 MATLAB® 函数中的局部变量,用于在函数调用之间在内存中保留其值。如果从模型生成代码,您必须为 MATLAB 函数初始化持久变量。有关详细信息,请参阅 persistent。
在 Simulink® 模型中使用包含持久变量的 MATLAB 函数时,您应遵循以下规范:
仅通过访问常量在函数中初始化持久变量。
确保函数的控制流不依赖初始化是否发生。
如果您不遵循这些规范,在几种情况下会产生初始化错误:
具有持久变量的 MATLAB Function 模块,其中允许直接馈通属性被清除
在具有 State Control 模块的模型中的具有持久变量的 MATLAB Function 模块,其中状态控制设置为同步
实现摩尔状态机语义并使用具有持久变量的 MATLAB 函数的 Stateflow® 图
例如,以下函数 fcn 使用持久变量 n。fcn 违反了两个规范。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 的更正版本中所示。再次对模型进行仿真。

另请参阅
模块
- MATLAB Function | State Control (HDL Coder) | Chart (Stateflow)