ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Matlab编程技巧:通过脚本创建Simulink模块、信号线

2022-01-10 20:59:08  阅读:494  来源: 互联网

标签:信号线 Simulink Sheet Name Cell add Matlab 模块 Model


本文研究通过Matlab脚本创建模型的方法。

文章目录

1 相关函数

根据博主工作经验,一个Simulink控制模型应该是由两大元素构成:模块和信号线。因此,通过Matlab脚本创建模型也有两个函数分别用于创建模块和信号线,本章节会介绍这两个函数。

1.1 创建模块

函数add_block(source,dest)
输入参数1)source——被拷贝的模块路径;2)dest——新模块的路径
返回值/

函数的两个参数中,source参数通常是Simulink库里的模块,也可以是别的模型中的模块。例如我们创建一个名为untitled的模型(模型需要保持打开的状态),然后在Matlab中运行如下函数:

>> add_block('simulink/Sinks/Scope','untitled/MyScope');

然后在模型中就会出现一个Scope模块,同时名字被改成了MyScope:
在这里插入图片描述

1.2 创建信号线

函数add_line(sys,out,in)
输入参数1)sys——模型或子系统名;2)out——信号线起始位置;3)out——信号线中止位置
返回值/

这个函数的用法也不难,例如在untitled模型中有两个模块如下:
在这里插入图片描述
然后在Matlab中运行如下函数:

>> add_line('untitled','Constant/1','MyScope/1')

其中,Constant/1代表Constant模块的第一个输出口,MyScope/1代表MyScope模块的第一个输入口。运行好了以后,线就连起来了。
在这里插入图片描述
该函数还可以通过port口的句柄来连接模块,可以参考帮助文档。

2 实际应用

博主相信应该没有谁用脚本把整个Simulink模型创建出来的,那可不现实。那么为什么要研究通过脚本创建模块和信号线呢。其实是为了生成标准的接口和框架,然后由工程师在整个框架内建模。下面博主会演示一个例子,通过表格生成一个最外层的子系统,以及子系统的输入输出Port。

1)首先自己创建一个表格,名为Model_1.xlsx,表格内容如下;
在这里插入图片描述
表格里面比较简单,写了模型的输入输出接口名称,以及数据类型。另外,一个Worksheet对应一个子系统,一个Worksheet名称为Subsystem1。

2)有了表格模板以后,需要编写一个脚本,来循环读取工作表,以及工作表中的每一行。这里,博主就直接贴出自己写的脚本(带有注释),里面的函数和方法都是其他以前写的博客讲过的,就不再细说。

%% 通过表格生成模型框架
function GenerateModelFromExcel()
File_Struct = dir('*.xlsx');
for i = 1:length(File_Struct) %遍历当前路径下的xlsx文件
    Excel_Name = File_Struct(i).name;
    Model_Name = strrep(Excel_Name,'.xlsx','');
    new_system(Model_Name);%创建模型
    open_system(Model_Name);%打开模型
    [~,Sheet_Cell] = xlsfinfo(Excel_Name);
    for j = 1:length(Sheet_Cell) %遍历当前Excel中的Sheet页
        Sheet_Name = Sheet_Cell{j};
        add_block('simulink/Ports & Subsystems/Subsystem',[Model_Name,'/',Sheet_Name]);
        Line_Handle = find_system([Model_Name,'/',Sheet_Name],'FindAll','on','Type','Line');
        delete(Line_Handle);delete_block([Model_Name,'/',Sheet_Name,'/In1']);delete_block([Model_Name,'/',Sheet_Name,'/Out1']);
        [~,~,ExcelContent_Cell] = xlsread(Excel_Name,Sheet_Name);
        PortNum = 1;
        for row = 2:size(ExcelContent_Cell,1) %遍历当前Sheet页的每一行
            if ~isnan(ExcelContent_Cell{row,1})%在子系统内外层添加Inport模块
                Inport_Name = ExcelContent_Cell{row,1};
                Inport_Type = ExcelContent_Cell{row,2};
                add_block('simulink/Ports & Subsystems/In1',[Model_Name,'/',Sheet_Name,'/',Inport_Name]);
                set_param([Model_Name,'/',Sheet_Name,'/',Inport_Name],'DataType',Inport_Type);
                add_block('simulink/Ports & Subsystems/In1',[Model_Name,'/',Inport_Name]);
                set_param([Model_Name,'/',Inport_Name],'DataType',Inport_Type);
                add_line(Model_Name,[Inport_Name,'/1'],[Sheet_Name,'/',num2str(PortNum)]);
            end
            if ~isnan(ExcelContent_Cell{row,3})%在子系统内外层添加Outport模块
                Outport_Name = ExcelContent_Cell{row,3};
                Outport_Type = ExcelContent_Cell{row,4};
                add_block('simulink/Ports & Subsystems/Out1',[Model_Name,'/',Sheet_Name,'/',Outport_Name]);
                set_param([Model_Name,'/',Sheet_Name,'/',Outport_Name],'DataType',Outport_Type);
                add_block('simulink/Ports & Subsystems/Out1',[Model_Name,'/',Outport_Name]);
                set_param([Model_Name,'/',Outport_Name],'DataType',Outport_Type);
                add_line(Model_Name,[Sheet_Name,'/',num2str(PortNum)],[Outport_Name,'/1']);
            end
            PortNum = PortNum + 1;
        end        
    end
    save_system(Model_Name);
    close_system(Model_Name)
    
end

end

3)将上面的脚本保存成m文件,并运行,就可以通过表格生成模型;
在这里插入图片描述
模块和子系统都放在了默认的位置,所以不是很好看。可以自己手动调整一下模块和信号线。
在这里插入图片描述
实际工作中如果想生成模型架构肯定不会这么简单,要按照项目需求来编写脚本。但是用到的函数无非就是那几个,只是不同的排列组合的使用罢了。

生成好架构以后,子系统里面的控制策略就需要工程师按照需求来实施了。

3 总结

本文研究通过Matlab脚本创建模型的方法,通过该方法可以批量生成规范的模型架构,降低工作中出错的机率。

>>返回个人博客总目录

标签:信号线,Simulink,Sheet,Name,Cell,add,Matlab,模块,Model
来源: https://blog.csdn.net/u013288925/article/details/122202612

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有