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符合预设的条件,完工。
第一篇记录编程的博客,比较粗糙,发现问题的哥们尽管喷
给孤独的理想插上自由的翅膀