matlab dymola连接在一段时间后失败
我有一个.mat文件中的实验数据和一个用dymola编写的模型。我使用dymolaM.m文件将命令从matlab发送到dymola。这样,我就可以使用matlab优化模型的一个参数。Matlab读取.mat文件中的数据,以正确的方式初始化dymola,让dymola模拟模型,读取dymola的输出,并将其与实验数据进行比较 对于wile来说,这一切都很好,但是如果我重复太多matlab dymola连接,我总是会得到以下错误:matlab dymola连接在一段时间后失败,matlab,dymola,Matlab,Dymola,我有一个.mat文件中的实验数据和一个用dymola编写的模型。我使用dymolaM.m文件将命令从matlab发送到dymola。这样,我就可以使用matlab优化模型的一个参数。Matlab读取.mat文件中的数据,以正确的方式初始化dymola,让dymola模拟模型,读取dymola的输出,并将其与实验数据进行比较 对于wile来说,这一切都很好,但是如果我重复太多matlab dymola连接,我总是会得到以下错误: ??? Error using ==> ddeexec
??? Error using ==> ddeexec
The first argument 'channel' is not valid.
Error in ==> dymolaM at 59
status = ddeexec(DymolaChannel, deblank(command(i,:)), '', timeout);
我试着重复完全相同的命令200次。我总是在迭代26时得到错误
我该怎么办?这是dymolaM.m文件的代码
function res=dymolaM(command, value)
% Executes a command optionally followed by a value in Dymola.
% Dymola is started if not already running.
% Version 1.0, 1997-11-14
% Version 1.1, 1999-06-12
% Copyright (C) 1997-2001 Dynasim AB.
% All rights reserved.
DymolaChannel = ddeinit('dymola', ' ');
if DymolaChannel == 0,
pause(1);
DymolaChannel = ddeinit('dymola', ' ');
if DymolaChannel == 0,
dymola = getenv('DYMOLA');
v=version;
if (isempty(dymola) & v(1,1)>='5')
if v(1,1)>='7'
[st,I]=dbstack('-completenames');
else
[st,I]=dbstack;
end
if v(1,1)>='7'
currentfile=st(I).file;
else
currentfile=st(I).name;
end
I=find(currentfile=='\' | currentfile=='/');
currentfile=currentfile(1:(max([1,I(1:end-1)])-1));
dymola=currentfile;
end
if ~isempty(dymola)
dymola=[dymola,'\bin\'];
end
disp('Starting Dymola - Wait');
fquote = '';
if strcmp(computer, 'PCWIN') | strcmp(computer, 'PCWIN64')
fquote = '"';
end;
dos([fquote,dymola,'Dymola',fquote,' &']);
pause(10);
DymolaChannel = ddeinit('dymola', ' ');
disp('Dymola started');
else
disp('Worked around problem communicating with Dymola');
end
end
if nargout>0
res=zeros(size(command,1),1);
end
if DymolaChannel == 0,
disp('Error starting Dymola');
elseif nargin > 0,
for i=1:size(command,1)
timeout=4000*1000; % Can always kill dymola
if nargin == 1,
status = ddeexec(DymolaChannel, deblank(command(i,:)), '', timeout);
elseif nargin == 2,
status = ddeexec(DymolaChannel, [deblank(command(i,:)), num2str(value(i))], '', timeout);
end
if nargout==0
if status == 0,
error('Invalid Dymola command.');
end
else
res(i)=status;
end;
end
ddeterm(DymolaChannel);
end
好的,这个问题已经存在四年了,但在最终得到这个解决方案之前,我刚刚花了两周时间使用了不令人满意的变通方法 我用以下策略解决了这个问题: 我用自己的修改版本重载了函数dymolaM.m。 我注释掉了命令:
DymolaChannel = ddeinit('dymola', ' ');
并将其替换为:
% DymolaChannel = ddeinit('dymola', ' ');
DymolaChannel = get_dymola_channel();
我定义了函数get_dymola_channel()代码>如下所示:
function DymolaChannel = get_dymola_channel()
persistent dymola_channel_persistent
if isempty(dymola_channel_persistent)
dymola_channel_persistent = ddeinit('dymola', ' ');
end
DymolaChannel = dymola_channel_persistent;
end
这意味着函数ddeinit
(只能创建有限数量的通道)只调用一次。我对DDE连接的体验好坏参半。如果您愿意投入一些时间,您可以尝试一种不同(可能更稳定)的方法,并将您的模型导出为FMU。然后,您可以从Python(使用开源工具pyFMI,JModelica.org的一部分)或Matlab(使用商业FMI toolboox)或许多其他工具与FMU交互,请参阅本文介绍的FMI/FMU背后的思想:还可以在此查看FMI相关问题,因此: