Matlab/Simulink静态变量和全局变量
1、静态变量(永久)。
1 )在Matlab中使用静态变量
2、全局变量(global )
1 )在Matlab中使用全局变量
2 )在Simulink上使用全局变量
(1)使用数据存储内存模块保存数据
)2)使用Simulink.Signal对象保存数据
1、静态变量(永久)。
1 )在Matlab中使用静态变量
函数声明的变量在函数调用结束时释放。 如果希望在下次调用函数时保留此变量的值,可以将此变量声明为静态变量。
只能用function声明静态变量。 另外,只有这个function可以识别(也不能是main函数)。 被屏蔽无法使用)。 静态变量不能在声明时赋值。 x声明后为[],为空阵列。 必须在声明后初始化。 请注意,不能直接使用持续x=0,相反,isempty(x )确定是否赋值了x。
function y=持续测试()
持续x;
是ifisempty(x )
x=0;
结束
x=x 1;
在命令窗口中多次执行以下命令,以确保正确创建了静态变量: 如果未分配x,则值为0,输出结果为1。 如果x已经赋值,则使用赋值进行1运算。
y=持久性测试
然后,y=持续时间; 结果y=1,再一次y=持久性; 结果y=2。 这意味着x在每次调用function时都记录结果。
释放静态变量的方法主要使用clear命令。
在定义静态变量的子函数内部释放时,可以使用((clear ‘变量名称) ),这与清除常规变量的方法一致。
功能y=持久性测试(u ) )。
持续x;
ifu~=1isempty(x ) )。
x=0;
结束
x=x 1;
if u==1
clear x;
y=[];
else
y=x;
结束
如果要在主函数中释放静态变量,请使用clear ‘“子函数名称”指定清除在一个子函数中定义的所有静态变量。
使用clear‘function’清除所有静态变量。
主() )
{
clear持久测试; %在主函数内部释放func中的所有静态变量
清除功能; %释放所有静态变量
}
在Simulink上的MATLABfunction中使用静态变量的方法与上述方法一致。
代码生成不支持在MATLABfunction中使用clear x,可以使用状态值(u )的变化来初始化静态变量。
2、全局变量(global )
1 )在Matlab中使用全局变量
要允许其他函数调用由一个函数定义的变量,必须使用全局变量。 请注意,这两个函数都用global限定此变量。 例如:
功能t1
全局x;
x=0;
功能T2
全局x;
y=x
恩
2 )在Simulink上使用全局变量
(1)使用数据存储内存模块保存数据
本部分主要转载自无敌石哥,稍加修改,原文参考MATLAB help文档,采用2016a版本,测试2018b版本与此一致。
要在Matlab Function中使用全局变量,请执行以下操作:
在Simulink上创建新的. mdl (或. slx )文件,并假定名为TestGlobal.slx,将Matlab Function拖到新文件中。
双击Matlab Function进入Matlab Function块编辑器,并在此文本中声明所需的全局变量。 设变量名a。 它的形状就像全球a。
例如:
function y=fcn
% #编码
全球a;
A=A 1;
y=A;
请注意,双击Matlab Function进入MATLAB Function Block Editor时,工具栏上有一个“编辑数据”按钮,将在下一步中使用。 因为不太引人注目,所以请注意。 如下图所示。
3 .在matlabfunctionblockeditor (双击MATLAB function模块进行访问)中,单击工具栏上的" Edit Data "后,单击" Ports and Data Manager " 下图,或模型
单击图中左上的用蓝色线标记的“Add Data”按钮后,变量“Data”会显示在左侧面板中。 单击此变量,在右侧修改全局变量的名称a。 单击Scope下拉菜单,将输入修改为“数据存储内存”; 单击右下角的“应用”关闭对话框;
在Simulink库浏览器中,单击左侧的Simulink-signalrouting右侧以显示数据存储内存模块。 将其拖到窗口中,然后双击其数据存储内存模块。 在Main选项卡上,将变量重命名为全局变量名称。 将Signal Attributes设置为初始值,Data Type (数据类型)和Signal Type (此项不能设置为auto ),其中初始值设置为1,数据类型设置为int8,信号类型设置为real 同样单击右下角的APP关闭此窗口。 下图:
如果Data Store Memory模块位于顶层系统上,则模型中任何位置的Data Store Read模块和Data Store Write模块都可以访问数据存储。
如果Data Store Memory模块位于子系统中,则可以通过同一子系统或模型层次结构中该子系统下的任何子系统中的Data Store Read模块和Data Store Write模块访问数据存储
Data Store Read或Data Store Write模块无法访问包含模型模块的模型或参考模型中的Data Store Memory模块。 For Each子系统中不要包含数据存储内存模块。
为了从数据存储中获得正确的结果,数据存储必须按照预期的顺序进行读取和写入。
最后一步用示波器显示结果。 整体效果如下图所示。
MATLAB Function模块每次运行时都会读取存储在a中的全局数据的初始值,并更新a中的值。
)2)使用Simulink.Signal对象保存数据