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)
,则会忽略偏移量。这对于温度差异是有意义的,因为它是相同的数字,例如。摄氏度或开尔文。
关于您的代码:它的作用是将开尔文温度分配给 test1
和 test2
,然后以 °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 不支持在 test1
和 test2
的声明中使用 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;
我正在尝试获取温差量,以便在以非绝对温标显示时报告正确的结果。请参阅以下示例:
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)
,则会忽略偏移量。这对于温度差异是有意义的,因为它是相同的数字,例如。摄氏度或开尔文。
关于您的代码:它的作用是将开尔文温度分配给 test1
和 test2
,然后以 °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 不支持在 test1
和 test2
的声明中使用 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;