如何从脚本中调用 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.
- 如何使用端口号提供输入?
如何获得带端口号的输出?我试过了
[vx, vy, px, py] = sim('SimpleDroneDynamics.slx');
并收到一条错误消息
Number of left-hand side argument doesn't match block diagram...
- 有没有办法在每个时间步连续输入?这是控制器模块,我想我应该根据输出位置和速度输入不同的值。
编辑2:
我正在使用 Matlab2017a
关于你问题的前两点:
在 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 和 [=38= 的不同值调用 simulink 模型]音高
for i = 1:numberOfTimesteps
roll = ...
...
sim('simulinkModel.slx')
end
第二种更有效的方法是将常量块更改为其他源块,如斜坡信号或正弦信号
首先,Simulink 模型使用主 Matlab 工作区。因此,您可以在命令 window(或仅在您的脚本)和 运行 Simulink 模型中更改变量值。
有几种方法可以为 Simulink 初始化此常量。一种更有用的方法是创建包含所有变量的脚本并在 Simulink 模型启动时加载它。您可以通过在 Simulink/Model Explorer/Callbacks 中添加脚本名称来实现。 (有不同的回调——加载时、启动时等)。阅读更多相关信息:here.
现在您可以 运行 使用 sim
函数进行模拟:
sim('name_of_model')
name_of_model
如果模型不在活动的 MATLAB 文件夹中(您可以在主菜单下的 matlab window 中看到活动文件夹),则必须包含路径。
sim
函数有不同的属性,在帮助中阅读它们可能对您有用。顺便说一句:您可以使用 sim
更改模型的一些参数。您甚至可以在模型中找到任何块并更改其属性。阅读更多 about sim
and about 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')
它 returns 双数组。 t
- 时间数组,y
- 所有输出值的矩阵(它已经翻倍并且只包含没有时间的值,但是对于每个模拟时间!)
所以现在您可以创建通用的 Matlab GUI 并使用这些变量!没有任何困难。您可以阅读有关 Simulink here.
GUI 的更多信息
我是 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.
- 如何使用端口号提供输入?
如何获得带端口号的输出?我试过了
[vx, vy, px, py] = sim('SimpleDroneDynamics.slx');
并收到一条错误消息
Number of left-hand side argument doesn't match block diagram...
- 有没有办法在每个时间步连续输入?这是控制器模块,我想我应该根据输出位置和速度输入不同的值。
编辑2: 我正在使用 Matlab2017a
关于你问题的前两点:
在 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 和 [=38= 的不同值调用 simulink 模型]音高
for i = 1:numberOfTimesteps roll = ... ... sim('simulinkModel.slx') end
第二种更有效的方法是将常量块更改为其他源块,如斜坡信号或正弦信号
首先,Simulink 模型使用主 Matlab 工作区。因此,您可以在命令 window(或仅在您的脚本)和 运行 Simulink 模型中更改变量值。
有几种方法可以为 Simulink 初始化此常量。一种更有用的方法是创建包含所有变量的脚本并在 Simulink 模型启动时加载它。您可以通过在 Simulink/Model Explorer/Callbacks 中添加脚本名称来实现。 (有不同的回调——加载时、启动时等)。阅读更多相关信息:here.
现在您可以 运行 使用
sim
函数进行模拟:sim('name_of_model')
name_of_model
如果模型不在活动的 MATLAB 文件夹中(您可以在主菜单下的 matlab window 中看到活动文件夹),则必须包含路径。sim
函数有不同的属性,在帮助中阅读它们可能对您有用。顺便说一句:您可以使用sim
更改模型的一些参数。您甚至可以在模型中找到任何块并更改其属性。阅读更多 aboutsim
and about 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')
它 returns 双数组。
t
- 时间数组,y
- 所有输出值的矩阵(它已经翻倍并且只包含没有时间的值,但是对于每个模拟时间!)所以现在您可以创建通用的 Matlab GUI 并使用这些变量!没有任何困难。您可以阅读有关 Simulink here.
GUI 的更多信息