Величины разницы температур в Modelica не работают должным образом

Я пытаюсь получить значения разницы температур, чтобы сообщить правильный результат при отображении в неабсолютных температурных шкалах. См. следующий пример:

model tempDiffTest
  Modelica.Blocks.Interfaces.RealOutput test1(quantity="ThermodynamicTemperature", unit="K") = 1 annotation(absoluteValue=false);
  Real test2(quantity="ThermodynamicTemperature", unit="K") = 2 annotation(absoluteValue=false);
  Modelica.SIunits.TemperatureDifference test3 = 3;
end tempDiffTest;

Обратите внимание, что

type TemperatureDifference = Real (
    final quantity="ThermodynamicTemperature",
    final unit="K") annotation(absoluteValue=false);

именно это привело к изменениям, которые я внес в переменные test1 и test2.

Теперь ожидается, что когда я показываю свои результаты в градусах Цельсия, они должны быть 1, 2 и 3 для test1, test2 и test3 соответственно. Фактические результаты показаны ниже от Dymola:

табличный результат

Следовательно, только test3 был явно успешным (обратите внимание, что ни один из результатов не был успешным в OpenModelica). Теперь мой вопрос: как мне добиться того, что мне нужно для test1 и test2?


person Matt    schedule 21.11.2019    source источник


Ответы (2)


Dymola не поддерживает использование аннотации absoluteValue в объявлении test1 и test2.

Если вы включите проверку аннотаций в Dymola с помощью

Advanced.EnableAnnotationCheck=true

Дымола сообщает во время проверки

В классе tempDiffTest компонента test1 аннотация 'absoluteValue' неизвестна.

Глядя на спецификацию Modelica, мы отмечаем, что она говорит

Простой тип или компонент простого типа могут иметь: аннотацию(absoluteValue=false);

На мой взгляд, это немного расплывчато, и ваш код должен работать (поскольку test2 является компонентом предопределенного типа Real). Но Dymola принимает аннотацию только в определениях классов.

Итак, чтобы решить вашу проблему, вам просто нужно объявить соединитель и тип, чтобы иметь возможность использовать эту аннотацию.

package tempDiffTest
  connector Test1 = Modelica.Blocks.Interfaces.RealOutput (quantity="ThermodynamicTemperature", unit="K") annotation(absoluteValue=false);
  type Test2 = Real(quantity="ThermodynamicTemperature", unit="K") annotation(absoluteValue=false);

  model Example
    Test1 test1 = 1;
    Test2 test2 = 2;
    Modelica.SIunits.TemperatureDifference test3 = 3;
  end Example;
end tempDiffTest;
person marco    schedule 25.11.2019

Из спецификации языка Modelica:

Простой тип или компонент простого типа может иметь:

аннотация (абсолютное значение = ложь);

Если false, то переменная определяет относительное количество, а если true — абсолютное количество. [При преобразовании между единицами измерения (в пользовательском интерфейсе для построения графика и ввода параметров) смещение должно игнорироваться для переменной, определенной с помощью аннотации absoluteValue = false. Эта аннотация используется в стандартной библиотеке Modelica, например, в Modelica.SIunits для определения типа TemperatureDifference.]

Поэтому аннотация имеет значение только при преобразовании фактического unit в displayUnit со смещением, определенным для этой операции. Если добавляется annotation(absoluteValue=false), это смещение игнорируется. Это имеет смысл для разницы в температуре, так как это одно и то же число, например. Цельсия или Кельвина.

Что касается вашего кода: он присваивает температуру в Кельвинах test1 и test2, а затем показывает ее в °C. Поэтому то, что показано, верно.

Для этого важно знать, что в Modelica значения всегда присваиваются в единицах, которые имеет переменная, в вашем случае это Кельвины. Затем он пересчитывается в градусы Цельсия для отображения в пользовательском интерфейсе. Вам нужно назначить 274.15K, чтобы получить 1°C. Поскольку это довольно распространенный повторный расчет, в MSL есть функция для него: Modelica.SIunits.Conversions.from_degC

Поэтому я бы предложил изменить ваш код на что-то вроде:

model tempDiffTest
  import Modelica.SIunits.Conversions.from_degC;

  Modelica.Blocks.Interfaces.RealOutput test1(quantity="Temperature", unit="K", displayUnit="degC") = from_degC(1);
  Modelica.SIunits.Temperature test2 = from_degC(2) annotation(absoluteValue=false);
  Modelica.SIunits.TemperatureDifference test3 = 3;
  Modelica.SIunits.TemperatureDifference test4 = test1-test2;

end tempDiffTest;

Это приводит к:

Переменный результат браузера

or

Результат таблицы

person Markus A.    schedule 21.11.2019
comment
Спасибо за ваш ответ. Однако я не думаю, что поведение, которое мне нужно, еще не достигнуто. Я хочу, чтобы инструмент отображал тот же ответ в degC, что и в K, что достигается только в моем test3 и вашем test3/test4. Чтобы добавить к этому еще одну морщину, я хочу выполнить это в переменной RealOutput (мой test1). - person Matt; 21.11.2019