Не найдено соответствующего внутреннего объявления для (Modelica внутренний / внешний) - PullRequest
1 голос
/ 01 июля 2019

Я недавно начал использовать Modelica (OpenModelica) в качестве инструмента моделирования, и я столкнулся с проблемой, касающейся использования внутренних / внешних функций.Я пытаюсь создать модель среды, содержащую значения температуры и давления окружающей среды, чтобы другие модели могли использовать эти значения.Я пытался сделать это с внутренними и внешними ключевыми словами, но продолжаю получать следующее предупреждение:

Не найдено соответствующего «внутреннего» объявления для компонента .Real component.T0 объявлен как «внешний».Существующие «внутренние» компоненты: .Real ambient.T0;определено в области: Test.Ambient.Проверьте, не ошиблись ли вы именем «внешнего» компонента.Пожалуйста, объявите «внутренний» компонент с тем же именем в верхней области видимости.Продолжая выравнивание, рассматривая только объявление 'external' component.

Ниже этих строк вы можете увидеть упрощение кода, который я пытаюсь выполнить.

Три модели под этими строками содержатся в пакете с именем Test.

Модель для окружающей среды, в которой температура T0 определяется как внутренняя:

within Test;

    model Ambient

        inner Real T0;

        equation
            T0 = 300;

end Ambient;

модель компонента, который пытается вызвать T0 через внешний оператор:

within Test;

model Component

    Real T;
    outer Real T0;
    parameter Real k = 2;

    equation
        T = k * time + T0;

end Component;

Обе модели ambient и компонент перетаскиваются в объединенную модель:

within Test;

model System
  Test.Ambient ambient annotation(
    Placement(visible = true, transformation(origin = {-30, 30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Test.Component component annotation(
    Placement(visible = true, transformation(origin = {30, -10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation

end System;

При запуске System I я получаювышеупомянутое предупреждение.Кроме того, существует одна переменная больше, чем уравнения (что имеет смысл, поскольку она не может соединить Component.T0 с Ambient T0)

1 Ответ

5 голосов
/ 01 июля 2019

Ваш вариант использования выглядит очень похоже на то, что сделано в Modelica.Mechanics.MultiBody и Modelica.Fluid.В обоих случаях существует класс, который содержит все «глобальные» свойства системы, которые называются world или system соответственно.

Поэтому ваш класс Ambient должен быть определен как класс inner.Затем к нему обращается оператор outer для повторного использования значений из него.Что было бы возможно при использовании вашего кода, это получить доступ к T0 из моделей в пределах Ambient.Судя по вашему примеру кода, это не то, что вам нужно ...

Применение метода, используемого в MSL, приведет к следующему коду:

package Test
model Ambient
    inner Real T0;
  equation
    T0 = 300;
    annotation(defaultComponentPrefixes="inner");
end Ambient;

model Component
    Real T;
    Real T0 = ambient.T0;
    parameter Real k = 2;
  protected
    outer Test.Ambient ambient;
  equation
    T = k * time + T0;
end Component;

model System
  inner Test.Ambient ambient;
  Test.Component component;   
end System;

end Test;

Некоторые комментарии:

  • Доступ к переменным с помощью внешнего оператора выполняется в части protected модели, просто для того, чтобы в результате несколько раз иметь одинаковые переменные в результате.
  • *Аннотация 1025 * гарантирует, что модель имеет префикс inner в случае создания графического экземпляра (как показано в модели System).
...