Пока что с использованием 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-разрядная версия)] выдает:
SimCodeUtil.mo: 8492: 9-8492: 218]: внутренняя ошибка Неожиданное выражение (должно было быть обработано ранее, возможно, во внешнем интерфейсе. Выражение Unit / displayUnit не является строковым литералом: c.hasUnit
Таким образом, кажется, что для установки атрибута единицы измерения я не могу использовать переменную с изменчивостью параметра? Почему это так, ведь не должно быть достаточно того, что компилятор может жестко связать модуль при компиляции во время выполнения (после того, как данная модель будет работать без ошибок в WSM 4.3 и 5.1)?
РЕДАКТИРОВАТЬ: От ответа на мой старый вопрос Я полагал, что по крайней мере окончательные параметры могут быть использованы для установки атрибута блока. Завершение модификации (например, c( final hasUnit = "myUnit" )
не решает проблему.