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

时间:2024-03-02 15:14:44

帮一个老师写的小工具

在一个大工程中需要很多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符合预设的条件,完工。

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