Дискретная семантика Modelica

Я пытаюсь понять семантику Modelica для дискретного сигнала. Учитывая ступенчатый сигнал, который мгновенно переходит от 0,0 к 1,0 с бесконечным наклоном при t = 0,5. Затем предположим, что у вас также есть оператор when, как в следующем коде:

model test_discrete
  Modelica.Blocks.Interfaces.RealOutput q(start = -1.0);
  Modelica.Blocks.Sources.Step step(
    height=1,
    offset=0,
    startTime=0.5)

algorithm 
  when time >= 0.5 and time <= 0.5 then
    q := step.y;
  end when;
equation 
end test_discrete;

У меня вопрос, будет ли q 0,0 или 1,0? Предположим, что q инициализировано значением -1. Когда я реализую код, он переходит на 1.0, но меня беспокоит то, что 0.0 также удовлетворяет уравнению. Так что мне просто интересно, есть ли какие-то правила, предотвращающие недетерминированное поведение. Если бы кто-то мог мне помочь или указать на любую литературу, я был бы очень признателен! Спасибо за ваше время.


person jackfrost9p    schedule 02.08.2013    source источник


Ответы (2)


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

Но я также хотел бы указать, что по сути является ошибкой в ​​вашем коде. Ты говоришь:

when time >= 0.5 and time <= 0.5 then
  q := step.y;
end when;

Я предполагаю, что вы пытаетесь установить значение q в тот же «момент», что и step.y (а затем еще раз задаетесь вопросом, что разрешается первым). Но оператор when работает не так. Я подозреваю, что вы пытаетесь представить "момент", когда step.y устанавливается как time >= 0.5 and time <= 0.5. Но это не так. В тот момент, когда он установлен, остается только time >= 0.5. Ключевым моментом здесь является то, что when не то же самое, что if.

Говоря более формально, уравнение внутри предложения when становится активным когда условие, связанное с предложением when, становится истинным. Это действительно выходит за рамки вашего вопроса, но вам следует ознакомиться с различиями между when и if, потому что это очень важная семантика.

person Michael Tiller    schedule 05.08.2013
comment
Спасибо за ваш ответ. Я тоже так думал, он недетерминирован. Что касается оператора when, да, я согласен и понимаю разницу между оператором if. Я новичок в Modelica и, естественно, думал в терминах традиционного оператора if, не осознавая этого. Спасибо, что указали на это. - person jackfrost9p; 05.08.2013

Мой инстинкт подсказывает мне, что вам может понадобиться pre () для условий, но это только мое предположение.

person Hang Yu    schedule 02.08.2013
comment
Оказывается, pre здесь не играет роли. Оператор pre всегда применяется к текущему событию. Из-за асинхронного характера when в этом случае событие, которое устанавливает step.y, и событие, которое устанавливает q, не связаны. Таким образом, pre(step.y) - это то же самое, что step.y в этом контексте. - person Michael Tiller; 05.08.2013