在 MATLAB 函数中初始化持久变量
持久变量是 MATLAB® 函数中的局部变量,在函数调用期间将其值保留在内存中。如果您从模型生成代码,则必须为 MATLAB 函数初始化一个持久变量。有关详细信息,请参阅 persistent
。
在 Simulink® 模型中使用包含持久变量的 MATLAB 函数时,应遵循以下准则:
仅通过访问常量来初始化函数中的持久变量。
确保函数的控制流不依赖于初始化是否发生。
如果不遵循这些准则,则以下几种情况会导致初始化错误:
MATLAB Function 模块包含持久变量,其中允许直接馈通属性已清除
MATLAB Function 模块包含持久变量,位于具有 State Control 模块的模型中,其中状态控制设置为同步
Stateflow® 图实现了 Moore 机器语义,并使用带有持久变量的 MATLAB 函数
例如,下面的函数 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 图实现摩尔语义
该模型包含一个 Stateflow 图和一个 MATLAB 函数,该函数使用前面描述的 fcn
的第一个版本。
MATLAB 函数在每个时间步骤将活动状态确定的值(1
或 -1
)添加到持久变量 n
中。
对模型进行仿真。仿真返回错误,因为:
持久变量
n
的初始值取决于输入u
。return
语句中断了函数的正常控制流。该图实现了摩尔语义。
修改 MATLAB 函数代码,如 fcn
修正版本所示。再次对模型进行仿真。
另请参阅
模块
- MATLAB Function | State Control (HDL Coder) | Chart (Stateflow)