2

我有一个 python 脚本,它使用read_model_descriptionFMPy 库中的函数过滤和列出来自 fmu 的参数、它们的单位和默认值,并在 Excel 表中写入(相关讨论)。然后使用该simulate_fmu函数,脚本模拟 fmu 并将结果与​​单位写回 excel 表中。

在过滤参数和输出变量时,我使用这一行来获取它们的单位。
unit = variable.declaredType.unit if hasattr(variable.declaredType,'unit') else '-'

与 fmu 交互时,参数和变量值采用默认 SI 单位。我想这是根据 FMI 标准。但是,在modelDescription.xml下面<UnitDefinitions>我看到有关于默认 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)?

4

1 回答 1

4

FMPy 源代码中,我没有找到任何实现单位转换的地方。

但是所有相关信息都在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 规范 2.01的第2.2.2 章单位定义 (UnitDefinitions)以了解全貌。

于 2020-04-11T08:46:10.647 回答