2017-11-27 111 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

関連する問題