在没有 post 处理的情况下导出 MAT 文件中的 Modelica 变量

Export Modelica variables in MAT files with no post-processing

这里的目的是:

Modelica.Utilities.Streams.writeRealMatrix 实用程序是我最初想到的,但我无法使 append 参数正常工作。

这是我尝试过的:

model WriteRealMatrixToFileTest
  discrete Boolean success;
  discrete Real time_pre(start=0, fixed=true);

equation 
  when sample(0,0.1) then
    success = Modelica.Utilities.Streams.writeRealMatrix("OutMat.mat", "OutMat", {{time, sin(time)}}, append=true, format="4");
    Modelica.Utilities.Streams.print("Printing status at time " + String(time) + ": " + String(success));
    time_pre = time;
  end when;
end WriteRealMatrixToFileTest;

但是,即使它总是 return 成功,即使每 0.1 秒正确调用一次命令,在 MAT 文件中我也只是找到最后一个值(例如 {10, -0.544} if停止时间=10).

一个选项是读回 MAT 文件,将新的一组值追加到矩阵中,然后再次将它们重新写回,但这对我来说真的很难听。还有其他方法吗? 因为我不能声明一个动态大小的矩阵,所以我想不出其他的选择。

append 参数有效,但它的行为与您预期的不同。 writeRealMatrix 将变量附加到给定的 .mat 文件,但它不会将值附加到该文件内的现有矩阵。如果存在具有此名称的变量,它将被覆盖。

想法是:

  • 通过 Modelica.Utilities.Streams.print 将结果连续写入 .txt 文件,自动附加到现有文件
  • 在模拟结束时读取 .txt 内容并将其与 writeRealMatrix 一起作为 .mat 文件存储在 when terminal() 部分

可能是这样的:

model WriteRealMatrixToFileTest
  import Modelica.Utilities.Streams;
  import Modelica.Utilities.Strings;

  Boolean success(start=false);

  parameter String tmpFile = "OutMat.txt";
  parameter String outFile = "OutMat.mat";

protected 
  function txt2mat "Convert txt file to mat file"
    input String inFile;
    input String outFile;
    output Boolean success;

  protected 
    String[:] lines;
    Integer nlines;
    Real t[:], v[:];
    Integer pos "Start position of value at current line";

  algorithm 
    lines :=Streams.readFile(inFile);
    nlines :=size(lines, 1);
    t :=fill(0, nlines); // we have to initialize t and v with the correct size
    v :=fill(0, nlines); // so we can later use t[i] and v[i]

    for i in 1:nlines loop
      t[i] :=Strings.scanReal(lines[i], 1);
      pos :=Strings.find(lines[i], ";")+1; // get delimiter position to scan v
      v[i] :=Strings.scanReal(lines[i], pos);
    end for;

    success :=Streams.writeRealMatrix(outFile,"OutMat",{t,v},format="4");
  end txt2mat;


equation 
  when initial() then
    Modelica.Utilities.Files.removeFile(tmpFile);
  end when;

  when sample(0,0.1) then
    Streams.print(String(time)+";"+String(sin(time)), fileName=tmpFile);
  end when;

  when terminal() then
    success = txt2mat(tmpFile, outFile);
  end when;
end WriteRealMatrixToFileTest;