【问题标题】:Redeclare model with "outer" parameters使用“外部”参数重新声明模型
【发布时间】:2021-11-15 14:43:51
【问题描述】:

我尝试重新声明包含全局(外部)参数的模型。这是我的代码的简单示例:

package tests

model M0
  inner parameter Real a = 1;
end M0;
 
model M1
  extends tests.M0;
  replaceable tests.M3 c;
end M1;

model M2
  outer constant Real a;
end M2;

model M3
  extends tests.M2;
  Real b;
equation
  b = a;
end M3;

model M4
  extends tests.M2;
  Real b2;
  equation
  b2 = a;
end M4;


model test1
  tests.M1 X;
end test1;

model test2
  tests.M1 X(redeclare each tests.M4 c);
end test2;


end tests;

Test1 工作正常,但使用 test2 我有警告 An inner declaration for outer component a could not be found and was automatically generated. 没有“内部/外部”一切正常。 即使 M3 和型号 M4 具有相同的代码,也会出现警告

model M3 // and M4
  outer constant Real a;
  Real b;
  equation
  b = a;
end M3;

或者如果重新声明相同的模型

model test3
  tests.M1 X(redeclare tests.M3 c);
end test3;

我正在使用 OM 1.18

【问题讨论】:

    标签: modelica openmodelica


    【解决方案1】:

    问题似乎是b 是在M3 中定义的,而不是在M4 中定义的。修改M4

    model M4
      extends tests.M2;
      Real b, b2;
    equation 
      b = a;
      b2 = a;
    end M4;
    

    model M4
      extends tests.M2;
      Real b;
    equation 
      b = a;
    end M4;
    

    删除 Dymola 中的相应警告。

    这归结为plug-compatibility,在此示例中意味着M3 中的每个公共变量也必须存在于M4 中。

    由于插件兼容性仅指公共变量,在M3 中定义要保护的 b 也应该可以解决问题:

    model M3
      extends tests.M2;
    protected 
      Real b;
    equation 
      b = a;
    end M3;
    

    注意:我没有用 OpenModelica 测试它...

    【讨论】:

    • 感谢您的回答,但即使 M3 和型号 M4 的代码相同,也会出现警告。我更正了我的问题。
    【解决方案2】:

    您的代码可以在 Dymola 中运行,即使存在一个问题:

    M0 中,您将a 声明为parameter

    inner parameter Real a = 1;
    

    但是在M2 你正在寻找一个常数

    outer constant Real a;
    

    这两个工具都不太关心这个事实,这看起来很奇怪。

    在 OpenModelica 中,我猜你遇到了一个错误。您以不常见的方式使用内部/外部。将您的设置更改为使用在顶级组件(现在名为 World)中定义的内部变量的更常见的样式:

    package tests
    
    model World
      inner parameter Real a = 1;
    end World;
    
    model M1
      replaceable tests.M3 c;
    end M1;
    
    model M2
      outer World w;
      parameter Real a = w.a;
    end M2;
    
    model M3
      extends tests.M2;
      Real b;
    equation 
      b = a;
    end M3;
    
    model M4
      extends tests.M2;
      Real b2;
    equation 
      b2 = a;
    end M4;
    
    model test1
      inner World w;
      tests.M1 X;
    end test1;
    
    model test2
      inner World w;
      tests.M1 X(redeclare each tests.M4 c);
    end test2;
    
    end tests;
    

    【讨论】:

    • 谢谢。我有 2 或 3 年前运行良好的大型模型(在 OpenModelica 中)。模型包括具有内部参数的可替换模型。我同意这不是很好的风格,我不应该使用这种方法。但我不想重写它。
    • 因为它以前有效并且在 Dymola 中有效,所以我将在 github.com/OpenModelica/OpenModelica/issues 上创建一个错误报告
    • 你对inner/outer的使用确实比较常见。但是@Tyomich 的代码仍然是可能的,因为 test2.X.a (内部)在层次上高于 test2.X.c.a (外部),因此它们是同一个变量。参照。 Modelica 语言规范 3.5 第 5.4 节中的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多