【问题标题】:How to handle unit conversions while interacting with FMUs?与 FMU 交互时如何处理单位转换?
【发布时间】:2020-04-11 16:46:10
【问题描述】:

我有一个 python 脚本,它使用 FMPy 库中的 read_model_description 函数从 fmu 过滤和列出参数、它们的单位和默认值,并写入 Excel 表 (related discussion)。然后使用simulate_fmu 函数,脚本模拟 fmu 并将结果与​​单位写回 excel 表中。

在过滤参数和输出变量时,我使用这一行来获取它们的单位。
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 的包装器,在与 fmu 交互时将单位转换为所需的单位系统(即 SI 到 IP)?

【问题讨论】:

  • FMPy 0.2.24 中添加了对单位和显示单位的支持。有关示例,请参见 issue 177

标签: python modelica fmi unit-conversion pyfmi


【解决方案1】:

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) 章节 了解全貌。

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    相关资源
    最近更新 更多