当前位置: 首页 > news >正文

Simulink指导手册笔记①--自动创建模型

自动创建模型

1.创建空白模型
function new_model(modelname) 
% NEW_MODEL Create a new, empty Simulink model
% NEW_MODEL('MODELNAME') creates a new model with
% the name 'MODELNAME'. Without the 'MODELNAME'
% argument, the new model is named 'my_untitled'.
if nargin == 0 
 modelname = 'my_untitled';
end
% create and open the model
open_system(new_system(modelname));
% set default screen color
set_param(modelname,'ScreenColor','green');
% set default solver
set_param(modelname,'Solver','ode3');
% save the model
save_system(modelname);
2.新增模块,设置模块位置
function new_model(modelname) 
% NEW_MODEL Create a new, empty Simulink model
% NEW_MODEL('MODELNAME') creates a new model with
% the name 'MODELNAME'. Without the 'MODELNAME'
% argument, the new model is named 'my_untitled'.
if nargin == 0 
 modelname = 'mymodel';
end
% create and open the model
open_system(new_system(modelname));
% set default screen color
set_param(modelname,'ScreenColor','white');
% set default solver
set_param(modelname,'Solver','ode3');
% save the model
save_system(modelname);
add_block('simulink/Sources/Sine Wave','mymodel/Sine1');
set_param('mymodel/Sine1','position',[140,80,180,120]);
add_block('simulink/Sources/Pulse Generator','mymodel/Pulse1');
set_param('mymodel/Pulse1','position',[140,200,180,240]);
add_block('simulink/Ports & Subsystems/Subsystem','mymodel/Subsystem1');
set_param('mymodel/Subsystem1','position',[315,120,395,200]);
add_block('simulink/Sinks/Scope','mymodel/Scope1');
set_param('mymodel/Scope1','position',[535,140,575,180]);

3.删除模块间信号线
delete_line('mymodel/Subsystem1','In1/1','Out1/1');
add_block('simulink/Sources/In1','mymodel/Subsystem1/In2');

set_param('mymodel/Subsystem1/In1','position',[50,50,90,70]);
set_param('mymodel/Subsystem1/In2','position',[50,130,90,150]);
set_param('mymodel/Subsystem1/Out1','position',[500,80,540,100]);

add_block('simulink/Math Operations/Add','mymodel/Subsystem1/Add1');
set_param('mymodel/Subsystem1/Add1','position',[250,80,290,120]);

set_param('mymodel/Subsystem1/Out1','position',[500,80,540,100]);

上式中坐标位置[500,80,540,100]其实是每个模块的左上角和右下角的坐标位置(x,y)

4.连接模块

要想把模块连接起来就需要知道每个模块的输出或输入的左边,然后用指令直接连接起来

比如我们以正弦曲线Sine1与脉冲模块Pulse1模块去链接子系统Subsystem1模块

首先需要通过如下指令找到Sine1与Pulse1模块的坐标,即红色方框的坐标

Sine1_Port = get_param('mymodel/Sine1','PortConnectivity')

同样的,子系统也需要查找位置(注意:找位置时模型必须是打开的状态)

是一个有3个元素的数组,是因为子系统正好有两个输入,和一个输出,找到第一个输入的坐标

打开工作区生成的结构体数据

找到位置

现在我们连接Sine1模块输出与Subsystem1模块的输入1

add_line('mymodel', [185 100; 310 140]);

运行整个代码看效果

整个代码如下:

function new_model(modelname) 
% NEW_MODEL Create a new, empty Simulink model
% NEW_MODEL('MODELNAME') creates a new model with
% the name 'MODELNAME'. Without the 'MODELNAME'
% argument, the new model is named 'my_untitled'.
if nargin == 0 
 modelname = 'mymodel';
end
% create and open the model
open_system(new_system(modelname));
% set default screen color
set_param(modelname,'ScreenColor','white');
% set default solver
set_param(modelname,'Solver','ode3');
% save the model
save_system(modelname);
add_block('simulink/Sources/Sine Wave','mymodel/Sine1');
set_param('mymodel/Sine1','position',[140,80,180,120]);
add_block('simulink/Sources/Pulse Generator','mymodel/Pulse1');
set_param('mymodel/Pulse1','position',[140,200,180,240]);
add_block('simulink/Ports & Subsystems/Subsystem','mymodel/Subsystem1');
set_param('mymodel/Subsystem1','position',[315,120,395,200]);
add_block('simulink/Sinks/Scope','mymodel/Scope1');
set_param('mymodel/Scope1','position',[535,140,575,180]);
delete_line('mymodel/Subsystem1','In1/1','Out1/1');
add_block('simulink/Sources/In1','mymodel/Subsystem1/In2');
add_block('simulink/Math Operations/Add','mymodel/Subsystem1/Add1');
set_param('mymodel/Subsystem1/Add1','position',[250,80,290,120]);
add_line('mymodel', [185 100; 310 140]);

