Modelica 中的温差量未按预期运行

Temperature difference quantities in Modelica not functioning as expected

我正在尝试获取温差量,以便在以非绝对温标显示时报告正确的结果。请参阅以下示例:

model tempDiffTest
  Modelica.Blocks.Interfaces.RealOutput test1(quantity="ThermodynamicTemperature", unit="K") = 1 annotation(absoluteValue=false);
  Real test2(quantity="ThermodynamicTemperature", unit="K") = 2 annotation(absoluteValue=false);
  Modelica.SIunits.TemperatureDifference test3 = 3;
end tempDiffTest;

注意

type TemperatureDifference = Real (
    final quantity="ThermodynamicTemperature",
    final unit="K") annotation(absoluteValue=false);

这是促使我对 test1 和 test2 变量进行修改的原因。

现在,期望的是当我以摄氏度显示我的结果时,对于 test1、test2 和 test3,它们应该分别为 1、2 和 3。实际结果如下所示,来自 Dymola:

因此,只有 test3 显然是成功的(请注意 none 结果在 OpenModelica 中是成功的)。现在,我的问题是如何实现我对 test1 和 test2 的要求?

来自Modelica Language Specification

A simple type or component of a simple type may have:

annotation(absoluteValue=false);

If false, then the variable defines a relative quantity, and if true an absolute quantity. [When converting between units (in the user-interface for plotting and entering parameters), the offset must be ignored, for a variable defined with annotation absoluteValue = false. This annotation is used in the Modelica Standard Library for example in Modelica.SIunits for the type definition TemperatureDifference.]

因此,注释仅在从实际 unit 转换为具有为该操作定义的偏移量的 displayUnit 时才会有所不同。如果添加了 annotation(absoluteValue=false),则会忽略偏移量。这对于温度差异是有意义的,因为它是相同的数字,例如。摄氏度或开尔文。

关于您的代码:它的作用是将开尔文温度分配给 test1test2,然后以 °C 显示。因此显示的内容是正确的。

为此,重要的是要知道在 Modelica 中值总是以变量所具有的单位分配,在您的情况下是开尔文。然后将其重新计算为摄氏度以在 UI 中显示。您需要分配 274.15K 才能获得 1°C。由于这是一个非常常见的重新计算,因此在 MSL 中有一个函数:Modelica.SIunits.Conversions.from_degC

所以我建议将您的代码修改为:

model tempDiffTest
  import Modelica.SIunits.Conversions.from_degC;

  Modelica.Blocks.Interfaces.RealOutput test1(quantity="Temperature", unit="K", displayUnit="degC") = from_degC(1);
  Modelica.SIunits.Temperature test2 = from_degC(2) annotation(absoluteValue=false);
  Modelica.SIunits.TemperatureDifference test3 = 3;
  Modelica.SIunits.TemperatureDifference test4 = test1-test2;

end tempDiffTest;

这导致:

Dymola 不支持在 test1test2 的声明中使用 absoluteValue 注释。

如果您使用

在 Dymola 中启用注释检查
Advanced.EnableAnnotationCheck=true

检查期间 Dymola 报告

In class tempDiffTest component test1, the annotation 'absoluteValue' is unknown.

查看 Modelica 规范,我们注意到它告诉

A simple type or component of a simple type may have: annotation(absoluteValue=false);

在我看来,这有点含糊,您的代码应该可以工作(因为 test2 是预定义类型 Real 的一个组件)。但 Dymola 仅在 class 定义中接受注释。

因此,要解决您的问题,您只需声明一个连接器和一个类型即可使用此注释。

package tempDiffTest
  connector Test1 = Modelica.Blocks.Interfaces.RealOutput (quantity="ThermodynamicTemperature", unit="K") annotation(absoluteValue=false);
  type Test2 = Real(quantity="ThermodynamicTemperature", unit="K") annotation(absoluteValue=false);

  model Example
    Test1 test1 = 1;
    Test2 test2 = 2;
    Modelica.SIunits.TemperatureDifference test3 = 3;
  end Example;
end tempDiffTest;