Правильный синтаксис для переопределения заменяемых параметров для компонентов массива - PullRequest
1 голос
/ 29 января 2020

Я разработал модель, в которой достаточно широко используются сменные записи. Параметры передаются в массивы компонентов. Я попробовал два подхода, чтобы сделать это, но ни один из них не работает во всех моих тестовых средах SimulationX (SimX), OpenModelica (OM), Dymola и Wolfram SystemModeler (WSM).

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

  • подход 1: повторно объявить запись подмодели с помощью модификации (MOD)
  • подход 2: повторно объявить соответствующую внутреннюю запись, чтобы изменить внешнюю запись внутри подмодели (IO)

Пакет содержит пример с 4 моделями с различными комбинациями записи / подмодели для MOD и IO каждая.

  • Оба подхода прекрасно работают в SimX
  • Dymola корректно моделирует с подходом MOD, но выдает ошибки для IO
  • OM может моделировать модель, но не производит правильные результаты для всех сценариев ios
  • WSM выдает предупреждающие сообщения, касающиеся упомянутых мной записей, но имитирует правильные результаты.

Я удалил пример и аннотации из показанного кода для удобства чтения, но полный пакет можно скачать здесь: https://hessenbox.tu-darmstadt.de/getlink/fiEgNjMEBZpSyJWHKafmoYYS/RedeclareTestPackage.rar

package RedeclareTestPackage "redeclarationTest"
    partial record datasetPartial "NewRecord1"
        parameter Real whatever;
        parameter Integer idontcare;
    end datasetPartial;

record datasetA "record A"
        extends datasetPartial(
            whatever=1.0,
            idontcare=2);
    end datasetA;

record datasetB "record B"
        extends datasetPartial(
            whatever=2.0,
            idontcare=3);
    end datasetB;

    partial model partialSubModelType_Mod "NewModel1"
        replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
        Real C;
    end partialSubModelType_Mod;

model subModelTypeMultiply_Mod "sub-model type Multiply"
        extends partialSubModelType_Mod;
        equation
            C=subModelDataset.whatever*subModelDataset.idontcare;
    end subModelTypeMultiply_Mod;

model subModelTypeAdd_Mod "sub-model type Add"
        extends partialSubModelType_Mod;
        equation
            C=subModelDataset.whatever+subModelDataset.idontcare;
    end subModelTypeAdd_Mod;

partial model partialSubModelType_innerOuter "NewModel1"
        outer replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
        Real C;
    end partialSubModelType_innerOuter;

model subModelTypeMultiply_innerOuter "sub-model type Multiply"
        extends partialSubModelType_innerOuter;
        equation
            C=subModelDataset.whatever*subModelDataset.idontcare;
    end subModelTypeMultiply_innerOuter;

model subModelTypeAdd_innerOuter "sub-model type Add"
        extends partialSubModelType_innerOuter;
        equation
            C=subModelDataset.whatever+subModelDataset.idontcare;
    end subModelTypeAdd_innerOuter;

model modificationModel "NewModel1"
        replaceable parameter datasetA modelData constrainedby datasetPartial;
        replaceable subModelTypeAdd_Mod submodel[1,1] constrainedby 
partialSubModelType_Mod(each subModelDataset=modelData);
        Real test=submodel[1,1].C;
    end modificationModel;

    model innerOuterModel "NewModel1"
        inner replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
        replaceable subModelTypeAdd_innerOuter submodel[1,1] constrainedby 
partialSubModelType_innerOuter;
        Real test=submodel[1,1].C;
    end innerOuterModel;

end RedeclareTestPackage;

сообщение об ошибке в OM гласит:

Предупреждение о переводе [RedeclareTestPackage: 39: 3-39: 84]: внутренняя декларация для внешнего компонента subModelDataset не найдена и сгенерирована автоматически.

Как ни странно, это всего лишь сочетание повторного разделения набора данных и подмодели с внутренним / внешним, которое создает сообщение и не может правильно симулировать. Все остальное работает нормально.

WSM выдает сообщения об ошибках для обоих подходов. Подход MOD создает, например:

Предупреждение: в переменной или компоненте 'MOD_ADD_1and2.submodel.subModelDataset': дублирующая модификация элемента = (нетипизированного) 1.0 и каждого = (типизированного) 1.0 DAE.PROP (Real) , C_CONST), значение: 1,0 для компонента.

Предупреждение: Дублирующая модификация элемента = (нетипизированный) 1.0 и каждого = (типизированный) 1.0 DAE.PROP (Real, C_CONST), значение: 1.0 для любого компонента.

A Пример WSM для подхода ввода-вывода гласит:

Предупреждение. Игнорирование модификации внешнего элемента: IO_ADD_1and2.submodel [1,1] .subModelDataset.

Все модели имитируют правильные результаты в WSM, хотя. Dymola работает только для примеров модификации, внутреннее / внешнее переопределение вызывает ошибки типа:

Заменяемый должен быть подтипом класса ограничения. Но разные внутренние / внешние квалификаторы для компонента subModelDataset. В объявлении компонента subModelDataset: File: C: /.../ RedeclareTestPackage / RedeclareTestPackage.mo, строка 39 Исходное объявление subModelDataset: File: C: /.../ RedeclareTestPackage / RedeclareTestPack Context, linePackagemomo : RedeclareTestPackage.partialSubModelType_innerOuter.subModelDataset

Если бы кто-то мог меня просветить, я был бы очень благодарен. Моя фактическая модель прекрасно работает в SimX, но, по моему мнению, одной из главных причин для Modelica является разработка моделей, независимых от поставщиков, чтобы иметь возможность делиться ими с большим сообществом.

С наилучшими пожеланиями Джулиан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...