如何从脚本中调用 simulink 模型 (.slx)

How to call simulink model(.slx) from script

我是 Simulink 模型和控制系统的超级初学者。 我有无人机动力学系统的 .slx Simulink 模型。 它接受两个输入(滚动命令、俯仰命令)并输出速度 x、速度 y、位置 x 和位置 y。

从这里看来,调用

就可以打开系统了
open_system('myModel.slx', 'loadable');

但是我该如何输入和获取输出值呢? 有什么方法可以在图形用户界面中执行此操作吗?

编辑: 这是我模型的完整布局:

我做的时候

roll_CMD=10;
pitch_CMD=20;

我收到警告说:

Input port 1 of 'SimpleDroneDynamics/...' is not connected.
  1. 如何使用端口号提供输入?
  2. 如何获得带端口号的输出?我试过了

    [vx, vy, px, py] = sim('SimpleDroneDynamics.slx');

并收到一条错误消息

Number of left-hand side argument doesn't match block diagram...
  1. 有没有办法在每个时间步连续输入?这是控制器模块,我想我应该根据输出位置和速度输入不同的值。

编辑2: 我正在使用 Matlab2017a

关于你问题的前两点:

在 simulink 中:

  • 对于输入,您可以使用常量块,当您双击输入块时,您可以分配一个值,该值可以是工作区变量。

  1. 要将输出输出到您的工作区,您可以使用 simout 块(确保将格式保存到数组)。

  2. 将输入连接到您的 simulink 模型

  3. 将您的 simulink 模型的输出连接到 simout 模块。

MATLAB 脚本

   clc;
   clear all;

   roll = 10;
   pitch = 20;

   sim('/path_to_simulinkmodel.slx')

   time = simout(:,1);
   velocity_X = simout(:,2);
   velocity_Y = simout(:,3);
   position_X = simout(:,4);
   position_Y = simout(:,5);

关于你问题的第三点

您可以在框图编辑器中定义模拟的持续时间。您可以放置​​一个在调用脚本中定义的变量。有多种实现时间相关输入变量的方法:

  • 我个人不推荐的一个选项是使用 for 循环并使用 roll 和 [=38= 的不同值调用 simulink 模型]音高

     for i = 1:numberOfTimesteps
        roll = ...
        ...
        sim('simulinkModel.slx')
     end
    
  • 第二种更有效的方法是将常量块更改为其他源块,如斜坡信号或正弦信号

  1. 首先,Simulink 模型使用主 Matlab 工作区。因此,您可以在命令 window(或仅在您的脚本)和 运行 Simulink 模型中更改变量值。

  2. 有几种方法可以为 Simulink 初始化此常量。一种更有用的方法是创建包含所有变量的脚本并在 Simulink 模型启动时加载它。您可以通过在 Simulink/Model Explorer/Callbacks 中添加脚本名称来实现。 (有不同的回调——加载时、启动时等)。阅读更多相关信息:here.

  3. 现在您可以 运行 使用 sim 函数进行模拟:

    sim('name_of_model')
    

    name_of_model 如果模型不在活动的 MATLAB 文件夹中(您可以在主菜单下的 matlab window 中看到活动文件夹),则必须包含路径。

    sim 函数有不同的属性,在帮助中阅读它们可能对您有用。顺便说一句:您可以使用 sim 更改模型的一些参数。您甚至可以在模型中找到任何块并更改其属性。阅读更多 about sim and about finding current blocks。有趣的是,最后一个解决方案使您能够在模拟期间更改参数!

  4. 关于获取输出。 运行 模拟后,您会在主工作区中获得 tout 变量。它是一系列时间步长。但是,如果您添加 outport block(就像我的图片),您还会在工作区 yout 中获得另一个变量。 yout 是一个数据集。它包含您所有的输出值。例如,对于 2 个输出端口:

    yout
    
    yout = 
    
      Simulink.SimulationData.Dataset
      Package: Simulink.SimulationData
    
      Characteristics:
              Name: 'yout'
        Total Elements: 2
    
      Elements:
        1 : ''
        2 : ''
    

    获取任何输出端口的值:

    yout.get(1).Values
    

    它是一个时间序列数据类型,所以:

    yout.get(1).Values.Time - 给你次

    yout.get(2).Values.Data - 每次给你这个输出端口的值

  5. 我们还有一种获取输出值的方法:

    [t,x,y] = sim('model_name')
    

    它 returns 双数组。 t- 时间数组,y - 所有输出值的矩阵(它已经翻倍并且只包含没有时间的值,但是对于每个模拟时间!)

  6. 所以现在您可以创建通用的 Matlab GUI 并使用这些变量!没有任何困难。您可以阅读有关 Simulink here.

  7. GUI 的更多信息