Почему Dymola сообщает, что переменная x0
необъявлена при вызове translateModel(problem = "Sandbox.Test(x_start=x0)")
? Обратите внимание, что translateModel
— это встроенная внутренняя функция Dymola, позволяющая инициировать перевод модели из командной строки. Входными данными для функции является класс в виде строкового ввода.
В моем примере, демонстрирующем мой вопрос, модель Test
определяется следующим образом:
model Test
parameter Real x0=1.234;
parameter Real x_start=-1.234;
Real x(start=x_start, fixed=true);
equation
der(x) = time;
end Test;
Как и ожидалось, я могу расширить test и применить тот же модификатор, что и в следующей модели:
model Tester
extends Test(x_start=x0);
end Tester;
В случае модели Tester
вызов translateModel(problem = "Sandbox.Tester")
завершается без ошибок.
Кажется, это похоже на вопрос, заданный в этом посте , но это не совсем то же самое.
Так может ли кто-нибудь объяснить, почему вызов translateModel(problem = "Sandbox.Test(x_start=x0)")
не работает?
Должны ли модификаторы в этой строке быть буквальными значениями? Или есть другой способ сделать этот вызов с помощью модификатора?
Функция translateModel
— это функция Dymola для выполнения перевода модели из командной строки (командная строка Dymola). Я должен был уточнить это в своем исходном сообщении. Я отредактирую это, чтобы было понятно.
Модификаторы в этом аргументе для translateModel
обрабатываются аналогично
model Tester=Test(x_start=x0);
вместо того, чтобы как
model Tester
extends Test(x_start=x0);
end Tester;
Таким образом, даже если вы не ограничены строго литералами, вы не можете использовать в модификаторе какие-либо локальные переменные из модели.
Однако я не уверен, зачем вам это нужно — если бы вы включили более реалистичный пример, возможно, было бы проще предложить другое решение.
Отлично, спасибо, Ганс, это ответ на мой вопрос. Я не думал об этом с точки зрения краткого определения класса или о том, что translateModel
обрабатывает модификаторы аналогичным образом. Конкретный случай возник как часть некоторой инфраструктуры внутреннего тестирования, где строка, подобная этому примеру, вызывала сбой перевода для конкретного тестового примера. Я не мог объяснить, почему это не удалось, и поэтому искал ответ здесь.
@JesseGohl, если это отвечает на ваш вопрос, пожалуйста, рассмотрите возможность «принятия» и его.
Я протестировал код для Test и Tester в OpenModelica и работает, как вы говорите, то есть в Tester строка кода «расширяет Test(x_start=x0)», здесь x0 относится к объявлению x0 внутри Test. Если у вас есть другое объявление x0, скажем, перед строкой кода «extends Test(...)», вы получите ошибку компиляции. Было бы полезно, если бы вы добавили код для простой версии «translateModel()», чтобы я хотя бы лучше все это понял.