未找到 (Modelica inner/outer) 的相应内部声明

No corresponding inner declaration found for (Modelica inner/outer)

我最近开始使用 Modelica (OpenModelica) 作为建模工具,但我在使用 inner/outer 功能时遇到了问题。我正在尝试创建一个包含环境温度和压力值的环境模型,以便其他模型可以使用该值。我尝试使用 inner 和 outer 关键字这样做,但我不断收到以下警告:

No corresponding 'inner' declaration found for component .Real component.T0 declared as 'outer '. The existing 'inner' components are: .Real ambient.T0; defined in scope: Test.Ambient. Check if you have not misspelled the 'outer' component name. Please declare an 'inner' component with the same name in the top scope. Continuing flattening by only considering the 'outer' component declaration.

在这些行下方,您可以看到我正在尝试的代码的简化。

这些行下面的三个模型包含在名为 Test 的包中。

温度 T0 定义为内部的环境模型:

within Test;

    model Ambient

        inner Real T0;

        equation
            T0 = 300;

end Ambient;

尝试通过外部运算符调用 T0 的组件模型:

within Test;

model Component

    Real T;
    outer Real T0;
    parameter Real k = 2;

    equation
        T = k * time + T0;

end Component;

模型环境和组件都被拖放到组合模型中:

within Test;

model System
  Test.Ambient ambient annotation(
    Placement(visible = true, transformation(origin = {-30, 30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Test.Component component annotation(
    Placement(visible = true, transformation(origin = {30, -10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation

end System;

当 运行 系统我收到上述警告。此外,还有一个变量多于方程式(这是有道理的,因为它无法将 Component.T0 与 Ambient T0 连接起来)

您的 use-case 看起来与 Modelica.Mechanics.MultiBodyModelica.Fluid 中所做的非常相似。在这两种情况下,都有一个 class 包含系统的所有 "global" 属性,分别称为 worldsystem

因此您的 class Ambient 应该定义为 inner class。然后通过 outer 语句从中获取 re-use 值。使用您的代码时,可以从 Ambient 中的模型访问 T0。从您的示例代码来看,这不是您想要的...

将 MSL 中使用的技术应用于您的示例,将产生以下代码:

package Test
model Ambient
    inner Real T0;
  equation
    T0 = 300;
    annotation(defaultComponentPrefixes="inner");
end Ambient;

model Component
    Real T;
    Real T0 = ambient.T0;
    parameter Real k = 2;
  protected
    outer Test.Ambient ambient;
  equation
    T = k * time + T0;
end Component;

model System
  inner Test.Ambient ambient;
  Test.Component component;   
end System;

end Test;

一些评论:

  • 使用外部语句访问变量是在模型的 protected 部分完成的,只是为了防止在结果中多次出现相同的变量。
  • defaultComponentPrefixes 注释确保模型具有前缀 inner,以防创建图形实例(如模型 System 中所示)。