可以看见,线条是直接相连的,也可以找一个中间的过渡坐标再连接,如下图所示

add_line('mymodel', [185 100; 275 100]);
add_line('mymodel', [275 100; 275 140]);
add_line('mymodel', [275 140; 310 140]);

 

同样的,把Pulse1与子系统相连

add_line('mymodel', [185 220; 275 220]);
add_line('mymodel', [275 220; 275 180]);
add_line('mymodel', [275 180; 310 180]);

 

当然如果觉得上面的方式比较麻烦,还有其他方法进行模块之间的连接,上面的麻烦之处是在于你需要知道具体的位置,不利于自动化脚本的生成。

通过端口手柄的方式:PortHandles

% add_line('mymodel', [185 100; 275 100]);
% add_line('mymodel', [275 100; 275 140]);
% add_line('mymodel', [275 140; 310 140]);
% add_line('mymodel', [185 220; 275 220]);
% add_line('mymodel', [275 220; 275 180]);
% add_line('mymodel', [275 180; 310 180]);
SubsysPortHandles = get_param('mymodel/Subsystem1','PortHandles');
SinePortHandles = get_param('mymodel/Sine1','PortHandles');
add_line('mymodel',SinePortHandles.Outport(1),...
SubsysPortHandles.Inport(2));

屏蔽刚才通过位置连接的信号,通过获取句柄的方式,在用add_line内的端口时,切记Outport在前面,Inport在后面,有多个端口使用序号

效果如下:

同样的方式,连接子系统和示波器

SubsysPortHandles = get_param('mymodel/Subsystem1','PortHandles');
ScopePortHandles = get_param('mymodel/Scope1','PortHandles');
add_line('mymodel',SubsysPortHandles.Outport(1),...
ScopePortHandles.Inport(1));

还有一种似乎看上去更快速的方法连接模块

使用模块的名字和ID

% add_line('mymodel', [185 100; 275 100]);
% add_line('mymodel', [275 100; 275 140]);
% add_line('mymodel', [275 140; 310 140]);
% add_line('mymodel', [185 220; 275 220]);
% add_line('mymodel', [275 220; 275 180]);
% add_line('mymodel', [275 180; 310 180]);
% SubsysPortHandles = get_param('mymodel/Subsystem1','PortHandles');
% ScopePortHandles = get_param('mymodel/Scope1','PortHandles');
% add_line('mymodel',SubsysPortHandles.Outport(1),...
% ScopePortHandles.Inport(1));
add_line('mymodel','Sine1/1','Subsystem1/1');
add_line('mymodel','Pulse1/1','Subsystem1/2');

使用该方法,把子系统内部的模块连接起来

add_line('mymodel/Subsystem1','In1/1','Add1/1');
add_line('mymodel/Subsystem1','In2/1','Add1/2');
add_line('mymodel/Subsystem1','Add1/1','Out1/1');

上面这两种方法较第一种虽然更方便,但是模块之间是直接相连的,没有过渡,信号交叉会比较严重

5.注释模块

注释一个模块:

set_param('mymodel/Pulse1','commented','on');

 取消注释一个模块:

set_param('mymodel/Pulse1','commented','off');

6.给信号线增加名字

比如给脉冲信号的线上增加一个名字

p = get_param('mymodel/Pulse1','PortHandles');
l = get_param(p.Outport,'Line');
set_param(l,'Name','pulse_test');

7.重新排布指令
Simulink.BlockDiagram.arrangeSystem('mymodel/Subsystem1')

 

8.在多个窗口打开同一个模型

打开了比如3个窗口,如果修改其中一个,那么另外两个窗口内的也会同步改变

这个功能我感觉可以用于多人协作

open_system('mymodel','window')
9.高亮一个模块
hilite_system('mymodel/Subsystem1')

 

10.背景颜色和模块颜色设置

设置模块的颜色:

'automatic', 'black', 'white', 'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'gray', 'lightBlue', 'orange', 'darkGreen'

RGB值:r为red,g为green,b为blue,值范围为0-1,进行三色混合

背景颜色:

set_param(gcs,'ScreenColor','[0.3, 0.9, 0.5]')

