如何在与 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.012.2.2 单位定义 (UnitDefinitions) 以了解完整情况。