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

Matlab 如何从脚本调用simulink模型(.slx),matlab,simulink,Matlab,Simulink,我是Simulink模型和控制系统的超级初学者。 我有无人机动力学系统的.slx Simulink模型。 它接收两个输入(滚转指令、俯仰指令)并输出速度x、速度y、位置x和位置y 从这里,我似乎可以通过调用 open_system('myModel.slx', 'loadable'); 但是我如何输入并获得输出值呢? 有没有一种方法可以在gui中实现这一点 编辑: 以下是我的模型的完整布局: 当我这么做的时候 roll_CMD=10; pitch_CMD=20; 我收到一条警告说: Inp

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

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

open_system('myModel.slx', 'loadable');

但是我如何输入并获得输出值呢? 有没有一种方法可以在gui中实现这一点

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

当我这么做的时候

roll_CMD=10;
pitch_CMD=20;
我收到一条警告说:

Input port 1 of 'SimpleDroneDynamics/...' is not connected.
  • 如何使用端口号馈送输入
  • 如何使用端口号获取输出?我试过了

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

  • 有个错误说

    Number of left-hand side argument doesn't match block diagram...
    
  • 是否有一种方法可以在每个时间步连续输入?作为控制器模块,我想我应该根据输出位置和速度输入不同的值 编辑2:
    关于您问题的前两点,我使用Matlab2017a

    在simulink中:

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

  • 要获得工作区的输出,可以使用simout块(确保将Save format放入数组)

  • 将输入连接到simulink模型

  • 将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和pitch值调用simulink模型

    • 第二种更有效的方法是将恒定块更改为其他源块,如斜坡信号或正弦信号


    关于您问题的前两点:

    在simulink中:

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

  • 要获得工作区的输出,可以使用simout块(确保将Save format放入数组)

  • 将输入连接到simulink模型

  • 将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和pitch值调用simulink模型

    • 第二种更有效的方法是将恒定块更改为其他源块,如斜坡信号或正弦信号

  • 首先,Simulink模型使用主要的Matlab工作空间。因此,您可以在命令窗口(或仅在脚本中)更改变量值并运行Simulink模型。

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

  • 现在,您可以使用
    sim
    功能运行模拟:

    sim('name_of_model')
    
    如果模型不在活动的MATLAB文件夹中(可以在主菜单下的MATLAB窗口中看到活动文件夹),则模型的名称必须包含路径

    sim
    函数有不同的属性,请在“帮助”中阅读这些属性,这可能对您有用。顺便说一下:您可以使用
    sim
    更改模型的一些参数。您甚至可以在模型中找到任何块并更改其属性。阅读更多关于。有趣的是,上一个解决方案使您能够在模拟过程中更改参数

  • 关于获得输出。运行模拟后,您将在主工作区中获得
    tout
    变量。它是一个时间步数组。但如果您添加(如在我的图片中),您也会在workspace
    yout
    中获得另一个变量
    yout
    是一个数据集。它包含您的所有输出值。例如,对于2个出口:

    yout
    
    yout = 
    
      Simulink.SimulationData.Dataset
      Package: Simulink.SimulationData
    
      Characteristics:
              Name: 'yout'
        Total Elements: 2
    
      Elements:
        1 : ''
        2 : ''
    
    获取任何输出的值:

    yout.get(1).Values
    
    它是一种timeseries数据类型,因此:

    yout.get(1).Values.Time
    -给你时间

    yout.get(2.Values.Data)
    每次为您提供此输出端口的值

  • 我们还有一种方法可以获取输出值:

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

  • 现在,您可以创建通用的MatlabGUI并使用这些变量!没有任何困难。您可以阅读有关Simulink GUI的更多信息

  • 首先,Simulink模型使用主要的Matlab工作空间。因此,您可以在命令窗口(或仅在脚本中)更改变量值并运行Simulink模型。

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

  • 现在,你可以