我是Simulink模型和控制系统的超级初学者。 我有无人机动力学系统的.slx Simulink模型。 它接收两个输入(roll cmd,pitch cmd)并输出速度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...
EDIT2: 我正在使用Matlab2017a
答案 0 :(得分:3)
关于问题的前两点:
在simulink中:
要将输出传送到工作区,可以使用simout块(确保将格式保存到数组中)。
将输入连接到您的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模型/ p>
for i = 1:numberOfTimesteps
roll = ...
...
sim('simulinkModel.slx')
end
第二种更有效的方法是将常数块更改为其他源块,如斜坡信号或正弦信号
答案 1 :(得分:1)
首先,Simulink模型使用主Matlab工作区。因此,您可以在命令窗口(或仅在脚本中)更改变量值并运行Simulink模型。
有几种方法可以为Simulink初始化此常量。另一种有用的方法是创建包含所有变量的脚本,并在Simulink模型启动时加载它。您可以通过在Simulink / Model Explorer / Callbacks中添加脚本名称来实现。 (有不同的回调 - 加载,启动等)。阅读更多相关信息:here。
现在您可以使用sim
函数运行模拟:
sim('name_of_model')
如果model不在活动的MATLAB文件夹中,则 name_of_model
必须包含路径(您可以在主菜单下的matlab窗口中看到活动文件夹)。
sim
函数有不同的属性,在帮助中阅读它们对您有用。顺便说一下:您可以使用sim
更改模型的某些参数。您甚至可以在模型中找到任何块并更改其属性。阅读更多about sim
和finding current blocks。有趣的是,最后的解决方案使您能够在模拟过程中更改参数!
关于获取输出。运行模拟后,您将在主工作区中获得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
- 每次都为您提供此出口的值
我们还有一种方法可以获取输出值:
[t,x,y] = sim('model_name')
它返回双数组。 t
- 时间数组,y
- 所有输出值的矩阵(它已经加倍并且只包含没有时间的值,但是对于每个模拟时间!)
现在您可以创建常见的Matlab GUI并使用此变量!没有任何困难。您可以阅读有关Simulink here的GUI的更多信息。