В настоящее время я работаю над библиотекой нескольких жидкостей, в которой я закодировал физические компоненты, соединители, граничные условия, датчики, физические свойства и т. д. Выбор жидкости в настоящее время основан на выборе Integer fluid.
До сих пор мне удавалось условно назначать цвет стиля компонентов на основе значения fluid.
Теперь я хочу пойти еще дальше и также условно назначить цвет соединения. Я знаю о Stack Overflow — назначении определенного стиля соединения соединителю в Modelica, поскольку я уже использовал его с пользой.
Поэтому я определил параметр parameter Integer fluid=fluid в коннекторе, чтобы он наследовал значение fluid от компонента. Затем я присвоил условный стиль прямоугольнику, как указано в ссылке выше.
Однако в итоге я получаю следующую ошибку: mean circular equalities for conduite.C1.fluid
(где «кабель» — это компонент, а «C1» — один из его разъемов)
В настоящее время я немного невежественен.
Обновлено:
Первоначальный подход:
В модели с разъемом:
parameter Integer fluid=fluid "1: 1st fluid / 2: 2nd fluid";
В компонентной модели:
parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
для обоих экземпляров соединителя: в ячейке параметра fluid я оставляю значение fluid по умолчанию.
Полученная плоская моделька пролила свет на круговые равенства:
parameter Integer conduite.C1.fluid = conduite.C1.fluid;
parameter Integer conduite.C2.fluid = conduite.C2.fluid;
Другой подход, который работает, но не удовлетворяет:
В модели с разъемом:
parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
В компонентной модели:
parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
для обоих экземпляров соединителя:
в ячейке fluid: я печатаю fluid вместо значения 1 по умолчанию.
Полученная плоская моделька — это то, что мне собственно и нужно:
parameter Integer conduite.C1.fluid = conduite.fluid;
parameter Integer conduite.C2.fluid = conduite.fluid;
Почему значение по умолчанию fluid не относится к параметру верхнего уровня, тогда как локально перезаписанное значение относится?





Я не до конца понял вопрос, поэтому делаю некоторые предположения: я предполагаю, что распространение как-то пошло не так.
Приведет ли следующий код к тому, что вам нужно? Обратите внимание, что ни компонент, ни пример не будут работать:
package MultiFluid "Some psydo-code that could help"
connector Con
parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
end Con;
model Component
parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
Con C1(fluid=fluid) annotation (Placement(transformation(extent = {{-110,-10},{-90,10}}), iconTransformation(extent = {{-110,-10},{-90,10}})));
Con C2(fluid=fluid) annotation (Placement(transformation(extent = {{90,-10},{110,10}}), iconTransformation(extent = {{90,-10},{110,10}})));
end Component;
model Example
Component component(fluid=2) annotation (Placement(transformation(extent = {{-10,-10},{10,10}})));
end Example;
end MultiFluid;
дает плоский код Modelica для примера:
model Example
parameter Integer component.fluid = 2 "1: 1st fluid / 2: 2nd fluid";
parameter Integer component.C1.fluid = component.fluid "1: 1st fluid / 2: 2nd fluid";
parameter Integer component.C2.fluid = component.fluid "1: 1st fluid / 2: 2nd fluid";
end Example;
Если мое предположение верно, то существенной частью является распространение Integer fluid из parameter в Component:
Con C1(fluid=fluid)
Эта строка передает фактическое значение из Component в экземпляры C1 из Con.
В конце концов я нашел удовлетворительное решение, используя inner/outer:
В модели с разъемом:
outer parameter Integer fluid;
В компонентной модели:
inner parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
Таким образом, каждому экземпляру компонента (труба, датчик, граничное условие и т. д.) необходимо вручную присвоить значение fluid, что на данный момент приемлемо, тогда как значение fluid внутри компонента автоматически распространяется на экземпляры соединителей. .
БОНУС: Отсюда легко условно назначить стиль подключения. Вот раздел Icon аннотации в коннекторе:
Icon(coordinateSystem(
preserveAspectRatio=false,
extent = {{-100,-100},{100,100}},
grid = {2,2}), graphics = {Rectangle(
extent = {{82,-82},{90,-90}},
lineColor=colorVector[:,fluid],
lineThickness=1), Rectangle(
extent = {{-100,100},{100,-100}},
lineColor = {0,0,0},
fillPattern=FillPattern.Solid,
fillColor = {0,128,255})})
где colorVector определяется как:
constant Integer colorVector[3,:] = [
fluid1Color,
fluid2Color];
constant Integer fluid1Color[3] = {0,140,72};
constant Integer fluid2Color[3] = {244,125,35};
На данный момент это colorVector немного излишество, но в будущем я легко смогу добавить больше жидкости (и больше плавных цветов).
Обратите внимание, что стиль подключения зависит от значения моего параметра fluid при установке соединения. Последующее изменение значения параметра не повлияет на стиль существующих соединений.
Привет @Markus, спасибо за ответ. вы прекрасно уловили суть вопроса. Однако это то же решение, что и мой второй подход. Для каждого нового созданного компонента пользователю придется вручную распространять параметр
fluidна экземпляры соединителей, чего я не хочу.