第三十五篇,改进的自动生成代码m脚本

该文介绍了一个经过改进的Matlab脚本,用于自动为单个或批量slx模型生成代码,包括删除旧代码、创建新代码目录、写入日志文件以及提供用户友好的弹窗提示。此外,脚本还兼容mdl格式,并集成了实用的Matlab函数,方便后续的代码管理和编辑。
摘要由CSDN通过智能技术生成

首先向原作者致敬:https://blog.csdn.net/u013288925/article/details/107547822 

根据我自己的实际需求,在原作的基础上做了适应性改进,主要的点如下:

  • 从单个模型进化到单个、批量均支持;
  • 在当前目录下操作,不再专门做一个目录把模型拷贝过去;
  • 增加了弹出式窗口提示,使用更友好; 
  • 通过这次改进,囊括了一些matlab实用函数;
  • 后续将持续改进,同时适应slx、mdl两种格式。

改造后的代码如下: 

function GenerateCodesAuto()

clear;
% 若上一次执行脚本中间出bug中止了,那么下边删除codes\文件夹的操作大概率不会成功,
% 导致脚本执行不下去,因为上一次fopen()了但没有执行到fclose()就中止了;
% 这时执行一句fclose('all');解决问题

%% step1 生成代码准备
% mScriptPath = fileparts(mfilename('fullpath'));%本文件所在文件夹路径
[ModelNameList, ModelPath] = uigetfile('*.slx', 'MultiSelect', 'on');%通过窗口获取模型文件名和模型路径
% [filepath, name, ext] = fileparts('C:\example.slx'); % 可获取扩展名,留作给.mdl用

CountOfModels = 1;
if isequal(ModelNameList, 0) == true
    msgbox("未选择任何模型,结束!", "warn", 'warn');
    return;
else
    if iscell(ModelNameList) == true % 选了多个模型
        [~, CountOfModels] = size(ModelNameList);
    end
end

% 所谓CodeWorkspace文件夹,是把模型拷贝过去用的,把模型集中放到一起
% 本应用中不单设CodeWorkspace文件夹,在project当前目录即可
% if exist([mScriptPath,'\CodeWorkspace'],'dir')%这3行:如果存在CodeWorkspace文件夹,则删除它再新建一个
%     rmdir([mScriptPath,'\CodeWorkspace'],'s');
% end
% mkdir([mScriptPath,'\CodeWorkspace']);

% copyfile([ModelPath,'\',ModelNameSlx],[mScriptPath,'\CodeWorkspace\',ModelNameSlx]);%把模型拷贝到工作空间

if exist([ModelPath,'\codes'],'dir')
    rmdir([ModelPath,'\codes'],'s');
end
mkdir([ModelPath,'\codes']);

fid = fopen([ModelPath,'\log.txt'],'w');%写入log文件
SuccessCount = 0;

for i = 1 : 1 : CountOfModels
    %% step2 生成代码过程
    if CountOfModels == 1
        ModelNameWithNoExt = strrep(ModelNameList,'.slx','');%不带后缀的模型名
    else
        ModelNameWithNoExt = ModelNameList{i}; % ()获取的是cell element,{}能够从cell element中解构出来
        ModelNameWithNoExt = strrep(ModelNameWithNoExt,'.slx','');
    end

    try
        cd(ModelPath);
        load_system(ModelNameWithNoExt);%载入模型到计算机内存,不会显示UI界面
        rtwbuild(ModelNameWithNoExt);%生成代码核心函数
        bdclose(ModelNameWithNoExt);%关闭模型
        LogText = ['Generate code for "',ModelNameWithNoExt,'" Successfully!'];%成功的log信息
    catch Me
        LogText = ['Failed to generate code for "',ModelNameWithNoExt,'"!',newline,...
            'MsgID:',Me.identifier,newline,...
            'MsgText:',Me.message,newline];%失败的log信息
        bdclose(ModelNameWithNoExt);%关闭模型
    end

    %% step3 生成代码后处理
    if contains(LogText,'Successfully')%成功生成代码,则把log文件和代码拷贝到模型路径下
        SuccessCount = SuccessCount + 1;
        copyfile([ModelPath, ModelNameWithNoExt, '_ert_rtw\*.c'], [ModelPath, '\codes']);%拷贝源文件
        copyfile([ModelPath, ModelNameWithNoExt, '_ert_rtw\*.h'], [ModelPath, '\codes']);%拷贝头文件

        SharedUtilsPath = [ModelPath, 'slprj\ert\_sharedutils\'];
        if exist(SharedUtilsPath, 'dir')
            A = dir([SharedUtilsPath, '*.h']); % exist()不能用通配符,所以用dir()做个中转
            if isempty(A) == false
                copyfile([SharedUtilsPath, '*.h'], [ModelPath, '\codes']);
            end
            A = dir([SharedUtilsPath, '*.c']);
            if isempty(A) == false
                copyfile([SharedUtilsPath, '*.c'], [ModelPath, '\codes']);
            end
        end
    end

    fprintf(fid,LogText);
    fprintf(fid,"\r\n");
end

A = dir([ModelPath, '*.h']); % 外部引用的.c.h
if isempty(A) == false
    copyfile([ModelPath, '*.h'], [ModelPath, '\codes']);
end
A = dir([ModelPath, '*.c']);
if isempty(A) == false
    copyfile([ModelPath, '*.c'], [ModelPath, '\codes']);
end

fclose(fid);
if (SuccessCount == CountOfModels)
    str = sprintf('共%u个模型,全部完成代码生成!', CountOfModels);
    msgbox(str, "tips", 'help');
else
    str = sprintf('共%u个模型,其中%u个完成代码生成,%u未完成,请检查!', ...
        CountOfModels, SuccessCount, CountOfModels-SuccessCount);
    msgbox(str, "error", 'error');
end

end

再次向原作致敬!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值