获取所有模型加载的所有模型名称,并将没有使用到的变量再sldd中删除。
1、顶层模型中有多个引用模型;
2、不同模型中有引用相同的sldd
3、个别模型中有调用函数作为清楚变量行为,将行为删除
clear clc;
% %删除sldd没有使用的变量,2更改发生冲突属性、变量。datatype,头文件。
topmod = bdroot;
mdlre = find_mdlrefs(topmod);
modelinfo=mdlre;
for zz=1:length(mdlre) %清除个别模型中的清楚变量行为
load_system(mdlre{zz});
moprop = get(get_param(mdlre{zz},'Handle'));
tempstr = moprop.DataDictionary;
set_param(mdlre{zz},'PreLoadFcn','');
set_param(mdlre{zz},'PreSaveFcn','');
set_param(mdlre{zz},'CloseFcn','');
if isempty(tempstr)
modelinfo{zz,2} = 'Not';
else
modelinfo{zz,2} = tempstr;
end
CloseSYS(mdlre{zz});
end
modelinfo(:,3)=modelinfo(:,2);
tempstr='NaN';
%% 判断出有相同的sldd数量
modelinfo = Dumpsldd(modelinfo);
for ii = 1:size(modelinfo,1)
% mdlre = find_mdlrefs(bdroot) ; % 获取顶层模型下的所有引用模型
% model_load = find_system('type','block_diagram'); % 获取所有的以加载所有模型
if ~contains(modelinfo{ii,1},topmod) && ~contains(tempstr,modelinfo{ii,2}) %判断不是顶层模型与没有处理过的sldd
[tempstr,unusedVars]= unusedVarfun(modelinfo(ii,:),modelinfo)
if ~isempty(unusedVars)
dictObj = Simulink.data.dictionary.open(tempstr);
SectionObj = dictObj.getSection('Design Data'); %获取sldd的数据
for jj=1:length(unusedVars)
entrylist = SectionObj.getEntry(unusedVars(jj).Name);%获取具体变量
if ~contains(class(entrylist.getValue),'enum') %不删除枚举
SectionObj.deleteEntry(unusedVars(jj).Name)
end
end
end
Simulink.data.dictionary.closeAll('-save');
end
end
function CloseSYS(Model)
close_system(Model,1);
end
%% 当有不同模型引用相同SLDD可以判断出几个模型引用
function result = Dumpsldd(modelinfo)
for zz=1:length(modelinfo)
logilist = contains(modelinfo(:,2),modelinfo{zz,2});
findlist = find(logilist);
modelinfo(findlist,3) = num2cell(length(findlist));
end
result = sortrows(modelinfo,2);
end
%% 判断多个模型都未使用到的变量
function [tempstr,unusedVars]= unusedVarfun(mdlresign,mdlrelist)
logilist = contains(mdlrelist(:,2),mdlresign{2});
modelname = mdlrelist(logilist,1);
for jj=1:length(modelname)
load_system(modelname{jj});
unusedVars = Simulink.findVars(modelname{jj},'FindUsedVars','off','SourceType','data dictionary');
eval(['unusedVars_',num2str(jj),'=unusedVars;']);
moprop = get(get_param(modelname{jj},'Handle'));
tempstr = moprop.DataDictionary;
CloseSYS(mdlrelist{1});
end
unvarall = whos('unusedVars_*');
for ii = 1:length(unvarall)
eval(['unusedVars = intersect(',unvarall(ii).name,',unusedVars);']);
end
end
查看顶层模型属性
moprop = get(get_param(bdroot,'Handle'));
tempstr = moprop.DataDictionary;
可以选择结构体用点的方式查看属性内容,如知道数字字典,则moprop.data再按Tab间来查找。
如果有其他方法可以评论区见。