首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从脚本调用simulink模型(.slx)

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

Stack Overflow用户
提问于 2017-06-07 08:34:27
回答 2查看 6.1K关注 0票数 1

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

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

代码语言:javascript
复制
open_system('myModel.slx', 'loadable');

但是,如何输入并获得输出值呢?有什么办法能让我在里做到这一点吗?

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

当我做的时候

代码语言:javascript
复制
roll_CMD=10;
pitch_CMD=20;

我收到警告说:

代码语言:javascript
复制
Input port 1 of 'SimpleDroneDynamics/...' is not connected.
  1. 如何使用端口号输入输入?
  2. 如何获得端口号的输出?我试过了 vx,vy,px,py = sim('SimpleDroneDynamics.slx');

有个错误说

代码语言:javascript
复制
Number of left-hand side argument doesn't match block diagram...
  1. 是否有一种方法可以在每一时间步骤连续地输入输入?作为控制器模块,我想我应该根据输出位置和速度来输入不同的值。

EDIT2:我在用Matlab2017a

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-07 11:31:50

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

  1. 有几种方法来初始化这个常量的Simulink。另一个有用的方法是创建包含所有变量的脚本,并在Simulink模型启动时加载它。您可以在Simulink/Model /回调中添加脚本名。(有不同的回调-加载、启动等等)。了解更多有关此信息的信息:这里
  2. 现在您可以使用sim函数运行您的模拟: sim(Name_of_model) 如果模型不在active MATLAB文件夹中,name_of_model必须包含路径(在主菜单下的matlab窗口中可以看到活动文件夹)。 sim函数有不同的属性,请阅读它们的帮助--这对您很有用。顺便说一句:您可以使用sim更改模型的一些参数。您甚至可以在模型中找到任何块并更改它的属性。阅读更多sim和关于找出电流块的内容。有趣的是,最后一个解决方案使您能够在模拟期间更改参数!
  3. 关于产出的问题。在运行模拟之后,在主工作区中获得tout变量。它是一系列的时间步骤。但是,如果添加输出端口块 (如在我的图像中),也会在工作区yout中获得另一个变量。yout是一个数据集。它包含所有的输出值。例如,对于2个外部端口: yout = Simulink.SimulationData.Dataset包: Simulink.SimulationData特性:名称:' yout‘总元素:2个元素:1:’2:‘ 获取任何一个输出端口的值: yout.get(1).Values 它是一个timeseries数据类型,因此: yout.get(1).Values.Time -给你时间 yout.get(2).Values.Data -每次都给出这个输出端口的值
  4. 我们还有一种获取输出值的方法: t,x,y= sim('model_name') 它返回双数组。t-时间数组,所有输出值的y -矩阵(它已经加倍,只包含没有时间的值,但对于每个模拟时间!)
  5. 因此,现在您可以创建通用的Matlab并在此变量上工作!没有任何困难。您可以阅读更多有关图形用户界面的Simulink 这里
票数 1
EN

Stack Overflow用户

发布于 2017-06-07 11:02:59

关于你问题的前两点:

simulink中的

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

  1. 要将输出输入到工作区,可以使用simout块(确保将Save格式放置到数组中)。
  2. 将输入连接到simulink模型
  3. 将simulink模型的输出连接到simout块。

MATLAB脚本

代码语言:javascript
复制
   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循环,并使用不同的滚动和俯仰值调用simulink模型。 I=1: for roll =.sim('simulinkModel.slx')结尾
  • 第二种更有效的方法是将常量块转换为其他源块,如斜坡信号或正弦信号。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44407531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档