Simulink自动代码生成-附录1——通过编程快速管理Data Dictionary

1. 概述

自动代码生成的其中一个重点就是数据管理,实际上就是针对于model中的数据对象(signal、state和parameter),配置其初始值、值范围、数据类型、可调性以及其他特征等。

2. 数据字典概述

这里先讲一下matlab的数据管理思想框架。我之前的文章说了,MBD开发实际是基于3块:model、data和config,其中data在matlab中基本分为3类:signal、state和parameter。
matlab中内置了一个包:Simulink,该包内定义了两个数据类,即 Simulink.Signal 和 Simulink.Parameter。我么可以用这两个类来创建数据对象(state比较特殊,一般不做管理)。

3. m语言概述

%% 从port生成数据字典
clear;
clc;

% h = new_system('AAA');
% open_system(h);

% slddObj=Simulink.data.dictionary.create('PDC_signal_data.sldd');
Model='PDC';
Dictionary='PDC_signal_data.sldd';
% open_system(Model);
load_system(Model);     % 将 Simulink 模型加载到内存中
Inport=find_system(Model,'searchDepth',2,'blocktype','Inport');    % model为路径名称,则返回路径名称的元胞数组
Outport=find_system(Model,'searchDepth',2,'blocktype','Outport');
From=find_system(Model,'searchDepth',2,'blocktype','From');
% Line=find_system(Model,'searchDepth',1,'FindAll','on','Type','Line');   % find all是返回句柄
% Sum=find_system(Model,'searchDepth',2,'blocktype','Sum');
% LineInfo=get(Line);

%% inport
FindObjPathName=Inport;
for i = 1:length(FindObjPathName)
    
    FindObj=FindObjPathName{i};    % 收集Port的信息:m×n char
    FindObjName=get_param(FindObj,'Name');
    FindObjOutMin=get_param(FindObj,'Outmin');
    FindObjOutMax=get_param(FindObj,'Outmax');
    FindObjOutDataType=get_param(FindObj,'OutDataTypeStr');
    FindObjHandle=get_param(FindObj,'Handle');     % Port模块的句柄:一个代表句柄的数字
    FindObjPortHandle=get_param(FindObj,'PortHandles');       % Port模块上端口
    %     PortportPara=get_param(Port(1),'ObjectParameters');
    set_param(FindObj,'BackgroundColor','red');
    %-----------------------------------------------------------------------
    
    SigObj=Simulink.Signal;     % Simulink是大包,Signal是包,SigObj是类实例化后的对象:data(signal/parameter)
    SigObj.DataType=FindObjOutDataType;   % 对象的属性
    SigObj.StorageClass='ImportedExtern';   % ExportedGlobal / Global
    SigObj.InitialValue='0';
    %     SigObj.Min=PortValueMin;  % char类型
    %     SigObj.Max=PortValueMax;
    
    Name=['m_sig_',FindObjName];     % 数据字典和信号线的名字
    slddObj=Simulink.data.dictionary.open(Dictionary);  % 打开指定的数据字典并返回 Simulink.data.Dictionary 对象(Simulink.data是Package,Simulink.data.dictionary是Class)
    DataSectObj = getSection(slddObj,'Design Data');    % 得到数据字典slddObj的一个分区Design Data对象
    %     addEntry(DataSectObj,Name,SigObj)   % 在DataSectObj里压入一个名叫Name的SigObj信号
    
    try
        addEntry(DataSectObj,Name,SigObj)   % 在DataSectObj里压入一个名叫Name的SigObj信号
    catch Me
        warning('Duplicate signal name, skipping');
        continue;
    end
    
    %-----------------------------------------------------------------------
    OutPortHandle=FindObjPortHandle.Outport;
    LineHandle = find_system(Model,'SearchDepth',1,'FindAll','on',...
        'Type','Line','SrcPortHandle',OutPortHandle);  %通过输出端口句柄定位到信号线句柄,'FindAll'为on,只会返回句柄。
    
    set(LineHandle,'Name',Name)  %设置信号线名称为输入模块名称
    set(LineHandle,'MustResolveToSignalObject',1)   %设置信号线关联Simulink Signal Obj
end

下面挨个分析较为重要的命令:

  • find_system

作用:查找系统、模块、信号线、端口和注释。
语法Objects = find_system(System,Name,Value)
输入参数
在这里插入图片描述

返回值

  • 如果指定 System 为路径名称或路径名称元胞数组,或者您未指定系统,则返回为路径名称元胞数组;
  • 如果指定 System为句柄或句柄向量,则返回为句柄向量

备注:在搜索时应注意:“BlockType”是“模块类型(只读)”,“Type”是“Simulink 对象类型(只读)”。

  • get_param

作用:获取参数名称和值
语法ParamValue = get_param(Object,Parameter)
输入参数
其输入参数过多,可在help文档中搜索“模型参数”、“模块特定的参数”、“通用模块属性”查询(描述模型的参数为模型参数,而描述 Simulink 模块的参数为模块参数),或用get_param(Obj,'ObjectParameters')查询有哪些参数可获得。这里值列出几个重要的参数:

在这里插入图片描述

返回值:指定模型或模块对象的指定参数的名称或值
备注:如果对同一个模块多次调用 get_param,则使用数值句柄指定模块比使用完整的模块路径更高效。使用getSimulinkBlockHandlesys = get_param(Obj,'Handle');获取模块句柄。

  • Simulink.Signal

作用:使用此类可以创建工作区对象,这些对象可用来为信号或离散状态分配或验证属性,如数据类型、数值类型、维度等。
语法signalObj = Simulink.Signal
输入参数
在这里插入图片描述

返回值:返回具有默认属性值的 Simulink.Signal 对象
备注:注意,这是simulink包里的signal类。

  • Simulink.data.dictionary

作用:Simulink.data是包,Simulink.data.dictionary是一个类,其实例化后的对象是数据字典。
语法Simulink.data.dictionary.create:创建数据字典;Simulink.data.dictionary.open打开数据字典。还有:
在这里插入图片描述

输入参数:N/A
返回值:N/A

  • getSection

作用:隶属于Simulink.data包,Simulink.data.dictionary类。
语法sectionObj = getSection(dictionaryObj,sectionName)
输入参数:dictionaryObj — Data dictionary containing target section;sectionName — Name of target data dictionary section
返回值:返回Simulink.data.dictionary.Section 对象,即数据字典分区。

  • addEntry

作用:隶属于Simulink.data.dictionary包,Simulink.data.dictionary.Section类。往数据字典的分区中添加一个data。
语法addEntry(sectionObj,entryName,entryValue)entryObj = addEntry(sectionObj,entryName,entryValue)
输入参数
在这里插入图片描述

返回值:N/A

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值