编程语言
首页 > 编程语言> > Matlab编程技巧:通过脚本创建Simulink模块、信号线

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

作者:互联网

本文研究通过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