作者:爱碩爱你_静莫失心 | 来源:互联网 | 2023-09-15 03:13
我正在尝试获取温度差异量,以便以非绝对温度标尺显示时报告正确的结果。请参见以下示例:
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显然是成功的(请注意,在Openmodelica中没有任何结果是成功的)。现在,我的问题是如何实现对test1和test2的追求?
Dymola不支持在absoluteValue
和test1
的声明中使用test2
注释。
如果您在Dymola中启用注释检查,则使用
Advanced.EnableAnnotatiOnCheck=true
检查期间的迪摩拉报告
在tempDiffTest组件test1类中,注释'absoluteValue'是未知的。
查看Modelica规范,我们注意到它说明了
简单类型或简单类型的组件可能具有:
注解(absoluteValue = false);
我认为这有点含糊,您的代码应该可以工作(因为test2
是预定义类型Real
的组件)。但是Dymola仅在类定义中接受注释。
因此,要解决您的问题,只需声明一个连接器和一个类型即可使用此注释。
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;
,
来自Modelica Language Specification:
简单类型或简单类型的组件可能具有:
annotation(absoluteValue = false);
如果为false
,则变量定义相对数量,如果为true,则定义绝对数量。 [在单位之间转换时(在用于绘制和输入参数的用户界面中),对于注释为absoluteValue = false定义的变量,必须忽略偏移量。此注释在Modelica标准库中使用,例如在Modelica.SIunits中用于类型定义TemperatureDifference。]
因此,仅当从实际的unit
转换为具有为此操作定义的偏移量的displayUnit
时,注释才有所不同。如果添加了annotation(absoluteValue=false)
,则忽略偏移量。对于温度差异,这是有意义的,因为对于例如摄氏或开氏温度。
关于您的代码:它的作用是将开氏温度分配给test1
和test2
,然后以°C显示。因此,显示的是正确的。
为此,重要的是要知道在Modelica中,值始终以变量具有的单位分配,在您的情况下为Kelvin。然后将其重新计算为摄氏度,以在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;
结果是:
或