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

时间:2017-06-27 09:53:17

标签: arrays modelica dymola openmodelica

在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 [:,:] 在一个矩阵中包含所有这些行。< / p>

现在我没有使用给定的矩阵,而是想从文件中读取数据。使用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函数)

应用示例和进一步的问题:
能够将数据文件读入Modelica然后直接在Modelica代码中准备数据而不使用任何其他软件将是非常好的。当然,我可以使用例如数据准备所有数据。一个Python脚本,然后使用TimeTable组件...但有时这不太舒服 是否有其他方法可以读取数据(txt或csv)而不指定其中表格的大小?
如果我想从不同的文件读入数据,例如,它会是什么样的?每10秒钟一次? 我还在 Modelica.Utilities.Streams 中找到了Modelica函数 readFile countLines 。是否可能只能使用外部函数来执行此操作?

1 个答案:

答案 0 :(得分:0)

我认为基本问题是,Modelica.Math.BooleanVectors.index返回一个可变大小的向量。大小取决于函数的输入,在给定的情况下是xlsx文件。因此,iB的大小取决于xlsx文件的内容,该文件可以独立于模型本身而更改。因此,您最初声明“编译时已知大小”的问题是有问题的,因为iB的大小取决于非参数。

我从Dymola的经验中学到的另一件事是,如果ExternData.XLSXFile之类的函数在使用前被翻译,它的行为会有所不同。这意味着您需要在Dymola中打开该功能(在包浏览器中双击它)并按下翻译按钮(或F9)。这将在您的工作目录中生成相应的.exe文件,并使Dymola在函数输出中更加“自信”,而不是变量。我不知道实现的细节,因此无法给出确切的细节,但值得一试。