Modelica гибкий размер массива в записи - не удалось расширить

Я пытаюсь прочитать несколько файлов (csv, 2 столбца) с соответствующими именами (String) и методами интерполяции smoothness (String). Используя запись, я получаю красивый графический интерфейс в Dymola:  GUI

Чтобы объяснить мою проблему, вот упрощенная модель:

model Test_Strings
  parameter String x[:];
  parameter Integer k = size(x,1);
  Integer i;

initial algorithm 
  i := 0;
  Modelica.Utilities.Streams.print(String(i));
  Modelica.Utilities.Streams.print(String(k));

equation 

algorithm 
    when sample(1,1) then
      i :=pre(i) + 1;
      Modelica.Utilities.Streams.print(String(i));

      for j in 1:k loop
        Modelica.Utilities.Streams.print(x[j]);
      end for;
    end when;
end Test_Strings;

Графический интерфейс для этого выглядит следующим образом:  введите описание изображения здесь

Код для его запуска:

model Test_Strings_System
  Test_Strings test_Strings(x={"a","b","c","d"});
end Test_Strings_System;

Это даст следующий результат в консоли:  введите описание изображения здесь

Теперь, если я попытаюсь использовать запись:

record MyRecord2
  parameter String name = "NoName";
end MyRecord2;

И адаптируем модель (изменилась только первая строка параметра MyRecord2 x [:] и внутри цикла for x [j] .name):

model Test_Strings2
  parameter MyRecord2 x[:];
  parameter Integer k = size(x,1);
  Integer i;

initial algorithm 
  i := 0;
  Modelica.Utilities.Streams.print(String(i));
  Modelica.Utilities.Streams.print(String(k));

equation 

algorithm 
  when sample(1,1) then
    i :=pre(i) + 1;
    Modelica.Utilities.Streams.print(String(i));

    for j in 1:k loop  // k must be fixed number if equation
      Modelica.Utilities.Streams.print(x[j].name); // j must be fixed number if algorithm
    end for;
  end when;
end Test_Strings2;

Затем я получаю сообщение об ошибке перевода: Внутренняя ошибка: не удалось развернуть строку. введите описание изображения здесь

Если я исправлю k или j в цикле for на заданное число (скажем, 3), тогда он будет работать, но в зависимости от того, находится ли он в разделе алгоритма или уравнения (см. Комментарии в коде).

У меня были похожие проблемы с гибкими размерами массивов, и я до сих пор не понимаю, как их решить. Обязательно ли использовать функции? Как я могу использовать гибкие размеры массивов, которые определяются в зависимости от внешних данных, выбранных в качестве параметров до моделирования (например, длины таблицы)? Или проблема в этом случае где-то еще?

Спасибо.


person T. Sergi    schedule 21.06.2017    source источник


Ответы (1)


Вы можете изменить модель, чтобы иметь массив записей в качестве видимых параметров, но внутренне использовать массив строк (протестирован с Dymola 2017 и более поздними версиями):

model Test_Strings2
  parameter MyRecord2 x[:];
  parameter Integer k = size(x,1);
  Integer i;
protected
  parameter String s[:]=x.name; // Hack
initial algorithm 
  i := 0;
  Modelica.Utilities.Streams.print(String(i));
  Modelica.Utilities.Streams.print(String(k));

equation 

algorithm 
  when sample(1,1) then
    i :=pre(i) + 1;
    Modelica.Utilities.Streams.print(String(i));

    for j in 1:k loop  
      Modelica.Utilities.Streams.print(s[j]); 
    end for;
  end when;
end Test_Strings2;
person Hans Olsson    schedule 22.06.2017