【问题标题】:MATLAB Invalid Simulink object name, parfor and load_systemMATLAB Simulink 对象名称、parfor 和 load_system 无效
【发布时间】:2015-06-29 08:15:17
【问题描述】:

我尝试使用parfor 命令循环运行模型。

于是我写了如下代码:

% control_model.m
warning('off', 'Simulink:Engine:UsingDefaultMaxStepSize');
apool = gcp('nocreate');
if isempty(apool)
    apool = parpool('local');
end

load_system('mymodel');

tic
parfor w=1:10
    warning('off', 'Simulink:Engine:UsingDefaultMaxStepSize');
    w_str=num2str(w);
    set_param('mymodel/mysystem','sys', ['tf(',w_str,',[1 ',w_str,'])'] )
    sim('mymodel',[],[])
    drawnow
end
toc

close_system('mymodel',0);
% delete(poolobj)

然后我会得到以下错误:

使用 control_model 时出错(第 11 行)

无效的 Simulink 对象名称:mymodel/mysystem

如果我再次运行它,我会得到同样的错误(尽管使用for 而不是parfor 可以解决这个错误)。

但如果我在parfor 后面加上load_system('mymodel'); 并运行一次,问题就解决了。即使我删除了load_system 命令,下一次也不会显示错误。

我有兴趣了解幕后发生的事情,以及为什么即使我多次运行程序,第一个 load_system 也无法解决问题。而parfor 中的那个即使在下次调用脚本时被删除也能解决问题?

【问题讨论】:

    标签: matlab parallel-processing simulink parfor


    【解决方案1】:

    我认为您需要在工作器上加载模型(有关更多详细信息,请参阅文档中的 sim in parfor with Normal Mode),因此您的 load_system 需要在 parfor 循环内:

    tic
    parfor w=1:10
        load_system('mymodel');
        warning('off', 'Simulink:Engine:UsingDefaultMaxStepSize');
        w_str=num2str(w);
        set_param('mymodel/mysystem','sys', ['tf(',w_str,',[1 ',w_str,'])'] )
        sim('mymodel',[],[])
        drawnow
    end
    toc
    

    【讨论】:

    • 问题是为什么下一次即使没有load_system也能正常工作
    • @ar2015 很难回答这个问题,但我怀疑一旦模型加载到工作器上一次,它就会保持加载以进行后续迭代(当然,除非它被加载另一个模型或关闭加载的模型覆盖一)。确保每次迭代都正确加载模型的答案仍然是将load_system 放在parfor 中。
    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多