Условное объявление массивом записей

#modelica #dymola

#моделика #dymola

Вопрос:

Я стараюсь создавать множество компонентов в зависимости от значения постоянных элементов. Эти элементы организованы в массив записей. Dymola печатает журнал переводов для приведенного ниже примера:

введите описание изображения здесь

Но я обязательно использую фиксированные условия, потому что я выполняю разрешенные операции только с постоянными значениями.

Вот простой пример того, что я хочу сделать:

 model ConditionalComponent
  type Enum = enumeration(one,two,three);

  record Tmp
    parameter Integer ID;
    parameter Boolean active;
  end Tmp;

  record TmpNamed
    parameter Enum name;
    extends Tmp;
  end TmpNamed;

  function reorder
    input TmpNamed inp[:];
    output Tmp out[size(inp,1)];
  algorithm 
    for elem in inp loop
      out[elem.name] := Tmp(elem.ID, elem.active);
    end for;
  end reorder;

  constant TmpNamed testIn[:] = {
    TmpNamed(Enum.two,20,true),
    TmpNamed(Enum.one,10,true),
    TmpNamed(Enum.three,30,true)};

  constant Tmp testOut1[:] = reorder({
    TmpNamed(Enum.two,20,true),
    TmpNamed(Enum.one,10,true),
    TmpNamed(Enum.three,30,true)});

  constant Tmp testOut2[:] = reorder(testIn);

  constant Boolean active1 = testOut1[Enum.one].active;
  constant Boolean active2 = testOut2[Enum.one].active;

  Real t1=0 if testOut1[Enum.one].active;
  //Real t2=0 if testOut2[Enum.one].active;
  //Real t3=0 if active1;
  //Real t4=0 if active2;
end ConditionalComponent;
 

Функция reorder предназначена для упрощения управления большими списками именованных активных компонентов. Обычно константа testOut2 используется и создается в пакете ConditionalComponent. Но для целей тестирования ConditionalComponent здесь является моделью. На самом деле я хочу использовать только строку

 Real t2=0 if testOut2[choice].active;
parameter Enum choice = Enum.one;
 

внутри других компонентов, которые имеют параметр типа Enum. Объявления для t1, t3, t4 — это лишь некоторые тесты, которые работают, в зависимости от того, что осталось без комментариев.
Например, оставление объявления для t1 и t3 без комментариев работает. Но если использовать только объявление для t1, оно не переводится Dymola.

Разница между t1 и t2 заключается в том, что аргумент для изменения порядка передается напрямую или через константу testIn .

Я уверен, что большинство параметров и постоянных префиксов не нужны, и я изо всех сил старался разобраться в проблеме. Но, к сожалению, я не могу решить, работает ли Dymola неправильно или я сделал что-то не так. И я понятия не имею, как отладить процесс перевода, чтобы разобраться в этом самостоятельно.

Кто-нибудь может сказать мне, что я делаю не так?

Ответ №1:

Не что-то неправильное, но просто в настоящее время это рассматривается как слишком сложное и не решаемое.

Обходной путь заключается в разделении подписки и доступа к элементам:

 constant Tmp testOut1_one=testOut1[Enum.one];
Real t1=0 if testOut1_one.active;
 

Комментарии:

1. Я уже реализовал предложенный вами обходной путь

2. ( //Real t3=0 if active1; ). Но это не сработает, если вы хотите выполнить итерацию по testOut1 для условного (в зависимости от активных) подключения компонентов. Знаете ли вы меру сложности, которую я превысил?