2017-11-27 2 views
0

HVAC 시스템의 결함 포함 모델을 구현하려고합니다. 오류는 사용자 정의 시간 (이 경우 faultTime = 1000)에서 시작됩니다. 그러나 if 문의 첫 번째 부분은 전혀 구현되지 않습니다. 다음은 질문Modelica에서 중첩 된 if 문을 구현하는 방법은 무엇입니까?

fcuModel FCU; 
Modelica.Blocks.Continuous.LimPID PI(k = 300, Ti = 1, yMax = 1, yMin = 1e-4); 
parameter Real faultTime = 1000; 
// fault modes: 0-normal, 1-fan failed, 2-valve stuck shut... 
parameter Integer faultMode = 1; 
equation 
    connect(PI.u_m,FCU.Ts_zon); // connects zone temperature to PID measurement 
    PI.u_s = 21; // set-point for zone temperature 
    if time<faultTime then 
    PI.y = FCU.val; 
    PI.y = FCU.fs; 
    else 
    if faultMode == 0 then 
     PI.y = FCU.val; 
     PI.y = FCU.fs; 
    elseif faultMode == 1 then 
     PI.y = FCU.val; 
     FCU.fs = 1e-4; 
    end if; 
    end if; 

내가 시뮬레이션에 관련 코드의 조각이되어 다음, 오류없이 실행하지만 그것은 바로 처음 1000에 대한 오류가없는 상태를 시뮬레이션하지 않고, faultMode == 1 아래의 식에 간다 초.

답변

4

일부 변수를 도입하고 일부 매개 변수를 변경하여 직접 작동하도록 모델을 수정했습니다. 그 결과는 다음과 같습니다 :

model FCU 

    Modelica.Blocks.Continuous.LimPID PI(k = 0.1, Ti = 1, yMax = 1, yMin = 1e-4); 

    parameter Real faultTime = 1000; 
    parameter Integer faultMode = 1; 

    Real val; 
    Real fs; 

equation 
    PI.u_s = 21; // set-point for zone temperature 
    PI.u_m = 20.9999; // no feedback as no system available 

    if time<faultTime then 
    PI.y = val; 
    PI.y = fs; 
    else 
    if faultMode == 0 then 
     PI.y = val; 
     PI.y = fs; 
    elseif faultMode == 1 then 
     PI.y = val; 
     fs = 1e-4; 
    else 
    assert(false,"Unknown faultMode"); 
    end if; 
    end if; 
    annotation (experiment(StopTime=2000), uses(Modelica(version="3.2.2"))); 
end FCU; 

결과 (Dymola에서 시뮬레이션 한 것)는 내가 기대했던 것 같습니다. 그것은 다른 케이스를 벗어났습니다처럼이 도움이 Result

희망 ...

+1

보인다. – tbeu

+2

faultMode는 정수형 매개 변수이기 때문에 else-case는 필요하지 않지만 "faultMode == 1 then then ... else"가 더 깨끗한 경우 동의합니다. –

+1

Modelica 3.4 사양의 8.3.4 절 : 스위칭 조건으로 배타적 매개 변수식이없는 방정식 섹션의 If 방정식은 각 분기에서 같은 방정식 수를 가져야합니다. – matth

관련 문제