У меня есть вопрос относительно структурирования кода Modelica в многократно используемой части библиотеки и конкретной части приложения.Вопрос касается среды и оборудования, которое зависит от среды, и меня вдохновляет некоторая структура библиотеки жидкостей MSL, но я хочу сделать что-то намного меньше и адаптироваться к моим потребностям, но с этим я тоже могу расти.
Вопрос в том, как удобно адаптировать библиотеку к новому носителю, определенному в коде приложения.Поскольку существует несколько моделей различных частей оборудования, естественно иметь частичную модель, которая определяет тип соединителей, которые должны иметь оборудование, и тогда можно вносить изменения только в частичную модель, когда требуется адаптация соединителей.Мне кажется, мне нужен трехэтапный процесс адаптации библиотеки вместо одного шага, на который я надеюсь.Ниже приведен подробный пример, который позволяет более четко задать вопрос.
Пример представляет собой модель для перекачивания жидкости из одного сосуда в другой, т.е. у нас есть питающий резервуар, насос и сборный резервуар.Жидкая среда изначально содержит два вещества, и теперь в заявке мы хотим смоделировать семь веществ.
В коде приложения новая среда с семью веществами объявлена как пакет Среда7.Адаптация библиотечных моделей для насосов, резервуаров подачи и сбора производится в три этапа:
- Определить соединитель LiquidCon7 как расширение импорта стандартного соединителя LiquidCon из библиотеки и переопределить средув Medium7
- Определить частичную модель EquipmentMedium7 как расширение импорта стандартной частичной модели EquipmentMedium и где переопределен соединитель LiquidCon в LiquidCon7
- Определить пакет Equipment7 как расширение импорта стандартапакет оборудования, в котором частичная модель переименована из EquipmentMedium в EquipmentMedium7.
Сначала в коде приложения можно определить систему, адаптированную к Medium7, с использованием оборудования из Equipment7.- Хотелось бы сделать адаптацию более прямой, чем описано выше.Если я не буду делить код на библиотеку и приложение, как здесь, тогда гораздо проще перейти с Medium2 на Medium7, просто изменив среду, используемую в LiquidConType, и затем это изменение распространится по всей системе.
Когда я читаю материал учебника по этому вопросу Тиллера и Фрицсона или когда я пытаюсь понять код MSL, я нахожу подобные структуры, но все же не то, что имею здесь.Я также думаю, что мои вопросы о том, как эффективно адаптировать библиотеку к изменениям интерфейсов, вызванным новым приложением, не ограничиваются средой, а гораздо более широким диапазоном кода.
Просто прочитайте статью Тиллера «Шаблоны и анти-шаблоны в Modelica "от 2008 года и в разделе 2.3" Средний образец модели ", здесь обсуждается мой вопрос и я думаю о последних нескольких строках на стр. 649.
Я только что понял, что структура моей модели нарушаетсяопределение Modelica, поскольку вам не разрешено расширять PumpType, FeedtankType и т. д. из частичной модели EquipmentMedium, поскольку мне нужно, чтобы EquipmentMedium был заменяемым.См. Modelica def 3.2 rev 2, раздел 6.2.1 «Транзитивно не заменяемый».
Буду признателен за некоторые комментарии по этому вопросу и, возможно, зачитывание совета.Альтернативные решения моей проблемы с игрушками также очень полезны!
Спасибо, Ян Питер
Я не знаю, как добавить файл кода, но ниже я показываю код приложения, описанный выше.Библиотека DATA_v04 является прямой.Но обратите внимание, что мне нужно определить модели PumpType, FeedtankType и т. Д., Используя расширение из частичной модели EquipmentMedium ... и не допускается.
encapsulated package d4_app7
// ------------------------------------------------------------------------
// Interfaces
// ------------------------------------------------------------------------
import Modelica.Blocks.Interfaces.RealInput;
import Modelica.Blocks.Interfaces.RealOutput;
package Medium7
constant String name = "Seven components" "Medium name";
constant Integer nc = 7 "Number of substances;
type Concentration
= Real[nc] (each min=0, each unit="kg/m3") "Substance conc";
end Medium7;
// ------------------------------------------------------------------------
// Adaptation of library DEMO to Medium7
// ------------------------------------------------------------------------
connector LiquidCon7
import DEMO_v4.LiquidCon;
extends LiquidCon(redeclare package medium=Medium7);
end LiquidCon7;
partial model EquipmentMedium7
connector LiquidConType=LiquidCon7;
end EquipmentMedium7;
package Equipment7
import DEMO_v4.Equipment;
extends Equipment
(redeclare partial model EquipmentMedium=EquipmentMedium7);
end Equipment7;
import DEMO_v4.Control;
// ------------------------------------------------------------------------
// Examples of systems
// ------------------------------------------------------------------------
model Test
LiquidCon7.medium medium;
Equipment7.PumpType pump;
Equipment7.FeedtankType feedtank;
Equipment7.HarvesttankType harvesttank;
Control.FixValueType Fsp(val=0.2);
equation
connect(feedtank.outlet, pump.inlet);
connect(pump.outlet, harvesttank.inlet);
connect(Fsp.out, pump.Fsp);
end Test;
end d4_app7;