幫一個老師寫的小工具
在一個大工程中需要很多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符合預設的條件,完工。
第一篇記錄編程的博客,比較粗糙,發現問題的哥們盡管噴
