Как обрабатывать преобразования единиц при взаимодействии с FMU? - PullRequest
2 голосов
/ 11 апреля 2020

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

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

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

<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 Ответ

4 голосов
/ 11 апреля 2020

В источнике 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) для получения полной картины.

...