Matlab/Simulink中的静态变量和全局变量
1、静态变量(persistent)
1)Matlab中使用静态变量
2、全局变量(global)
1)Matlab中使用全局变量
2)Simulink中使用全局变量
(1)使用 Data Store Memory 模块存储数据
(2)使用 Simulink.Signal 对象存储数据
1、静态变量(persistent)
1)Matlab中使用静态变量
在函数中声明的变量,当函数调用完之后就会释放。如果想保留这个变量的值(供该函数下一次调用),可以把这个变量声明为静态变量。
静态变量只能在function里声明,且只有这个function才能认识它(main函数也不行,被遮蔽无法使用)。静态变量不能在声明的时候赋值,x声明后是[],就是一个空的array。声明后需初始化,注意不能直接用persistent x=0;而是用isempty(x)判断x是否已经赋值。
function y=persistentTest()
persistent x;
if isempty(x)
x=0;
end
x = x + 1;
在命令窗中多次运行如下命令验证是否静态变量创建正确.若x未赋值,则赋值为0,输出结果为1;若x已经赋值,则使用已赋的值进行+1运算。
y = persistentTest
之后调用一次y=persistenTest;结果y=1,再调用一次y=persistenTest;结果y=2。就是说x记录了每次调用function后的结果。
释放静态变量的方式主要是用clear命令。
如果在定义静态变量的子函数内部进行释放,则使用(clear+‘变量名’)即可,与清除普通变量方法一致。
function y=persistentTest(u)
persistent x;
if u ~= 1 && isempty(x)
x=0;
end
x = x + 1;
if u == 1
clear x;
y = [];
else
y = x;
end
如果在主函数中释放静态变量,则使用(clear+‘子函数名’),指定清除某一子函数内定义的所有静态变量。
使用(clear+‘Function’)清除所有的静态变量。
main()
{
clear persistentTest; % 主函数内部释放func内所有静态变量
clear Function; % 释放所有的静态变量
}
Simulink中MATLABfunction中静态变量的使用方式与上述一致。
代码生成不支持在MATLABfunction中使用clear x,可使用状态值(u)的变化来进行静态变量的初始化。
2、全局变量(global)
1)Matlab中使用全局变量
如果想让某个函数中定义的变量能够被其他函数调用,需要用到全局变量。注意,在这两个函数中 都要用global修饰这个变量。如:
function t1
global x;
x=0;
function t2
global x;
y=x
en
2)Simulink中使用全局变量
(1)使用 Data Store Memory 模块存储数据
本部分主要转载自无敌石头哥,稍作修改,原文借鉴MATLAB help 文档,采用2016a版本,亲测2018b版本与此一致。
Matlab Function中使用全局变量的步骤如下:
在Simulink中新建.mdl(或.slx)文件,假设名为“TestGlobal.slx”,将Matlab Function,拖入新建文件中;
双击Matlab Function,进入MATLAB Function Block Editor,在此文本中声明所需用到全局变量(假设为变量名 A)形如 global A;
例如:
function y = fcn
%#codegen
global A;
A = A+1;
y = A;
此处应该注意,当双击Matlab Function,进入MATLAB Function Block Editor后,工具栏中有个“Edit Data"的按键,下步将用到,不太起眼,应当注意,如下图所示:
3. 在MATLAB Function Block Editor(进入方式就是双击Matlab Function模块)中,点击工具栏中的“Edit Data”,此时,将显示“Ports and Data Manager”窗口,如下图,或者在ModelExplore中打开也可以。
点击图中左上角的蓝线标记的“Add Data”按钮,左侧面版中将出现变量“Data”,点击该变量,在右侧修改其名字为全局变量的名字A;点击Scope下拉菜单,将Input修改为“Data Store Memory”;点击右下角“Apply”后关闭该对话框;
4. 在Simulink Library Browser中,点击左侧Simulink–Signal Routing右侧面版将出现Data Store Memory模块,将其拽入至窗口中,双击该Data Store Memory模块,Main标签页修改变量名字为全局变量名,Signal Attributes中设置初值,Data Type(数据类型)以及Signal Type(该项不可以设置为auto)即可,本处设置初值为1,Data Type为int8,Signal type设置为real;同样点击右下角Apply,关闭该窗口。如下图:
如果 Data Store Memory 模块在顶层系统中,则模型中任意位置的 Data Store Read 和 Data Store Write 模块都可以访问该数据存储。
如果 Data Store Memory 模块在子系统中,则位于同一子系统或模型层次结构中该子系统下面的任何子系统中的 Data Store Read 和 Data Store Write 模块都可以访问该数据存储。
Data Store Read 或 Data Store Write 模块不能访问位于包含 Model 模块的模型中或引用模型中的 Data Store Memory 模块。不要在 For Each 子系统中包含 Data Store Memory 模块。
要从数据存储获取正确的结果,必须确保数据存储按照预期的顺序进行读取和写入。
最后一步用示波器显示结果,整体效果如下图:
MATLAB Function 模块每次执行时都会读取存储在 A 中的全局数据的初始值,并更新 A 的值。
(2)使用 Simulink.Signal 对象存储数据