模块颜色设置:

set_param('mymodel/Pulse1', 'BackgroundColor', 'red');

本节完整代码如下:

function new_model(modelname) 
% NEW_MODEL Create a new, empty Simulink model
% NEW_MODEL('MODELNAME') creates a new model with
% the name 'MODELNAME'. Without the 'MODELNAME'
% argument, the new model is named 'my_untitled'.
if nargin == 0 
 modelname = 'mymodel';
end
% create and open the model
open_system(new_system(modelname));
% set default screen color
set_param(modelname,'ScreenColor','white');
% set default solver
set_param(modelname,'Solver','ode3');
% save the model
save_system(modelname);
add_block('simulink/Sources/Sine Wave','mymodel/Sine1');
set_param('mymodel/Sine1','position',[140,80,180,120]);
add_block('simulink/Sources/Pulse Generator','mymodel/Pulse1');
set_param('mymodel/Pulse1','position',[140,200,180,240]);
add_block('simulink/Ports & Subsystems/Subsystem','mymodel/Subsystem1');
set_param('mymodel/Subsystem1','position',[315,120,395,200]);
add_block('simulink/Sinks/Scope','mymodel/Scope1');
set_param('mymodel/Scope1','position',[535,140,575,180]);
delete_line('mymodel/Subsystem1','In1/1','Out1/1');
add_block('simulink/Sources/In1','mymodel/Subsystem1/In2');
add_block('simulink/Math Operations/Add','mymodel/Subsystem1/Add1');
set_param('mymodel/Subsystem1/Add1','position',[250,80,290,120]);
add_line('mymodel', [185 100; 275 100]);
add_line('mymodel', [275 100; 275 140]);
add_line('mymodel', [275 140; 310 140]);
add_line('mymodel', [185 220; 275 220]);
add_line('mymodel', [275 220; 275 180]);
add_line('mymodel', [275 180; 310 180]);
SubsysPortHandles = get_param('mymodel/Subsystem1','PortHandles');
ScopePortHandles = get_param('mymodel/Scope1','PortHandles');
add_line('mymodel',SubsysPortHandles.Outport(1),...
ScopePortHandles.Inport(1));
add_line('mymodel/Subsystem1','In1/1','Add1/1');
add_line('mymodel/Subsystem1','In2/1','Add1/2');
add_line('mymodel/Subsystem1','Add1/1','Out1/1');
set_param('mymodel/Pulse1','commented','on');
set_param('mymodel/Pulse1','commented','off');
p = get_param('mymodel/Pulse1','PortHandles');
l = get_param(p.Outport,'Line');
set_param(l,'Name','pulse_test');
Simulink.BlockDiagram.arrangeSystem('mymodel/Subsystem1')
hilite_system('mymodel/Subsystem1')
set_param(gcs,'ScreenColor','[0.3, 0.9, 0.5]')
set_param('mymodel/Pulse1', 'BackgroundColor', 'red');

相关文章:

  • LeetCode 解题思路 16(Hot 100)
  • spring 创建单例 Bean 源码分析
  • itsdangerous加解密源码分析|BUG汇总
  • 大语言模型入门文献推荐
  • 每日Attention学习28——Strip Pooling
  • 【Golang】第二弹-----变量、基本数据类型、标识符
  • 上传本地项目到GitHub
  • 守护中国软件供应链安全,未名湖畔的筑梦人
  • Adobe Premiere Pro2023配置要求
  • 【Function】使用托管身份调用Function App触发器,以增强安全性
  • 深入解析 TensorFlow 兼容性问题及构建输出文件结构*
  • 操作系统八股文整理(一)
  • PyTorch 深度学习实战(11):强化学习与深度 Q 网络(DQN)
  • 【C++基础十】泛型编程(模板初阶)
  • Windows 环境图形化安装 Oracle 23ai
  • spring声明式事务原理02-调用第1层@Transactional方法-按需创建事务createTransactionIfNecessary
  • 深入解析“Off-the-Shelf”——从产品到AI模型的通用概念
  • 视觉定位项目中可以任意修改拍照点位吗?
  • ElementUI 表格中插入图片缩略图,鼠标悬停显示大图
  • 图像处理篇---图像预处理
  • 网站策划的最终体现/网站建设关键词排名
  • 万链网站做的怎么样?/成都网站排名优化公司
  • 做男女的那个视频网站/企业网址
  • 南京江宁网站制作公司/seo优化
  • 网站架构设计师求职信/产品软文案例
  • 深圳做生鲜食材的网站叫什么/广州seo软件