参考链接:CSDN-Matlab编程技巧:通过脚本导入Excel数据字典
一、Why?
- 在使用代码生成过程中,为了优化代码提高可读性,我们经常会把Signal等信号进行标注并和模型链接起来。通常情况下我们是一个个的手动去建立,这样其实并不高效,比较好的方法是通过代码的方式一次性完成。
- 如果我们能够将我们设计的输入输出,参数等都放在Excel中,然后通过Matlab生成我们想要的Signal, Parameter, Bus等,这将带来极大的方便。
二、How
假设我们的Signal,Parameter,Bus等都采用Excel进行管理,我们要将其生成对应的Simulink模型中要链接的对象,那么我们首先要做的就是按照要求建立需要的Excel。
知道Excel内容后,就需要编辑脚本,生成需要的对象,m脚本如下。
% 建立函数生成Signal,Bus等对象,并放入sldd数据字典中
% 需要改变sldd_name!!!
function Gen_Sldd()
evalin('base','clear'); %清空工作空间
Excel_Name = 'Simulink_data_manager.xlsx'; %获取表格
[~,~,Signal_Cell] = xlsread(Excel_Name,'Signal'); %获取sheet1的内容
for row = 2: size(Signal_Cell,1) %获取有效行数
SignalName = Signal_Cell{row,1}; %获取每一行的SignalName
DataType = Signal_Cell{row,2}; %获取每一行的DataType
InitialValue = Signal_Cell{row,3}; %获取每一行InitialValue
StorageClass = Signal_Cell{row,4}; %获取每一行StorageClass
evalin('base',[SignalName,' = Simulink.Signal;']);
evalin('base',[SignalName,'.DataType = ''',DataType,''';']);
evalin('base',[SignalName,'.InitialValue = ''',InitialValue,''';']);
evalin('base',[SignalName,'.CoderInfo.StorageClass = ''',StorageClass,''';']);
end
%%
%% 导入Simulink.AliasType
[~,~,AliasType_Cell] = xlsread(Excel_Name,'AliasType'); %导入AliasType工作表为单元数组
for row = 2:size(AliasType_Cell,1) %从第2行开始循环处理每一行内容
% 提取别名、基础类型
AliasName = AliasType_Cell{row,1};
BaseType = AliasType_Cell{row,2};
% 在工作空间中建立该对象并配置其属性
evalin('base',[AliasName,' = Simulink.AliasType;']);
evalin('base',[AliasName,'.BaseType = ''',BaseType,''';']);
end
%% 导入Simulink.Bus
[~,~,Bus_Cell] = xlsread(Excel_Name,'Bus'); %导入Bus工作表为单元数组
for row = 2:size(Bus_Cell,1) %从第2行开始循环处理每一行内容
%更新Bus名称
if ~isnan(Bus_Cell{row,1})
BusName = Bus_Cell{row,1};
i = 1;
evalin('base',[BusName,' = Simulink.Bus;']);
end
% 提取元素名称、尺寸、类型
BusElementName = Bus_Cell{row,2};
Dimensions = Bus_Cell{row,3};
DataType = Bus_Cell{row,4};
% 建立元素并加入Bus中
evalin('base',[BusName,'.Elements(',num2str(i),').Name = ''',BusElementName,''';']);
evalin('base',[BusName,'.Elements(',num2str(i),').Dimensions = ''',Dimensions,''';']);
evalin('base',[BusName,'.Elements(',num2str(i),').DataType = ''',DataType,''';']);
% Bus元素索引+1
i = i + 1;
end
%创建sldd,存入sldd_name.sldd
Simulink.data.dictionary.create('sldd_name.sldd');
myDictionaryObj = Simulink.data.dictionary.open('sldd_name.sldd');
importFromBaseWorkspace(myDictionaryObj);
evalin('base','clear'); %清空工作空间
end
这里有几个地方需要注意: evalin(‘base’,[SignalName,’.DataType = ‘’’,DataType,’’’;’]);
’.DataType = ‘’‘ 最后表现出来的是 .DataType = ’
同理’’’;‘表现出来的是 ’; 表示一个单引号要用三个单引号,左边打表示左’,右边表示右‘
所以整句结果是 S i g n a l N a m e . D a t a T y p e = ′ SignalName.DataType =' SignalName.DataType=′DataType’;
即a.DataType = ‘Single’