Matlab中使用脚本和xml文件自动生成bus模块

帮一个老师写的小工具

在一个大工程中需要很多bus来组织信号,而为了规范接口,需要定义很多BusObject,用Matlab语言手写这些BusObject比较费工夫

所以用xml配置文件来写,也便于更改总线数据接口,然后使用matlab脚本来生成BusObject和Bus模块库

以下代码运行环境:WIN10+Matlab2015a

下面给出代码Matlab函数的代码:

function xmlbuscreator(xmlfile)
% XMLBUSCREATOR:从xml文件读取数据结构,并生成bus
%  xmlbuscreator(xmlfile):从xmlfile文件读取bus定义,并生成总线
%% 读取文件并提取信号
try
   xdoc = xmlread(xmlfile);
catch
   error('读取XML文件:%s失败.',xmlfile);
end
BusLibElement = xdoc.getElementsByTagName('BusLib');
BusLibItem = BusLibElement.item(0);
BusLibName = BusLibItem.getAttribute('Name');
BusObjList = BusLibItem.getElementsByTagName('BusObject');
BusObjNum = BusObjList.getLength;
BusInfo = cell(BusObjNum,1);
for i = 1:BusObjNum
    BusObj = BusObjList.item(i-1);
    BusName = char(BusObj.getAttribute('Name'));
    BusElementsList = BusObj.getElementsByTagName('BusElement');
    ElementNum = BusElementsList.getLength;
    % 如何分配一个结构体数组,BusElements = struct();
    for j = 1:ElementNum
        ele = BusElementsList.item(j-1);
        BusElements(j) = Simulink.BusElement;
        try
            BusElements(j).Name = char(ele.getAttribute('Name'));
            BusElements(j).DataType = char(ele.getAttribute('DataType'));
            BusElements(j).Dimensions = str2double(ele.getAttribute('Dimensions'));
            BusElements(j).SampleTime = -1;
            BusElements(j).Complexity = 'real';
            BusElements(j).SamplingMode = 'Sample based';
        catch me
            error(me.message);
        end
    end
    
    BusObject = Simulink.Bus;
    BusObject.HeaderFile = '';%默认无头文件
    BusObject.Description = '';
    BusObject.DataScope = 'Auto';
    BusObject.Alignment = -1;
    BusObject.Elements = BusElements;
    assignin('base',BusName,BusObject);
    BusInfo{i}.BusName = BusName;
    BusInfo{i}.Inputs = ElementNum;
end
%% 生成Bus模块
if verLessThan('simulink','8.1')%2013a之前用mdl,之后用slx
    mdlExt = '.mdl';
else
    mdlExt = '.slx';
end
BusLibFile = char(BusLibName);
if exist([BusLibFile,mdlExt])
    delete([BusLibFile,mdlExt]);%删除原先存在的模型
end
close_system(BusLibFile,0);
new_system(BusLibFile,'Library');
load_system(BusLibFile);
for i = 1:BusObjNum
    busblock = add_block('built-in/BusCreator',[BusLibFile,'/',BusInfo{i}.BusName],'Position',[15+(i-1)*115,19,65+(i-1)*115,121]);
    set_param(busblock,'OutDataTypeStr',['Bus:',BusInfo{i}.BusName]);
    set_param(busblock,'Inputs',num2str(BusInfo{i}.Inputs));
end
save_system(BusLibFile);
open_system(BusLibFile);

下面是给出来配置Bus的xml代码:xmlbus.xml

 1 <BusLib Name='BusLib3'>
 2     <BusObject Name='Bus1'>
 3         <BusElement Name='signal1' DataType='double' Dimensions='1' />
 4         <BusElement Name='signal2' DataType='uint8' Dimensions='2' />
 5         <BusElement Name='signal3' DataType='real' Dimensions='3' />
 6     </BusObject>
 7     
 8     <BusObject Name='Bus3'>
 9         <BusElement Name = 'signal1' DataType='double' Dimensions='1' />
10         <BusElement Name='signal2' DataType='uint8' Dimensions='2' />
11     </BusObject>
12 </BusLib>

以前没咋用过xml,估计写的有很多该规范的地方,欢迎大家指正。

下面是主代码:

xmlfile = 'xmlbus.xml';
xmlbuscreator(xmlfile);

运行上面代码,则可以生成BusLib3.slx文件,里面包含两个Bus如下图所示:

 

可以看出,生成的两个Bus符合预设的条件,完工。

第一篇记录编程的博客,比较粗糙,发现问题的哥们尽管喷

posted @ 2016-04-13 22:17  SpyCoder  阅读(3180)  评论(1编辑  收藏  举报