2013-08-02 2 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; 

내 생각 엔 당신이 step.y이 설정되어 있습니다 (다음 추가하는 궁금해하는 첫 번째 해결됩니다)하는 것과 같은 "순간"에 q의 값을 설정하려고하는 것입니다. 그러나 이것은 when 문이 작동하는 방식이 아닙니다. step.ytime >= 0.5 and time <= 0.5으로 설정되는 "인스턴트"를 표현하려고합니다. 그러나 그것은 정확하지 않습니다. 설정되는 순간은 time >= 0.5입니다. 여기서 핵심은 whenif과 같지 않음을 나타냅니다.

좀 더 공식적으로 말하자면 when 절과 관련된 조건이 참이되면 일 때 when 절 내의 방정식이 활성화됩니다 (). 이는 실제로 질문의 범위를 벗어나지 만, 매우 중요한 의미이므로 whenif의 차이점을 숙지해야합니다.

+0

답장을 보내 주셔서 감사합니다. 그것은 저의 생각이었고 비 결정적입니다. when 문에 관해서, 그렇습니다, 나는 동의하고 if 문 사이의 차이를 이해합니다. 나는 Modelica를 처음 접했고 자연스럽게 그것을 깨닫지 않고 전통적인 if 문과 관련하여 생각했다. 그것을 지적 주셔서 감사합니다. – jackfrost9p

0

내 직감은 조건에 대해 pre()가 필요할 수도 있지만 내 추측이라고 말합니다.

+1

''pre''는 여기서 역할을하지 않습니다. 'pre' 연산자는 항상 현재 이벤트에 적용됩니다. 이 경우에'when'의 비동기 특성 때문에'step.y'를 설정하는 이벤트와'q'를 설정하는 이벤트는 분리됩니다. 따라서,'pre (step.y)'는이 문맥에서'step.y'와 같습니다. –