将来自 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 并通过 InitFcnCallbacks 中调用你的初始化脚本。

假设您有一个名为 init_script:

的初始化脚本

输入InitFcn这个:init_script;所以当您 运行 Simulink 时,该脚本首先是 运行。

假设这是您在 init_script 中的时间序列:

ts = timeseries(randn(10,2),'Name','TS');

将 ts 放入 From Workspace:

但如果这些不是时变向量,则执行相同的操作并使用 constant 块,在其值字段中放入向量的名称,然后再次将包含这些向量的脚本放入 InitFcnCallbacks:

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循环代码是给大家看的,实际情况会更复杂,大家就知道怎么处理最好了。