2013-08-02 31 views
1

我想了解离散信号的Modelica语义。给定一个在t = 0.5时无限斜率瞬时从0.0变化到1.0的阶跃信号。那么我们假设你也有如下代码中的when语句:Modelica离散语义

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也满足方程。所以我只是想知道是否有任何规则来防止非决定性行为。如果有人能帮忙或指点我的任何文学,那将不胜感激!谢谢你的时间。

回答

1

好吧,几点意见。首先,你的代码是非确定性的。对于通过共同的“原因”彼此没有联系的事件的顺序没有保证。 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。关键是whenif不一样。

为了更加正式地说明,when子句中的等式变为活动when子句相关的条件成为真时。这实际上超出了您的问题范围,但您应该熟悉whenif之间的差异,因为这是非常重要的语义。

+0

感谢您的回复。这也是我的想法,它是非确定性的。关于何时声明,是的,我同意并理解if声明之间的区别。我是Modelica的新手,自然而然地想到传统的if语句而没有意识到这一点。感谢您指出。 – jackfrost9p

0

我的直觉告诉我,你可能需要一个pre()作为条件,但这只是我的猜测。

+1

事实证明'pre'在这里不起作用。 'pre'运算符总是适用于当前事件。由于在这种情况下“when”的异步特性,设置“step.y”的事件和设置“q”的事件被解耦。因此,在此上下文中,“pre(step.y)”与“step.y”相同。 –