编程建模基础知识
您可以在 MATLAB® 命令行窗口以编程方式执行大多数 Simulink® 建模基础操作,例如创建模型、向模型添加模块和设置参数。以下示例说明其中的一些命令及其用法。
加载模型
加载模型会将模型导入到内存中,但不在 Simulink 编辑器中打开模型进行编辑。加载模型之后,您可以通过编程方式来处理模型。只有在您打开模型之后,才能使用 Simulink 编辑器来编辑模型。
要加载系统,请使用 load_system
命令。例如,要加载 vdp
模型,请在 MATLAB 命令提示符下输入:
load_system('vdp')
创建模型并指定参数设置
您可以编写一个函数,以创建模型并使用您偏好的设置。例如,下面的函数将创建带有绿色背景并使用 ode3 求解器的模型:
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);
打开模型时通过编程方式加载变量
如果您指定变量作为模块参数值,则必须在模型中定义该变量的值。您可以将 PreloadFcn
回调与 set_param
函数结合使用,通过编程方式定义变量。此函数的格式如下所示:
set_param('mymodel','PreloadFcn','expression')
expression
是 MATLAB 搜索路径中的 MATLAB 命令或 MATLAB 脚本。此命令将模型的 PreloadFcn
回调设置为您指定的值。保存模型,以保存该设置。
例如,当您在 MATLAB 脚本 loadvar.m
中为模型 modelname.slx
定义变量时,请使用以下命令:
set_param('modelname','PreloadFcn','loadvar')
K
指定值 15
,请使用以下命令:set_param('modelname','PreloadFcn','K=15')
保存模型后,当您下一次打开模型时,将执行 PreloadFcn
回调。
以编程方式添加和连接模块
此示例说明如何使用函数以编程方式添加和连接模块。将模块添加到模型中之后,可通过三种不同的方式将它们连接起来:信号线、端口句柄和端口 ID。通过信号线,可以指定所有连接线段端点的精确 (x,y) 坐标。通过端口句柄和端口 ID,可将信号线连接到模块端口而不需要知道端口的位置坐标。
创建并打开名为 mymodel
的空模型。
添加模块,包括一个子系统模块。在 set_param
函数中使用 position
数组设置模块的大小和位置。使用 (x,y) 坐标设置模块的左上角和右下角。
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]);
在 Subsystem1
内,删除 In1
和 Out1
之间的默认连接。通过从模块库中复制并重命名 In1
,添加第二个输入端口。
delete_line('mymodel/Subsystem1','In1/1','Out1/1'); add_block('simulink/Sources/In1','mymodel/Subsystem1/In2');
重新定位 Subsystem1
中的内部输入和输出端口模块。
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]);
在 Subsystem1
内插入一个 Add
模块并调整其位置。
add_block('simulink/Math Operations/Add','mymodel/Subsystem1/Add1'); set_param('mymodel/Subsystem1/Add1','position',[250,80,290,120]);
然后添加信号线,将模型中的所有模块连接起来。首先使用信号线将 Sine1
和 Pulse1
模块连接起来。
找到 Sine1
输出端口的 (x,y) 坐标。
Sine1_Port = get_param('mymodel/Sine1','PortConnectivity')
Sine1_Port = struct with fields: Type: '1' Position: [185 100] SrcBlock: [] SrcPort: [] DstBlock: [1×0 double] DstPort: [1×0 double]
get_param
显示端口的 Position 为 [185 100]。
找到 Pulse1
输出端口的 (x,y) 坐标。
Pulse1_Port = get_param('mymodel/Pulse1','PortConnectivity')
Pulse1_Port = struct with fields: Type: '1' Position: [185 220] SrcBlock: [] SrcPort: [] DstBlock: [1×0 double] DstPort: [1×0 double]
get_param
显示端口的 Position 为 [185 220]。
使用三个信号线段,将 Sine1
的输出连接到 Subsystem1
的第一个输入。
add_line('mymodel', [185 100; 275 100]); add_line('mymodel', [275 100; 275 140]); add_line('mymodel', [275 140; 310 140]);
使用三个信号线段,将 Pulse1
的输出连接到 Subsystem1
的第二个输入。
add_line('mymodel', [185 220; 275 220]); add_line('mymodel', [275 220; 275 180]); add_line('mymodel', [275 180; 310 180]);
使用 get_param
获取连接的模块的端口句柄。然后使用模块端口句柄将 Subsystem1
的输出连接到 Scope1
的输入。
SubsysPortHandles = get_param('mymodel/Subsystem1','PortHandles'); ScopePortHandles = get_param('mymodel/Scope1','PortHandles'); add_line('mymodel',SubsysPortHandles.Outport(1),... ScopePortHandles.Inport(1));
使用端口名称和 ID 将 Subsystem1
内的 Add1
模块连接到子系统的输入和输出。Simulink 使用最直接的路径来连接端口。
add_line('mymodel/Subsystem1','In1/1','Add1/1'); add_line('mymodel/Subsystem1','In2/1','Add1/2'); add_line('mymodel/Subsystem1','Add1/1','Out1/1');
以编程方式注释掉或注释直通模块
要以编程方式查看或更改模块的注释状态,请使用 get_param
和 set_param
命令。
要查看模块的注释状态,请执行以下命令:
get_param(gcb,'commented');
要注释掉模块,请执行以下命令:
set_param(gcb,'commented','on');
要注释直通模块,请执行以下命令:
set_param(gcb,'commented','through');
要取消对模块的注释,请执行以下命令:
set_param(gcb,'commented','off');
通过编程方式命名信号
选择信号线的源模块。
使用
get_param
将当前所选模块的端口句柄指定给变量 p。使用get_param
将连接到该端口的信号线的句柄赋给变量 l。然后,将信号线的名称设置为's9'
。
p = get_param(gcb,'PortHandles') l = get_param(p.Outport,'Line') set_param(l,'Name','s9')
自动排列模型布局
您可以使用 Simulink.BlockDiagram.arrangeSystem
命令对模型布局。该命令将分别对齐左侧的输入模块、右侧的输出模块和输入与输出之间各列的模型元素。该命令一次只影响一个层。
您可以使用 Simulink.BlockDiagram.routeLine
命令对模型的现有信号线进行布线。对现有信号线进行布线可改善信号线的分布,并避免信号线与模型中的其他信号线和障碍物发生重叠。
虽然您可以对任何打开的模型使用这些命令,但它们对您以编程方式构建的模型特别有用。有关示例,请参阅Arrange Programmatically Populated Model。
在多个窗口中打开同一个模型
当您打开模型时,模型将显示在 Simulink 编辑器窗口中。例如,如果您打开了一个模型,然后又打开一个模型,第二个模型将显示在第二个窗口中。
要在两个 Simulink 编辑器窗口中打开同一个模型,请在 MATLAB 命令提示符下输入 open_system
命令并使用 window
参数。例如,如果您打开了名为 modelName
的模型,要打开 modelName
的另一个实例,请输入:
open_system('modelName','window')
使用 modelfinder
来索引 Simulink 模型并提高其可发现性
现在,您可以使用 modelfinder
来查找与搜索字符串匹配的示例模型。默认情况下,modelfinder
在 MATLAB 路径中搜索示例模型。您可以自定义 modelfinder
来搜索您的组织开发的示例模型。使用 modelfinder.register
索引指定路径中的所有示例模型。同样,使用 modelfinder.unregister
排除特定路径中的所有示例模型。有关详细信息,请参阅
、modelfinder
和modelfinder.registerFolder
。modelfinder.unregisterFolder
使用突出显示定位图元素
要突出显示一个打开模型中的模块、信号线、端口或注释,请使用 hilite_system
。
以编程方式指定颜色
在 MATLAB 命令行或 MATLAB 程序中,您可以使用 set_param
命令设置决定模块图背景颜色以及模块图元素的背景颜色和前景颜色的参数。下表汇总了控制模型颜色参数。
参数 | 决定 |
---|---|
| 模型背景 |
| 模块和注释背景 |
| 模块和注释前景 |
可将颜色参数设置为命名颜色或 RGB 值。
命名颜色:
'automatic'
、'black'
、'white'
、'red'
、'green'
、'blue'
、'cyan'
、'magenta'
、'yellow'
、'gray'
、'lightBlue'
、'orange'
、'darkGreen'
RGB 值:
'[r,g,b]'
其中
r
、g
和b
分别指颜色的红、绿、蓝分量值,这些值都归一化为介于0.0
到1.0
之间。
例如,以下命令将当前选择的系统或子系统的背景颜色设置为浅绿色:
set_param(gcs,'ScreenColor','[0.3, 0.9, 0.5]')
另请参阅
load_system
| open_system
| new_system
| save_system
| add_line
| delete_line
| add_block
| delete_block
| set_param
| get_param
| gcb
| Simulink.BlockDiagram.routeLine
| hilite_system