Matlab编程技巧:通过脚本导入Excel数据字典

Matlab编程技巧:通过脚本导入Excel数据字典

参考链接: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’

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值