Events Modelica中的最大事件迭代次数

Events Modelica中的最大事件迭代次数,events,iteration,modelica,dymola,Events,Iteration,Modelica,Dymola,有没有办法更改dymola中设置为20的“最大事件迭代次数”的值 似乎dymosim.ini不用于常规模拟(注意第4行中的版本:dymosim.ini状态为1.1,而dsin.txt中的1.4是用Dymola 2019编写的)。我也无法在Dymola中找到一个函数或变量来更改eviter,因此我能想到的唯一解决方案是在模拟之前编辑dsin.txt 下面的代码显示了更新dsin.txt然后执行模拟的函数的外观。请注意,应扩展该函数以进行错误处理 function MySim import Mo

有没有办法更改dymola中设置为20的“最大事件迭代次数”的值

似乎dymosim.ini不用于常规模拟(注意第4行中的版本:dymosim.ini状态为1.1,而dsin.txt中的1.4是用Dymola 2019编写的)。我也无法在Dymola中找到一个函数或变量来更改
eviter
,因此我能想到的唯一解决方案是在模拟之前编辑dsin.txt

下面的代码显示了更新dsin.txt然后执行模拟的函数的外观。请注意,应扩展该函数以进行错误处理

function MySim
  import Modelica.Utilities.Strings;
  import Modelica.Utilities.Streams;
  import Modelica.Utilities.Files.removeFile;
  import SimAPI = DymolaCommands.SimulatorAPI;

  input String m = "Modelica.Blocks.Examples.PID_Controller"
    annotation (Dialog(__Dymola_translatedModel(translate=false)));
  input Integer iterations = 40;
protected 
  String[:] dsin;
algorithm 
  // initialize
  removeFile("dsin_custom.txt");
  removeFile("dsin_export.txt");
  SimAPI.translateModel(m);
  SimAPI.exportInitialDsin("dsin_export.txt");  // exports simulation setup of active model

  // write custom dsin file
  dsin :=Streams.readFile("dsin_export.txt");
  for i in 1:size(dsin, 1) loop
    if Strings.find(dsin[i], " # eviter ") > 0 then
      dsin[i] :=Strings.replace(dsin[i], "20", String(iterations));
      break;
    end if;
  end for;
  for i in 1:size(dsin, 1) loop
    Streams.print(dsin[i], "dsin_custom.txt");
  end for;

  // simulate and open file
  // using simulateModel would generate a new dsin file, so dymosim.exe must be called
  SimAPI.system("dymosim.exe -s dsin_custom.txt "+m+".mat");
  // workaround: create empty plot to open result, as there is no load-result command
  DymolaCommands.Plot.createPlot(y={""}, grid=true, filename=m+".mat");
end MySim;
该函数转换选定的模型,导出模拟设置,根据需要进行编辑,执行模拟并打开结果文件,因此它基本上是一个自定义的simulateModel命令


使用Dymola用户手册第2卷7.2可扩展用户界面–菜单、工具栏和收藏夹中描述的功能,可以在Dymola GUI中创建该功能的快捷方式,从而允许对选定模型执行模拟。这将使该函数与常规模拟按钮一样方便使用。

因为Dymola 2020x有一个高级变量,它正好可以做到这一点

从2020x变更日志:

Advanced.Simulation.MaxEventIterations
evnet的最大数量 迭代,埃维特。小心使用,因为值太小会导致模拟失败。 默认值为
Advanced.Simulation.MaxEventIterations=20

此外,可以更改迭代的精度:

Advanced.Simulation.EventEpsilon
eveps事件的时间分辨率。这个 默认值为
Advanced.Simulation.EventEpsilon=1e-10


另外,我确实在
dymosim.ini
中更改了
eviter
,但是更改没有反映在
dsin.txt
中,我必须通过执行:
dymosim dsin.txt
再次运行模拟。我想知道如何使
eviter
直接在
dsin.txt
中更改,这样我就可以在Dymola中进行模拟,而不是通过执行
dymosim
再次进行模拟。它真的有助于更改最大迭代次数吗?如果是,你能发布模型吗?