Можно ли использовать параметр для установки атрибута модуля для компонента?
Пока, используя Wolfram System Modeler 4.3 и 5.1, следующий минимальный пример будет компилироваться без ошибок:
model UnitErrorModel
MyComponent c( hasUnit = "myUnit" );
block MyComponent
parameter String hasUnit = "1";
output Real y( unit = hasUnit );
equation
y = 10;
end MyComponent;
end UnitErrorModel;
Но с новым выпуском WSM 12.0 (скачок в версии происходит из-за выравнивания с текущим выпуском флагмана Wolfram Mathematica), я получаю сообщение об ошибке:
Внутренняя ошибка: Codegen.getValueString: Непостоянное выражение:c.hasUnit
(Примечание: ошибка дается WSMLink'WSMSimulate
в Mathematica 12.0, внутри которой работает System Modeler 12.0; здесь просят "InternalValues"
свойство вышеуказанной модели, так как я не установил WSM 12.0 прямо сейчас).
Попытка смоделировать вышеупомянутую модель в OpenModelica [OMEdit v. 1.13.2 (64-bit)] показывает:
SimCodeUtil.mo: 8492: 9-8492: 218]: Внутренняя ошибка Неожиданное выражение (должно было быть обработано ранее, возможно, во внешнем интерфейсе. Выражение Unit/displayUnit не является строковым литералом:c.hasUnit
Таким образом, кажется, что для установки атрибута единицы я не могу использовать переменную, которая имеет переменную параметра? Почему это так, ведь не должно быть достаточно того, что компилятор может жестко связать модуль при компиляции во время выполнения (после того, как данная модель будет работать без ошибок в WSM 4.3 и 5.1)?
РЕДАКТИРОВАТЬ: Из ответа на мой старый вопрос, я полагал, что по крайней мере окончательные параметры могут быть использованы для установки атрибута блока. Окончательная модификация (например, c( final hasUnit = "myUnit" )
не решает проблему.
0 ответов
Кто-то из Wolfram MathCore дал мне отзыв о сообществе Wolfram по этой проблеме:
Вы правы в том, что это не противоречит спецификации, хотя сделать его константой имеет больше смысла, поскольку вы аннулируете все свои статические проверки единиц, если вам разрешено изменять единицы после построения симуляции. Мы подали вопрос о спецификации по этому поводу (проблема спецификации Modelica № 2362).
Итак, MatheCore немного опередил игру, предложив изменение спецификации Modelica, которое они уже реализовали.;-)
Примечание. В Wolfram System Modeler (12.0) с использованием аннотации Evaluate = true
не решит проблему (см. комментарий @matth выше).
В качестве обходного пути переменные, используемые для установки unit
атрибут должен иметь постоянную изменчивость, но, тем не менее, может быть включен в диалоги пользователя для интерактивного изменения с помощьюannotation(Dialog(group = "GroupName"))
.