如何在与 FMU 交互时处理单位转换?
How to handle unit conversions while interacting with FMUs?
我有一个 python 脚本,它使用 FMPy 库中的 read_model_description
函数过滤并列出来自 fmu 的参数、它们的单位和默认值,并写入 excel sheet ()。然后使用 simulate_fmu
函数脚本模拟 fmu 并将结果连同单位写回 excel sheet。
在过滤参数和输出变量时,我使用这一行来获取它们的单位。
unit = variable.declaredType.unit if hasattr(variable.declaredType,'unit') else '-'
在与 fmu 交互时,参数和变量值采用默认的 SI 单位。我猜这是根据 FMI 标准。但是,在 <UnitDefinitions>
下的 modelDescription.xml
中,我看到有关于默认 SI 单位到 displayUnit 转换的信息。例如:
<Unit
name="Pa">
<BaseUnit kg="1"
m="-1"
s="-2"/>
<DisplayUnit
name="bar"
factor="1E-05"/>
<DisplayUnit
name="ftH2O"
factor="0.0003345525633129686"/>
</Unit>
如果转换因子在 modelDescription.xml 中已经可用,有没有办法能够在 displayUnits 中获取参数值和输出变量?
或者是否有更简单的解决方案,使用像 pint 这样的 python 库,可以作为 fmu 的包装器,在与其交互时将单位转换为所需的单位系统(即 SI 到 IP)?
在FMPy source中我没有找到任何实现单位转换的地方。
但是在model_description.py中阅读了所有相关信息。
显示单元信息在modelDescription.unitDefinitions
中结束。例如。要将值 val = 1.013e5 # Pa
转换为所有定义的显示单位,以下可能有效:
for unit in modelDescription.unitDefinitions:
if unit.name == "Pa":
for display_unit in unit.displayUnits:
print(display_unit.name)
# not sure about the brackets here
print( (val - display_unit.offset)/display_unit.factor )
break
查看 FMI Specification 2.01 章 2.2.2 单位定义 (UnitDefinitions) 以了解完整情况。
我有一个 python 脚本,它使用 FMPy 库中的 read_model_description
函数过滤并列出来自 fmu 的参数、它们的单位和默认值,并写入 excel sheet (simulate_fmu
函数脚本模拟 fmu 并将结果连同单位写回 excel sheet。
在过滤参数和输出变量时,我使用这一行来获取它们的单位。
unit = variable.declaredType.unit if hasattr(variable.declaredType,'unit') else '-'
在与 fmu 交互时,参数和变量值采用默认的 SI 单位。我猜这是根据 FMI 标准。但是,在 <UnitDefinitions>
下的 modelDescription.xml
中,我看到有关于默认 SI 单位到 displayUnit 转换的信息。例如:
<Unit
name="Pa">
<BaseUnit kg="1"
m="-1"
s="-2"/>
<DisplayUnit
name="bar"
factor="1E-05"/>
<DisplayUnit
name="ftH2O"
factor="0.0003345525633129686"/>
</Unit>
如果转换因子在 modelDescription.xml 中已经可用,有没有办法能够在 displayUnits 中获取参数值和输出变量?
或者是否有更简单的解决方案,使用像 pint 这样的 python 库,可以作为 fmu 的包装器,在与其交互时将单位转换为所需的单位系统(即 SI 到 IP)?
在FMPy source中我没有找到任何实现单位转换的地方。
但是在model_description.py中阅读了所有相关信息。
显示单元信息在modelDescription.unitDefinitions
中结束。例如。要将值 val = 1.013e5 # Pa
转换为所有定义的显示单位,以下可能有效:
for unit in modelDescription.unitDefinitions:
if unit.name == "Pa":
for display_unit in unit.displayUnits:
print(display_unit.name)
# not sure about the brackets here
print( (val - display_unit.offset)/display_unit.factor )
break
查看 FMI Specification 2.01 章 2.2.2 单位定义 (UnitDefinitions) 以了解完整情况。