当前MATLAB版本繁多,各版本之间的Simulink模型不能相互打开,导致相互之间的模型使用非常不便,故编写此脚本,用于批量转换Simlink模型到早期的版本。
主要思想是先获取目标文件夹下的模型文件,然后循环转换到早期版本,之后将之前版本的模型文件删除,把暂存的模型文件名转换为原先的模型文件名。
下面将代码分享于此:
%% Simulink模型版本批量转换为早期版本工具
% 运行此文件,选择目标文件夹
function ModelConvertVersionBatch(varargin)
tic
% 选择目标文件夹
MainFile = uigetdir('','选择文件夹');
%% 获取文件夹下具体的文件路径和名称
subdirectories = genpath( MainFile );
% ispc - 确定版本是否适用于 Windows (PC) 平台
if ispc
% 匹配正则表达式
subdirectories = regexp( subdirectories, '[^;]*', 'match' );
else
subdirectories = regexp( subdirectories, '[^:]*', 'match' );
end
% strrep - 查找并替换子字符串
% strrep(str,old,new)
filetype = strrep( '.slx', '.', '' );
ModelFile = {};
for i = 1:length( subdirectories )
% dir()列出当前文件夹中的文件和文件夹。
files = dir( subdirectories{ i } );
% 判断生成文件夹isdir属性
% isdir=1,代表文件夹,否则,代表文件
% 获得文件夹目录中的文件
files = files( ~[ files.isdir ] );
files = { files.name }';
% 比较字符串(不区分大小写),相同,返回1,否则,返回0
if ~strcmpi( filetype, '*' )
for j = 1:length( files )
% 对比文件的扩展名与目标文件类型
if strcmpi( file_get_extension( files{ j } ), filetype )
% 获得匹配文件的路径
ModelFile{ end + 1, 1 } = subdirectories{ i };
% 获得文件名称
ModelFile{ end , 2 } = files{ j };
end
end
else
if ~isempty( files )
directories = cell( length( files ), 1 );
[ directories{ 1:end } ] = deal( subdirectories{ i } );
ModelFile = [ ModelFile;[ directories, files ] ];
end
end
end
%% 获取目标模型文件路径
for i = 1:size(ModelFile,1)
% 获取slx文件
FileFullFile(i) = fullfile(ModelFile(i,1),ModelFile(i,2));
% 切换slx文件所在路径
cd(ModelFile{i});
% 设置导出模型的slx文件名称
TmpName(i) = strcat(ModelFile(i,1),filesep,'New',ModelFile(i,2));
% 打开slx文件
open_system(FileFullFile(i));
% 导出slx文件,版本用户自定
Simulink.exportToVersion(bdroot,TmpName{i},'R2018a');
% 关闭slx模型窗口
bdclose;
% 删除原先版本slx模型
delete(FileFullFile{i})
% 更换slx模型文件名,恢复为之前的slx模型文件名
movefile(TmpName{i},FileFullFile{i});
end
toc
%% 关闭打开的模型窗口
bdclose('all')
load chirp
sound(y,Fs)
end
%% 获得文件的扩展名
function extension = file_get_extension( filename )
extension = '';
% strfind - 在其他字符串中查找字符串,返回起始索引
idx = strfind( filename, '.' );
if ~isempty( idx )
% 获得文件的扩展名
extension = filename( idx + 1:end );
end
end