Modelica 编码标准/新的 OpenModelica 编译器前端

pri*_*ims 2 modelica openmodelica

看起来像是新 OpenModelica 编译器前端的问题。我在 windows-7 64 位操作系统上使用 openmodelica 1.14 的官方发布版本。

package Test1_14
  model M1
    parameter Integer size = 2 "matrix size";
    parameter Real A[size] = {1.0, 1.0};
    Real B[size];
    Real T = 1;
    Real P = 2;
  equation
    B = A * (T/P);
  end M1;

  model M1_Extn
    Real C[size];
    Real D[size];
  equation
    for J in 1:size loop
      C[J] = Func1(T);
      D[J] = C[J] / P;
    end for;
  end M1_Extn;

  function Func1
    input Real a;
    output Real b;
  algorithm
  b := a*a;
  end Func1;

  model M1_Combined
    parameter Integer size = 2 "matrix size";
    Real B[size];
    Real T = 1;
    Real P = 2;
    extends M1_Extn;
  equation
    B = D;
  end M1_Combined;
end Test1_14;
Run Code Online (Sandbox Code Playgroud)

当我编译模型“ M1_Combined”时,新的 OpenModelica 编译器前端的代码生成失败。导出 FMU 也失败并出现相同的错误。

我的代码是否符合 Modelica 编程标准?

如何在模型 M1_Extn 中声明变量 - size、T、P 并extends在 ' M1_Combined' 中仍然使用关键字' ' ?

Adr*_*Pop 7

这是因为根据 Modelica 规范,旧的前端没有正确处理“扩展”。新的前端正确地做到了。

需要明确的是,你不能在这个类中定义一个变量,然后在扩展中使用它,而不是通过修改(以及通过内部/外部,通过重新声明为元素)。下面是一个示例,您不能使用ainside M1

package TestExtends

model M1
  parameter Real b = a;
end M1;

model M2
  parameter Real a = 1;
  extends M1;
end M2;

end TestExtends;
Run Code Online (Sandbox Code Playgroud)

要修复您的模型,使其符合 Modelica 标准,您可以执行以下操作:

package Test1_14
  model M1
    parameter Integer size = 2 "matrix size";
    parameter Real A[size] = {1.0, 1.0};
    Real B[size];
    Real T = 1;
    Real P = 2;
  equation
    B = A * (T/P);
  end M1;

  model M1_Extn
    parameter Integer size = 2;
    Real T = 1;
    Real P = 2;
    Real C[size];
    Real D[size];
  equation
    for J in 1:size loop
      C[J] = Func1(T);
      D[J] = C[J] / P;
    end for;
  end M1_Extn;

  function Func1
    input Real a;
    output Real b;
  algorithm
  b := a*a;
  end Func1;

  model M1_Combined
    extends M1_Extn(size=2, T = 1, P = 2);
    Real B[size]; // this one works as you can use things defined in extends.
  equation
    B = D;
  end M1_Combined;
end Test1_14;
Run Code Online (Sandbox Code Playgroud)