Я разработал модель, в которой достаточно широко используются сменные записи. Параметры передаются в массивы компонентов. Я попробовал два подхода, чтобы сделать это, но ни один из них не работает во всех моих тестовых средах 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 является разработка моделей, независимых от поставщиков, чтобы иметь возможность делиться ими с большим сообществом.
С наилучшими пожеланиями Джулиан