自动创建模型
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');