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符合預設的條件,完工。

第一篇記錄編程的博客,比較粗糙,發現問題的哥們盡管噴


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM