Как я могу изменить параметры компонента Modelica MultiBody, работая с файлом XML?

Я создал тривиальную модель маятника в Modelica. После этого я построил модель так, чтобы были сгенерированы файлы .xml и .exe.

 model TestJAVA_v2
 inner Modelica.Mechanics.MultiBody.World world annotation(
Placement(visible = true, transformation(origin = {-86, 28}, extent = {{-10, 
-10}, {10, 10}}, rotation = 0)));
 Modelica.Mechanics.MultiBody.Joints.Revolute revolute1(n = {1, 0, 0}, 
 phi(fixed = true, start = 0.785398))  annotation(
 Placement(visible = true, transformation(origin = {-46, 28}, extent = 
 {{-10, 
-10}, {10, 10}}, rotation = 0)));
 Modelica.Mechanics.MultiBody.Parts.PointMass pointMass1 annotation(
 Placement(visible = true, transformation(origin = {16, 28}, extent = {{-10, 
-10}, {10, 10}}, rotation = 0)));
 Modelica.Mechanics.MultiBody.Parts.BodyShape bodyShape1(r = {0, 1, 1}, r_CM 
 = bodyShape1.r / 2)  annotation(
 Placement(visible = true, transformation(origin = {-14, 26}, extent = 
 {{-10, 
-10}, {10, 10}}, rotation = 0)));
equation
connect(bodyShape1.frame_b, pointMass1.frame_a) annotation(
Line(points = {{-4, 26}, {16, 26}, {16, 28}, {16, 28}}, color = {95, 95, 
95}));
connect(revolute1.frame_b, bodyShape1.frame_a) annotation(
Line(points = {{-36, 28}, {-24, 28}, {-24, 26}, {-24, 26}}, color = {95, 95, 
95}));
connect(world.frame_b, revolute1.frame_a) annotation(
Line(points = {{-76, 28}, {-58, 28}, {-58, 28}, {-56, 28}}, color = {95, 95, 
95}));
annotation(
uses(Modelica(version = "3.2.2")),
experiment(StartTime = 0, StopTime = 15, Tolerance = 0.001, Interval = 
0.0010002),
__OpenModelica_simulationFlags(iim = "none", lv = "LOG_STATS", s = 
 "dassl"));
end TestJAVA_v2;

Используя синтаксический анализатор xml, я могу изменить массу BodyShape и вектора r (вектор от frame_a до frame_b, разрешенный в frame_a). Но после моделирования я обнаружил, что изменилась только масса, а длина компонента - нет. Можно ли изменить этот вектор через файл xml?


person Marco Ramagini    schedule 08.10.2018    source источник


Ответы (1)


Некоторые параметры нельзя изменить без перекомпиляции модели.

Найдите атрибут isValueChangeable в ScalarVariable. Если isValueChangeable = "false", вы не можете изменить это значение через файл xml.

Это может произойти по следующим причинам:

  1. параметр структурный (от него зависят размеры массива)
  2. параметр имеет annotation(Evaluate=true), что в основном делает его постоянным

Дополнительная информация о редактировании после дальнейшего анализа:

  • текущая оценка внешних сил bodyShape1.r, поэтому она становится постоянной, которую нельзя изменить
  • вы можете использовать ночные сборки (v1.13) и запускать omc -d=newInst или установить в OMEdit флаги OMC на -d=newInst, чтобы использовать новую интерфейсную реализацию, которая позволяет изменять bodyShape1.r.

С -d=newInst вы получаете:

  <ScalarVariable
    name = "bodyShape1.r[1]"
    valueReference = "1711"
    description = "Vector from frame_a to frame_b resolved in frame_a"
    variability = "parameter" isDiscrete = "true"
    causality = "internal" isValueChangeable = "true"
    alias = "noAlias"
    classIndex = "86" classType = "rPar"
    isProtected = "false" hideResult = "false"
    fileName = "c:/home/adrpo33/dev/OpenModelica/build/lib/omlibrary/Modelica 3.2.2/Mechanics/MultiBody/Parts.mo" startLine = "1038" startColumn = "5" endLine = "1039" endColumn = "59" fileWritable = "true">
    <Real start="0.0" fixed="true" useNominal="false" unit="m" />
  </ScalarVariable>

который имеет isValueChangeable = "true".

adrpo33@computer MINGW64 /c/home/adrpo33/dev/OMTesting/mb
$ ./TestJAVA_v2.exe -override=bodyShape1.r[1]=2 -lv=LOG_ALL | grep 'bodyShape1.r\['
LOG_SOLVER        | info    | read override values: bodyShape1.r[1]=2
LOG_SOLVER        | info    | override bodyShape1.r[1] = 2
|                 | |       | | Real bodyShape1.r[1](start=2, fixed=true, {nominal=1}, min=-1.79769e+308, max=1.79769e+308)
|                 | |       | | Real bodyShape1.r[2](start=1, fixed=true, {nominal=1}, min=-1.79769e+308, max=1.79769e+308)
|                 | |       | | Real bodyShape1.r[3](start=1, fixed=true, {nominal=1}, min=-1.79769e+308, max=1.79769e+308)
|                 | |       | | | [87] parameter Real bodyShape1.r[1](start=2, fixed=true) = 2
|                 | |       | | | [88] parameter Real bodyShape1.r[2](start=1, fixed=true) = 1
|                 | |       | | | [89] parameter Real bodyShape1.r[3](start=1, fixed=true) = 1

Вроде нормально работает с omc -d=newInst и Model -override

person Adrian Pop    schedule 09.10.2018
comment
Вы можете заставить не оценивать параметр, но вам нужно будет изменить код для всех классов, которые определяют этот параметр, и удалить аннотацию (Evaluate = true), если она есть. Если параметр является структурным, то его невозможно изменить без перекомпиляции модели, что бы вы ни делали. - person Adrian Pop; 09.10.2018
comment
Хочу поблагодарить вас за ответ. Целью было итеративное изменение этого параметра в алгоритме оптимизации. Однако я считаю, что они являются структурными для модели, поэтому работать с ними через файл xml невозможно. Еще раз спасибо за ваше время. - person Marco Ramagini; 09.10.2018
comment
Попробуйте с -d = newInst, все должно работать нормально (надеюсь). Вам также не нужно использовать XML-файл для их изменения, вы можете использовать командную строку для исполняемого файла модели с помощью: Model -override = r [1] = 1, r [2] = 2, r [3] = 3 . - person Adrian Pop; 09.10.2018
comment
Я загрузил ночные сборки (v1.13) здесь: build. openmodelica.org/omc/builds/windows/nightly-builds/64bit Я добавил флаг моделирования в OMEdit, но атрибут isValueChangeable по-прежнему имеет значение false для bodyShape1.r. Может я установил не тот exe? Мне нужно работать с XML-файлом, потому что я реализовал несколько классов Java, которые работают с этим типом файла. Хочу еще раз поблагодарить вас за ответ. С наилучшими пожеланиями - person Marco Ramagini; 10.10.2018
comment
Из OMEdit: Инструменты- ›Параметры-› Моделирование- ›Флаги OMC - person Adrian Pop; 11.10.2018
comment
Теперь он отлично работает с этой тривиальной моделью. Я попытался использовать тот же флаг отладки на своей модели, но это не сработало. Иногда говорится, что какой-то фрейм не подключен (что не имеет смысла, потому что модель построена правильно без -d = newInst). В других случаях отображается следующая ошибка: [8] 15:11:22 Ошибка перевода [C: /dev/OM64bit/OMCompiler/Compiler/SimCode/SimCodeMain.mo: 449: 7-449: 78]: внутренняя ошибка C: \ OpenModelica1.13.0-dev-64bit \ bin \ OMEdit.exe: [неизвестное имя функции] не удалось. У вас есть предложения? Еще раз спасибо. С наилучшими пожеланиями - person Marco Ramagini; 12.10.2018
comment
К сожалению, похоже, что новый интерфейс может иметь проблемы с вашей моделью, поскольку еще не закончен. Мы работаем над устранением всех проблем, но это займет некоторое время. - person Adrian Pop; 13.10.2018
comment
Да, я тоже так думал. Я очень признателен за вашу помощь. Спасибо. С наилучшими пожеланиями. - person Marco Ramagini; 14.10.2018