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