Можно ли использовать параметр для установки атрибута модуля для компонента? - PullRequest
2 голосов
/ 15 мая 2019

Пока что с использованием 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" ) не решает проблему.

1 Ответ

0 голосов
/ 03 июля 2019

Мне дали отзыв о сообществе Wolfram от кого-то из Wolfram MathCore по этому вопросу:

Вы правы в том, что это не противоречит спецификациихотя сделать его константой имеет больше смысла, так как вы лишите законной силы всю статическую проверку юнитов, если вам разрешено менять юнит после построения симуляции.Мы подали вопрос о спецификации, касающейся этой ( спецификации спецификации Modelica # 2362 ).

Итак, MatheCore немного впереди игры в предложении об изменении спецификации Modelica, которое они уже внедрили.; -)

Примечание: использование в Wolfram System Modeler (12.0) аннотации Evaluate = true не решит проблему (см. Комментарий выше @matth).

В качестве обходного пути переменные, используемые для установки атрибута unit, должны иметь константу переменность , но, тем не менее, могут быть включены в диалоговые окна пользователя в интерактивном режиме с использованием annotation(Dialog(group = "GroupName")).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...