未找到 (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.MultiBody
和 Modelica.Fluid
中所做的非常相似。在这两种情况下,都有一个 class 包含系统的所有 "global" 属性,分别称为 world
或 system
。
因此您的 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
中所示)。
我最近开始使用 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.MultiBody
和 Modelica.Fluid
中所做的非常相似。在这两种情况下,都有一个 class 包含系统的所有 "global" 属性,分别称为 world
或 system
。
因此您的 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
中所示)。