在modelica

时间:2017-02-25 15:19:57

标签: arrays modelica

我需要一些帮助来初始化openmodelica中的数组。我创建了一个modelica类,它应该生成一个可变大小的数组。大小将被设置为参数并且是整数类型。以下是我想要做的一个例子。我一直收到错误消息,很乐意收到任何提示!感谢。

parameter Integer f_min;
parameter Integer f_max;
Integer Freq_steigerung;
Integer array_size;
Integer Freq[:];

equation
array_size = ceil((f_max-f_min)/Freq_steigerung);
Freq[array_size] = f_min: Freq_steigerung: f_max;

5 个答案:

答案 0 :(得分:5)

在Modelica中,运行时不能拥有可变大小的数组。 所有数组大小都需要在编译时知道,因此大小需要是参数或常量。

您可以拥有包含未知数组大小的组件的函数(或记录),但它们需要在调用时绑定(在编译期间仍然可以知道)。

这样的事情会起作用:

model T
  parameter Integer f_min;
  parameter Integer f_max;
  parameter Integer Freq_steigerung;
  parameter Integer array_size = integer(ceil((f_max-f_min)/Freq_steigerung));
  Integer Freq[array_size];
equation
  Freq = f_min: Freq_steigerung: f_max;
end T;

答案 1 :(得分:2)

在许多情况下,您可以使其更简单:

model T
  parameter Integer f_min;
  parameter Integer f_max;
  parameter Integer Freq_steigerung;
  Integer Freq[:]= f_min: Freq_steigerung: f_max;
end T;

答案 2 :(得分:1)

以下是有关使用functions时适用的未知数组大小的相关答案。

当原始数组的大小未知时,可以使用size命令,但变量需要该信息才能实例化。这种用法如下所示。

function test
    input Real[:] x1;
    input Real[size(x1,1)] x2;

    output Real[size(x1,1)] y;
algorithm
    y = x1.*x2;
end test;

答案 3 :(得分:1)

也可以仅在function的算法部分确定数组的大小。在这里,您甚至不必显式给出数组的大小。

请参阅下面的用法。

function T
  input Integer f_min;
  input Integer f_max;
  input Integer Freq_steigerung;
  output Integer Freq[:];

algorithm 
  Freq := f_min:Freq_steigerung:f_max;
end T;

答案 4 :(得分:1)

如果在模型中使用了它,则必须创建一个函数来计算输出的大小,并将其作为T函数的输入(或至少在使用Dymola时):

请参阅:

package TestT
  function T
  input Integer f_min;
  input Integer f_max;
  input Integer Freq_steigerung;
  input Integer n;
  output Integer Frew[n];
  algorithm 
  Frew := f_min:Freq_steigerung:f_max;
  end T;

  function Tc
  input Integer f_min;
  input Integer f_max;
  input Integer Freq_steigerung;
  output Integer n;
  algorithm 
    n :=size(f_min:Freq_steigerung:f_max, 1);
  end Tc;

  model Test
    parameter Integer n = TestT.Tc(1,3,1);
    Real a[n] = TestT.T(1,3,1,n);
  end Test;
end TestT;