本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

编程建模基础知识

您可以在 MATLAB® 命令提示符下,通过编程方式执行大多数基本的 Simulink® 建模操作。交互式模型编辑中的“函数”部分列出了与基本建模操作(例如,创建模型、向模型中添加模块、设置参数等)对应的命令。以下示例说明其中的一些命令及其用法。

加载模型

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

要加载系统,请使用 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 内,删除 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');

通过编程方式命名信号

  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 a Programmatically Populated Model

在多个窗口中打开同一个模型

当您打开模型时,模型将显示在 Simulink Editor 窗口中。例如,如果您打开了一个模型,然后又打开一个模型,第二个模型将显示在第二个窗口中。

要在两个 Simulink Editor 窗口中打开同一个模型,请在 MATLAB 命令提示符下输入 open_system 命令并使用 window 参数。例如,如果您打开了 vdp 模型,要打开模型 vdp 的另一个实例,请输入:

open_system('vdp','window')

获取 Simulink 标识符

模型中的每个模块都有一个 Simulink 标识符 (SID),该标识符具有唯一性且不可修改。SID 在对象的生命周期内保持不变,并与模型保存在一起。即使对象名称改变,SID 也保持不变。SID 的格式为 model_name:number

使用 Simulink 标识符定位模块图组件

Simulink 标识符 (SID) 是自动分配给 Stateflow® 图中的 Simulink 模块、模型注释或 Stateflow 对象的唯一标识。SID 可帮助您识别这些组件在模块图中的特定实例,尤其是在与团队成员共享模型时。

要直观地突出显示模型中的某个组件,需要获取该组件的 SID 并在 Simulink.ID.hilite 函数中使用。

SID 具有以下特征:

  • 在 Simulink 模块、模型注释或 Stateflow 对象的生命周期内保持不变

  • 保存在模型文件中

  • 即使模块或对象名称改变也保持不变

  • 无法修改

SID 的格式为:

model_name:sid_number

  • model_name 是模块、注释或 Stateflow 对象所在的模型的名称。

  • sid_number 是模型中具有唯一性的编号,由 Simulink 指定。

在某些情况下,SID 包括额外的冒号,例如在用户库中的模块实例上。

突出显示模块

  1. 要打开模型 vdp,请在 MATLAB 命令提示符下输入 vdp

  2. 获取 Mu 模块的 SID。

    Simulink.ID.getSID('vdp/Mu')
    ans =
    
    vdp:4
    
    
  3. 使用 SID 突出显示模块。

    Simulink.ID.hilite('vdp:4')

    模块将在模型中突出显示:

突出显示注释

  1. 打开模型 vdp

  2. 选择模块图顶部的注释。

  3. 获取所选注释的注释对象。

    ann = getSelectedAnnotations('vdp')
    ann =
    
    Simulink.Annotation
    
    
  4. 获取注释的 SID。

    ann.SIDFullString
    ans =
    
    vdp:13
    
    
  5. 使用 SID 突出显示注释。

    Simulink.ID.hilite('vdp:13')

    注释将在模型中突出显示:

突出显示 Stateflow 对象

  1. 打开模型 sf_resolve_signal_object

  2. 获取 Signal Object Chart Stateflow 对象的 SID:

    Simulink.ID.getSID('sf_resolve_signal_object/Signal Object Chart')
    
    ans =
    
    sf_resolve_signal_object:1
    
    

  3. 使用 SID 突出显示对象。

    Simulink.ID.hilite('sf_resolve_signal_object:1')

    对象将在模型中突出显示。

以编程方式指定颜色

在 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]')

另请参阅

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

相关主题