Arrays 如何将模拟结果的多个变量导出到csv?

Arrays 如何将模拟结果的多个变量导出到csv?,arrays,for-loop,export-to-csv,dymola,Arrays,For Loop,Export To Csv,Dymola,我正在尝试通过csv文件将我的结果从Dymola导出到excel。但我有很多结果。如何将它们写入数组 我试图创建一个for循环,但我缺乏如何键入代码的知识 if (time) <= 0 then Modelica.Utilities.Files.removeFile("tube_0.02"+".csv"); Modelica.Utilities.Streams.print("temps," + "delta_fr1,"+ "delta_fr2,"+

我正在尝试通过csv文件将我的结果从Dymola导出到excel。但我有很多结果。如何将它们写入数组

我试图创建一个for循环,但我缺乏如何键入代码的知识

if (time) <= 0 then
   Modelica.Utilities.Files.removeFile("tube_0.02"+".csv");
   Modelica.Utilities.Streams.print("temps," +
      "delta_fr1,"+
      "delta_fr2,"+
      "delta_fr3,",
    "tube_0.02"+".csv");
 else

 Modelica.Utilities.Streams.print(String(time) +
   "," + String(   my_code_tube1[1].delta_fr)+
   "," + String(   my_code_tube1[2].delta_fr)+
   "," + String(   my_code_tube1[3].delta_fr),
     "tube_0.02"+".csv");

 end if;

if(time)在模拟过程中尝试将结果写入csv文件会在Modelica中遇到一些问题:

  • 您希望为哪些时间步写入结果?无法使用解算器步长。 但是我们可以使用
    sample()
    函数定义周期性输出

  • 打电话给印刷公司是相当昂贵的。您不希望在模拟运行时多次这样做

  • print函数总是在每次调用后添加换行符。这要求我们一次写每一行(但由于前面提到的性能限制,我们无论如何都应该一次写尽可能多的文本)。 不幸的是,Dymola的默认最大字符串大小非常小,限制在500。 您必须通过设置例如
    Advanced.MaxStringLength=50000
    ,确保当前Dymola实例正在使用适当的大值

考虑到这些因素,我们可以得出如下代码:

model SO_print_for
  My_code_tube my_code_tube1[1500];

protected 
  String line;
  String f="tube_0.02" + ".csv";

  model My_code_tube
    Real delta_fr=1;
  end My_code_tube;

initial algorithm 
  line := "temps";
  for i in 1:size(my_code_tube1,1) loop
    line := line + ", delta_fr" + String(i);
  end for;
  Modelica.Utilities.Files.removeFile(f);
  Modelica.Utilities.Streams.print(line, f);

algorithm 
  when sample(0, 0.1) then
    line := String(time);
    for i in 1:size(my_code_tube1,1) loop
      line := line + ", "+String(my_code_tube1[i].delta_fr);
    end for;
    Modelica.Utilities.Streams.print(line, f);
  end when;

end SO_print_for;
代码可以工作,但会减慢模拟速度,因为生成了很多时间事件(从
sample()
函数)

<> P>在模拟过程中,不要编写CSV,在模拟完成后,应考虑下列方法之一来转换结果文件:

  • 使用Dymola变量浏览器中的导出结果将所有或仅打印的变量导出到csv中。这必须在每次模拟后手动完成,并且不能涂鸦

  • 使用函数
    DataFiles.convertMATtoCSV
    。以下两行代码将从.mat结果文件中提取1500个变量

  • 使用Matlab、Octave或FreeMat打开.mat结果文件,并将其转换为Excel能够理解的文件格式。 Dymola提供了
    dymload.m
    将.mat结果文件导入Matlab。有关详细信息,请参阅Dymola的用户手册第1卷

  • 使用python将结果转换为csv文件,例如,使用包或,两者都可以用于读取结果文件


谢谢您的回答。我在print函数中添加了时间变量。我会试试你的方法,谢谢。实际上,有两种方法可以从Dymola编写CSV导出脚本。其中一个涉及readTraction(或类似)和DataFiles.writeCSVmatrix的组合,另一个是$%Dymola%\bin\alist-e var1 dsres.mat res.csvThanks Hans。我已经包括了DataFiles变量。对于这么多的变量来说,列表可能不是一个好的选择。
    vars = {"my_code_tube1["+String(i)+"].delta_fr" for i in 1:1500}
    DataFiles.convertMATtoCSV("your-model.mat", vars, "out.csv")