批量Simulink删除sldd没有使用的变量与查看顶层模型属性

文章描述了如何在Simulink项目中检测并清除顶层模型和其他模型中未使用的变量,同时处理模型之间的SLDD引用冲突。通过遍历模型,删除未使用的变量和设置预加载/保存/关闭函数为无,以优化模型资源和减少冲突。
摘要由CSDN通过智能技术生成

获取所有模型加载的所有模型名称,并将没有使用到的变量再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间来查找。

如果有其他方法可以评论区见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值