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