Main Content

编程建模基础知识

您可以在 MATLAB® 命令行窗口以编程方式执行大多数 Simulink® 建模基础操作,例如创建模型、向模型添加模块和设置参数。以下示例说明其中的一些命令及其用法。

加载模型

加载模型会将模型导入到内存中,但不在 Simulink 编辑器中打开模型进行编辑。加载模型之后,您可以通过编程方式来处理模型。只有在您打开模型之后,才能使用 Simulink 编辑器来编辑模型。

要加载系统,请使用 load_system 命令。

例如,假设您在 MATLAB 路径中有名为 myModel 的模型。要加载该模型,请在 MATLAB 命令行窗口中输入以下命令:

load_system('myModel')

创建模型并指定参数设置

您可以编写一个函数,以创建模型并使用您偏好的设置。例如,下面的函数将创建带有绿色背景并使用 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 内,删除 In1Out1 之间的默认连接。通过从模块库中复制并重命名 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]);

然后添加信号线,将模型中的所有模块连接起来。首先使用信号线将 Sine1Pulse1 模块连接起来。

找到 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_paramset_param 命令。

  • 要查看模块的注释状态,请执行以下命令:

    get_param(gcb,'commented');

  • 要注释掉模块,请执行以下命令:

    set_param(gcb,'commented','on');

  • 要注释直通模块,请执行以下命令:

    set_param(gcb,'commented','through');

  • 要取消对模块的注释,请执行以下命令:

    set_param(gcb,'commented','off');

通过编程方式命名信号

  1. 选择信号线的源模块。

  2. 使用 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 函数在多个数据库中搜索示例、模型和工程。默认情况下,modelfinder 搜索 MathWorks® Examples 数据库。您还可以使用模型查找器配置您的数据库。有关模型查找器的详细信息,请参阅Configure and Search Databases

使用突出显示定位图元素

要突出显示一个打开模型中的模块、信号线、端口或注释,请使用 hilite_system

以编程方式指定颜色

在 MATLAB 命令行或 MATLAB 程序中,您可以使用 set_param 命令设置决定模块图背景颜色以及模块图元素的背景颜色和前景颜色的参数。下表汇总了控制模型颜色参数。

参数决定

ScreenColor

模型背景

BackgroundColor

模块和注释背景

ForegroundColor

模块和注释前景

可将颜色参数设置为命名颜色或 RGB 值。

  • 命名颜色:'automatic''black''white''red''green''blue''cyan''magenta''yellow''gray''lightBlue''orange''darkGreen'

  • RGB 值:'[r,g,b]'

    其中 rgb 分别指颜色的红、绿、蓝分量值,这些值都归一化为介于 0.01.0 之间。

例如,以下命令将当前选择的系统或子系统的背景颜色设置为浅绿色:

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

另请参阅

| | | | | | | | | | | |

相关主题