Как обрабатывать преобразование единиц при взаимодействии с FMU?

У меня есть скрипт python, который фильтрует и перечисляет параметры, их единицы и значения по умолчанию из fmu, используя read_model_descriptionфункция из библиотеки FMPy и записывает в таблицу Excel ( соответствующее обсуждение). Затем с помощьюsimulate_fmu функция скрипт имитирует fmu и записывает результаты с единицами измерения обратно в таблицу Excel.

При фильтрации параметров и выходной переменной я использую эту строку для получения их единиц измерения.
unit = variable.declaredType.unit if hasattr(variable.declaredType,'unit') else '-'

При взаимодействии с fmu значения параметров и переменных указаны в единицах СИ по умолчанию. Думаю, это соответствует стандарту FMI. Однако вmodelDescription.xml под <UnitDefinitions>Я вижу, что есть информация о единицах СИ по умолчанию для преобразования единиц отображения. Например:

<Unit
      name="Pa">
      <BaseUnit kg="1"
        m="-1"
        s="-2"/>
      <DisplayUnit
        name="bar"
        factor="1E-05"/>
      <DisplayUnit
        name="ftH2O"
        factor="0.0003345525633129686"/>
</Unit> 

Есть ли способ получить значения параметров и выходные переменные в displayUnits, если коэффициенты преобразования уже доступны в modelDescription.xml?

Или есть более простое решение с использованием библиотек python, таких как pint, которые могут действовать как оболочка вокруг fmu для преобразования единиц в желаемой системе единиц (например, SI в IP) при взаимодействии с ней?

1 ответ

Решение

В исходнике 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), чтобы получить полную картину.

Другие вопросы по тегам