zoukankan      html  css  js  c++  java
  • 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符合预设的条件,完工。

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

    给孤独的理想插上自由的翅膀
  • 相关阅读:
    Groups And SiteGroups
    【objc】objectivec学习(1)
    【正则】正则表达式和自动机
    【android】ListView的item事件和item里面的view的事件同时存在
    【计划】rss,搜索
    【objc】Foundation Kit
    【设计】【爬虫】针对某一主题做的爬虫,使用Jsoup解析
    【java】【实践】阅读代码,一些较好的实践
    【java】【HtmlParser】HtmlParser使用
    【learn】learn1
  • 原文地址:https://www.cnblogs.com/spyplus/p/5388983.html
Copyright © 2011-2022 走看看