记录中的Modelica灵活数组大小 - 无法扩展

时间:2017-06-21 18:03:39

标签: arrays record modelica dymola openmodelica

我正在尝试使用所有者名称(String)和插值方法 smoothness (String)读取多个文件(csv,2列)。通过使用记录,我在Dymola中获得了一个很好的GUI: GUI

为了解释我的问题,这是一个简化的模型:

model Test_Strings
  parameter String x[:];
  parameter Integer k = size(x,1);
  Integer i;

initial algorithm 
  i := 0;
  Modelica.Utilities.Streams.print(String(i));
  Modelica.Utilities.Streams.print(String(k));

equation 

algorithm 
    when sample(1,1) then
      i :=pre(i) + 1;
      Modelica.Utilities.Streams.print(String(i));

      for j in 1:k loop
        Modelica.Utilities.Streams.print(x[j]);
      end for;
    end when;
end Test_Strings;

此GUI的内容如下所示: enter image description here

运行它的代码:

model Test_Strings_System
  Test_Strings test_Strings(x={"a","b","c","d"});
end Test_Strings_System;

这将在控制台中提供以下结果: enter image description here

现在,如果我尝试使用记录:

record MyRecord2
  parameter String name = "NoName";
end MyRecord2;

并调整模型(仅第一个参数行 MyRecord2 x [:] 并且在for循环中 x [j] .name 更改):

model Test_Strings2
  parameter MyRecord2 x[:];
  parameter Integer k = size(x,1);
  Integer i;

initial algorithm 
  i := 0;
  Modelica.Utilities.Streams.print(String(i));
  Modelica.Utilities.Streams.print(String(k));

equation 

algorithm 
  when sample(1,1) then
    i :=pre(i) + 1;
    Modelica.Utilities.Streams.print(String(i));

    for j in 1:k loop  // k must be fixed number if equation
      Modelica.Utilities.Streams.print(x[j].name); // j must be fixed number if algorithm
    end for;
  end when;
end Test_Strings2;

然后我收到翻译错误:内部错误:无法展开字符串。 enter image description here

如果我将for循环中的k或j固定为给定的数字(假设为3),那么它可以工作,但取决于它是否在算法或方程式部分内(参见代码中的注释)。

我有灵活的数组大小的类似问题,但仍然不明白如何解决它。 我必须使用功能吗? 如何使用根据外部数据定义的灵活数组大小,在模拟之前选择作为参数(例如表的长度)? 或者在这种情况下是其他地方的问题?

感谢。

1 个答案:

答案 0 :(得分:1)

您可以更改模型以将记录数组作为可见参数,但在内部使用字符串数组(使用Dymola 2017及更高版本测试):

model Test_Strings2
  parameter MyRecord2 x[:];
  parameter Integer k = size(x,1);
  Integer i;
protected
  parameter String s[:]=x.name; // Hack
initial algorithm 
  i := 0;
  Modelica.Utilities.Streams.print(String(i));
  Modelica.Utilities.Streams.print(String(k));

equation 

algorithm 
  when sample(1,1) then
    i :=pre(i) + 1;
    Modelica.Utilities.Streams.print(String(i));

    for j in 1:k loop  
      Modelica.Utilities.Streams.print(s[j]); 
    end for;
  end when;
end Test_Strings2;