【问题标题】:Modelica coding standards / new OpenModelica compiler frontendModelica 编码标准/新的 OpenModelica 编译器前端
【发布时间】:2020-04-05 20:20:26
【问题描述】:

新的 OpenModelica 编译器前端似乎存在问题。我在 windows-7 64bit 操作系统上使用 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;

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

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

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

【问题讨论】:

    标签: modelica openmodelica


    【解决方案1】:

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

    需要明确的是,您不能在此类中定义一个变量,然后以任何其他方式在扩展中使用它,而不是通过修改(以及通过内部/外部,通过重新声明为元素)。下面是一个例子,你不能在M1里面使用a

    package TestExtends
    
    model M1
      parameter Real b = a;
    end M1;
    
    model M2
      parameter Real a = 1;
      extends M1;
    end M2;
    
    end TestExtends;
    

    要根据 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;
    

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      相关资源
      最近更新 更多