首页 文章

Modelica灵活的数组大小 - 错误:无法扩展变量

提问于
浏览
0

在Modelica中使用具有未定义大小的数组时,我仍然遇到问题 .
理解底层问题是非常有帮助的 . 我读了很多东西(在编译时已知大小,函数,构造函数和析构函数,记录等),但我仍然不确定在Modelica中使用灵活数组的正确方法是什么 .
有人可以给出一个很好的解释,也许使用下面的例子?

鉴于数据:

x  y
1  7
2  1
3  1
4  7

Modelica模型工作正常:

model Test_FixedMatrix

  parameter Real A[4,2] = [1,7;2,1;3,1;4,7];
  parameter Integer nA = size(A,1);
  parameter Integer iA[:] = Modelica.Math.BooleanVectors.index( {A[i,2] == 1 for i in 1:nA});
  parameter Real Aslice[:,:] = A[iA,:];

end Test_FixedMatrix;

数组iA [:]给出y = 1的所有行的索引,并且Aslice [:,]包括一个矩阵中的所有这些行 .

现在,我想要从文件中读取数据,而不是使用给定的矩阵 . 使用Modelica库ExternData(https://github.com/tbeu/ExternData)可以从xlsx文件中读取数据:

model Test_MatrixFromFile

  ExternData.XLSXFile xlsxfile(fileName="data/ExampleData.xlsx");
  parameter Real B[:,:] = xlsxfile.getRealArray2D("A2","Tabelle1",4,2);
  parameter Integer nB = size(B,1);
  parameter Integer iB[:] = Modelica.Math.BooleanVectors.index( {B[i,2] == 1 for i in 1:nB});
  parameter Real Bslice[:,:] = B[iB,:];

end Test_MatrixFromFile;

xlsx文件如下所示:

enter image description here

这是完全相同的代码,但这次我收到错误消息:
enter image description here

(如果我用iB和Bsliece删除两行然后它可以工作,所以问题不是xlsxfile.getRealArray2D函数)

Application example and further questions:
能够将数据文件读入Modelica然后直接在Modelica代码中准备数据而不使用任何其他软件将是非常好的 . 当然,我可以使用例如数据准备所有数据 . 一个Python脚本,然后使用TimeTable组件...但有时这不是很舒服 .
有没有另一种方法来读取数据(txt或csv)而不指定其中的表的大小?
如果我想从不同的文件读入数据,例如,它会是什么样的?每10秒钟?
我还在Modelica.Utilities.Streams中找到了Modelica函数readFile和countLines . 是否可能只使用外部功能来做到这一点?

1 回答

  • 0

    我假设基本问题是 Modelica.Math.BooleanVectors.index 返回一个可变大小的向量 . 大小取决于函数的输入,在给定的情况下是xlsx文件 . 因此 iB 的大小取决于xlsx文件的内容,该文件可以独立于模型本身进行更改 . 因此,您最初声明"known size at compile time"的问题是有问题的,因为iB的大小取决于非参数 .

    我从Dymola的经验中学到的另一件事是,如果像 ExternData.XLSXFile 这样的函数在使用之前被翻译,它的行为会有所不同 . 这意味着您需要在Dymola中打开该功能(在包浏览器中双击它)并按下翻译按钮(或F9) . 这将在您的工作目录中生成相应的.exe文件,并使Dymola在函数的输出中更多"confident",而不是变量 . 我没有详细说明,但值得一试 .

相关问题