【问题标题】:Modelica flexible array size within record - failed to expand记录内的 Modelica 灵活数组大小 - 无法扩展
【发布时间】:2017-06-21 18:03:38
【问题描述】:

我正在尝试使用所属名称(字符串)和插值方法平滑度(字符串)读取多个文件(csv,2 列)。通过使用记录,我在 Dymola 中获得了一个不错的 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 如下所示:

运行它的代码:

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

这将在控制台中给出以下结果:

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

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;

然后我得到一个翻译错误:内部错误:未能扩展字符串。

如果我将 for 循环中的 k 或 j 固定为给定的数字(比如说 3),那么它会起作用,但取决于它是否在算法或方程部分(参见代码中的 cmets)。

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

谢谢。

【问题讨论】:

    标签: arrays record modelica dymola openmodelica


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-09
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多