将来自 MATLAB 工作区(结构)的向量分配给 Simulink 模型
Assign vectors from MATLAB workspace (struct) to Simulink Model
我需要有关 运行 Simulink 模型的帮助,该模型的数据来自结构中包含的 MATLAB 工作区。下面是我想做的一个非常简化的用例
用例:
我在 MATLAB 工作区中有一个名为 "data_in" 的结构,它有两个字段 x 和 y,它们是向量。我有一个 simulink 模型,其中有两个 Inports
名为 x 和 y。
这就是我想要的:
一个。从 Simlunk 模型中读取输入端口的名称。在这种情况下,它将是 x 和 y
b。以编程方式将数据从结构 - "data_in" 分配给 Simulink 模型中的端口 "x" 和 "y"。结构 "data_in" 包含两个向量 "x" 和 "y" 以映射到 Simulink Inports
上述用例是一个非常简化的场景。我打算使用的模型可以有 100 个输入端口,因此我不想使用 "From Workspace" 块,因为添加 100 个
对我来说是不切实际的
如何在Simulink 中处理这种情况。我只是 MATLAB 和 Simulink 的初学者。所以,详细的回答对我有很大帮助
如果我正确回答了你的问题,并且输入是时间变量,你可以使用 From Workspace
并通过 InitFcn
在 Callbacks
中调用你的初始化脚本。
假设您有一个名为 init_script
:
的初始化脚本
输入InitFcn
这个:init_script
;所以当您 运行 Simulink 时,该脚本首先是 运行。
假设这是您在 init_script
中的时间序列:
ts = timeseries(randn(10,2),'Name','TS');
将 ts 放入 From Workspace
:
但如果这些不是时变向量,则执行相同的操作并使用 constant
块,在其值字段中放入向量的名称,然后再次将包含这些向量的脚本放入 InitFcn
在 Callbacks
:
X = randi(10,6,1);
Y = randi(10,6,1);
然后做你需要的操作:
因此名为 simout 的 To Workspace 块将为您提供:
simout.Data(:,:,1)
ans =
14
9
16
16
10
3
最后,如果您有很多这样的向量和组件,您可以从 Matlab Workspace 轻松创建它们:
my_struct.x = randn(6,1);my_struct.y = randn(6,1);
new_system('myModel')
open_system('myModel')
pos = [10 10 20 30]
for i =1:10
add_block('built-in/Inport',['myModel' '/In1'],'Position',pos);
add_block('built-in/Constant',['myModel' strcat('/Cx', num2str(i))],'Position',pos+2);
add_block('built-in/Constant',['myModel' strcat('/Cy', num2str(i))],'Position',pos+i);
pos = pos + 1;
X_vector = my_st.x
set_param(strcat('myModel/Cx', num2str(i)),'Value', X_vector)
Y_vector = my_st.x
set_param(strcat('myModel/Cy', num2str(i)),'Value', Y_vector)
....
当然这个for循环代码是给大家看的,实际情况会更复杂,大家就知道怎么处理最好了。
我需要有关 运行 Simulink 模型的帮助,该模型的数据来自结构中包含的 MATLAB 工作区。下面是我想做的一个非常简化的用例
用例:
我在 MATLAB 工作区中有一个名为 "data_in" 的结构,它有两个字段 x 和 y,它们是向量。我有一个 simulink 模型,其中有两个 Inports
名为 x 和 y。
这就是我想要的:
一个。从 Simlunk 模型中读取输入端口的名称。在这种情况下,它将是 x 和 y
b。以编程方式将数据从结构 - "data_in" 分配给 Simulink 模型中的端口 "x" 和 "y"。结构 "data_in" 包含两个向量 "x" 和 "y" 以映射到 Simulink Inports
上述用例是一个非常简化的场景。我打算使用的模型可以有 100 个输入端口,因此我不想使用 "From Workspace" 块,因为添加 100 个
对我来说是不切实际的如何在Simulink 中处理这种情况。我只是 MATLAB 和 Simulink 的初学者。所以,详细的回答对我有很大帮助
如果我正确回答了你的问题,并且输入是时间变量,你可以使用 From Workspace
并通过 InitFcn
在 Callbacks
中调用你的初始化脚本。
假设您有一个名为 init_script
:
输入InitFcn
这个:init_script
;所以当您 运行 Simulink 时,该脚本首先是 运行。
假设这是您在 init_script
中的时间序列:
ts = timeseries(randn(10,2),'Name','TS');
将 ts 放入 From Workspace
:
但如果这些不是时变向量,则执行相同的操作并使用 constant
块,在其值字段中放入向量的名称,然后再次将包含这些向量的脚本放入 InitFcn
在 Callbacks
:
X = randi(10,6,1);
Y = randi(10,6,1);
然后做你需要的操作:
因此名为 simout 的 To Workspace 块将为您提供:
simout.Data(:,:,1)
ans =
14
9
16
16
10
3
最后,如果您有很多这样的向量和组件,您可以从 Matlab Workspace 轻松创建它们:
my_struct.x = randn(6,1);my_struct.y = randn(6,1);
new_system('myModel')
open_system('myModel')
pos = [10 10 20 30]
for i =1:10
add_block('built-in/Inport',['myModel' '/In1'],'Position',pos);
add_block('built-in/Constant',['myModel' strcat('/Cx', num2str(i))],'Position',pos+2);
add_block('built-in/Constant',['myModel' strcat('/Cy', num2str(i))],'Position',pos+i);
pos = pos + 1;
X_vector = my_st.x
set_param(strcat('myModel/Cx', num2str(i)),'Value', X_vector)
Y_vector = my_st.x
set_param(strcat('myModel/Cy', num2str(i)),'Value', Y_vector)
....
当然这个for循环代码是给大家看的,实际情况会更复杂,大家就知道怎么处理最好了。