Как обрабатывать преобразование единиц при взаимодействии с 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), чтобы получить полную картину.