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

时间:2017-06-07 08:34:28

标签: matlab simulink

我是Simulink模型和控制系统的超级初学者。 我有无人机动力学系统的.slx Simulink模型。 它接收两个输入(roll cmd,pitch cmd)并输出速度x,速度y,位置x和位置y。

从这里开始,似乎我可以通过调用

来打开系统
open_system('myModel.slx', 'loadable');

simulink model

但是如何输入输入并获取输出值? 有没有办法在gui中做到这一点?

编辑: 以下是我的模型的完整布局:enter image description here

当我做的时候

roll_CMD=10;
pitch_CMD=20;

我收到警告说:

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

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

  3. 并且出错了

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

2 个答案:

答案 0 :(得分:3)

关于问题的前两点:

在simulink中:

simulink block diagram

  • 对于输入,您可以使用常量块,当您双击输入块时,您可以指定一个值,该值可以是工作空间变量。

constant block

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

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

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

  4. 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 pitch <调用simulink模型/ p>

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

答案 1 :(得分:1)

  1. 首先,Simulink模型使用主Matlab工作区。因此,您可以在命令窗口(或仅在脚本中)更改变量值并运行Simulink模型。 enter image description here

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

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

    sim('name_of_model')
    
    如果model不在活动的MATLAB文件夹中,则

    name_of_model必须包含路径(您可以在主菜单下的matlab窗口中看到活动文件夹)。

    sim函数有不同的属性,在帮助中阅读它们对您有用。顺便说一下:您可以使用sim更改模型的某些参数。您甚至可以在模型中找到任何块并更改其属性。阅读更多about simfinding 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')
    

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

  6. 现在您可以创建常见的Matlab GUI并使用此变量!没有任何困难。您可以阅读有关Simulink here的GUI的更多信息。