【问题标题】:No corresponding inner declaration found for (Modelica inner/outer)找不到对应的内部声明(Modelica 内部/外部)
【发布时间】:2019-07-01 12:36:10
【问题描述】:

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

没有为组件 .Real 找到相应的“内部”声明 component.T0 声明为“外部”。现有的“内部”组件 是:.真实环境.T0;在范围内定义:Test.Ambient。检查是否 您没有拼错“外部”组件名称。请声明 在顶部范围内具有相同名称的“内部”组件。继续 通过仅考虑“外部”组件声明进行展平。

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

这些行下面的三个模型包含在一个名为 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 连接起来)

【问题讨论】:

    标签: modeling modelica openmodelica


    【解决方案1】:

    您的用例似乎与Modelica.Mechanics.MultiBodyModelica.Fluid 中所做的非常相似。在这两种情况下,都有一个包含系统所有“全局”属性的类,分别称为worldsystem

    因此,您的类 Ambient 应定义为 inner 类。然后通过outer 语句访问它以重用其中的值。使用您的代码时可能会从模型 within 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;
    

    一些cmets:

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

    【讨论】:

    • 非常感谢马库斯!我刚刚尝试了您修改后的代码,它运行良好。我现在意识到我必须添加“外部 Test.Ambient 环境”行,以便以后可以从环境调用属性,并通过内部关键字实例化模型。再次,非常感谢!很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2017-12-20
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多