Как я мог переопределить или изменить значение предопределенного параметра в Dymola во время моделирования?

Строю макет в Дымоле. Я определил массу этой модели как параметр, потому что она будет перенесена в другие модули и вызвана в них. Но масса должна изменяться во время моделирования в разные промежутки времени. Например, в течение первых 100 секунд масса должна оставаться 500 кг, а в течение 100–200 секунд пассажир собирается сесть, поэтому необходимо рассчитать новую массу, включая массу пассажира. Но было показано, что «проблема структурно сингулярна», потому что значения параметра были присвоены дважды. Может кто-нибудь дать несколько советов по решению этой проблемы? Большое спасибо.


person B.S    schedule 21.11.2019    source источник


Ответы (2)


Если вы определяете массу вашего компонента как input, а не parameter, вы можете изменить его во время моделирования, назначив, например, вывод с TimeTable на него. Например

model Component
  input Modelica.SIunits.Mass mass "Passenger dependent mass";
equation
...
end Component;

model systemModel
  TimeTable timeTable;
  Component component(mass=timeTable.y);
  OtherComponent otherComponent(mass=component.mass);
equation
  ...
end systemModel;

Обратите внимание, что у других компонентов, использующих массу, также должны быть свои «параметры» внутренней массы, определенные как input, чтобы допускать более высокую изменчивость, чем параметры.

С уважением, Рене Юст Нильсен

person Rene Just Nielsen    schedule 21.11.2019
comment
Большое спасибо за ваш совет. У меня есть еще один вопрос об этом решении. Нет проблем установить всю массу в других модулях в качестве входных данных. Но в одном модуле я должен использовать массу в ограничителе, limiter.umax может просто принимать параметры или константы. Должен ли я построить новый собственный модуль вместо лимитера? Или можно и дальше использовать лимитер-блок? Большое спасибо - person B.S; 21.11.2019
comment
Да, вам придется использовать ограничитель другого типа. Например. Modelica.Blocks.Nonlinear.VariableLimiter, в котором uMax и uMin заменены входами. - person Rene Just Nielsen; 21.11.2019
comment
Большое спасибо. Я почти приблизился к своей цели. Извините, но я думаю, что у меня все еще есть последний вопрос по моделированию. Я использовал напрямую bodyShape (из MultiBody в Механике), определение m является параметром. У вас есть предложение по этой проблеме? Большое спасибо за ваши полезные советы и желаю вам хорошего дня. - person B.S; 21.11.2019
comment
К счастью, m определен непосредственно в BodyShape, а не в каком-то базовом классе BodyShape. Вам следует просто сделать копию BodyShape в своей собственной библиотеке и переопределить m как input вместо parameter. - person Rene Just Nielsen; 21.11.2019

Параметры Modelica определяются тем, что они не меняются с течением времени. Поэтому вам нужно будет остановить моделирование, изменить параметр и перезапустить моделирование (см. Другой вопрос). Учитывая ваше описание, я бы предпочел не использовать эту возможность, поскольку кажется, что ваша переменная предназначена для изменения с течением времени.

Похоже, что лучшей альтернативой является определение массы как переменной. Если это будет сделано, вы сможете:

  1. Перенесите эту переменную из одной модели в другую с помощью интерфейсов. Это может быть немного утомительно в зависимости от количества классов, использующих переменную.
  2. Использование _1 _ / _ 2_ (в основном глобальные переменные) является допустимой концепцией для этого варианта использования. Эта концепция используется в модели world библиотек MultiBody.

В обоих решениях вам нужно будет изменить исходную модель массы, поскольку тогда m должна быть переменной, а не массой.

person Markus A.    schedule 21.11.2019
comment
Я попробую, большое спасибо за полезные советы. - person B.S; 21.11.2019