0

ステート チャートを介してシミュレーションで 2 つのモデルを 1 つずつ実行しようとしていました。擬似コードは次のとおりです。モデル テストには、stateA と stateB の 2 つのブロックがあります。シミュレーションの開始時に、stateA が実行されます。10 秒後、stateA が停止し、stateB が実行されます。停止点での v の値は、stateA から stateB に転送する必要があります。誰かアドバイスをくれませんか?どうもありがとう!


model test 
  inner Integer v(start = 1); 

  block StateA 
    outer output Integer v; 
  equation 
    v = previous(v) + 2; 
  end StateA; 
  StateA stateA; 

  block StateB 
    outer output Integer v; 
  equation 
    v = previous(v) - 1; 
  end StateB; 
  StateB stateB; 

equation 
  initialState(stateA); 
  transition(stateA, stateB, t >= t0, immediate=false); 
end test;

もう 1 つの理由は、次の単純な例を openModelica でシミュレートできないのはなぜですか?

model StateMachine1
  inner Integer i(start=0);

  block State1
    outer output Integer i;
  equation
    i = previous(i) + 2;
  end State1;
  State1 state1;

  block State2
    outer output Integer i;
  equation
    i = previous(i) - 1;
  end State2;
  State2 state2;

equation
  initialState(state1);
  transition(state1, state2, i > 10, immediate=false);
  transition(state2, state1, i < 1, immediate=false);
end StateMachine1;

エラー: クラス initialState がスコープ StateMachine1 に見つかりません

4

2 に答える 2

1

あなたのモデルについてそれを実現する最善の方法は、3 つのモデルを 3 つの異なるクラスでコーディングし、モデルのすべての変数を含むラッパーを用意し、ラッパーに when - elsewhen を実装することだと思います。 - アクティブ化されたモデルの状態変数を再起動する elsewhen ステートメント、および最後に、アクティブ ブロックの対応する 1 つにラッパー変数をリンクする if - elseif - else ステートメント。このようにして、エラーを発生させることなく、モデル内の変数の因果関係を変更することもできます。例として、壊れた振り子モデルのケースを投稿します。

model BreakingPendulum2
extends BasePendulum(p(m=1, g=9.81, L=0.5));
input Boolean Broken;
protected
Pendulum pend (p=p, u=u, enable=not Broken);
BrokenPendulum bpend(p=p, u=u, enable=Broken);
equation
when Broken then
reinit(bpend.pos, pend.pos);
reinit(bpend.vel, pend.vel);
end when;
pos = if not Broken then pend.pos else bpend.pos;
vel = if not Broken then pend.vel else bpend.vel;
end BreakingPendulum2;

クラスBasePendulumは、シミュレートされたシステムについて計算するために必要な変数を実装します。その cass から拡張して、さまざまなケースで有効なモデルの 3 つの異なるバージョンを実装します。次に、私が投稿したようなブロックを作成し、さまざまなモデルの有効性に基づいてロジックを実装します。

于 2013-03-18T10:53:01.243 に答える
0

あなたがしようとしていることは、Modelica 3.3 仕様に導入された新しいステート マシン機能に関する資料に詳しく説明されています。以下に、いくつかの参考資料を示します。

モデルの誤りは、Modelica 3.3 ではすべての変数のサンプリング時間の推論が導入されたことです。つまり、時間の離散化が異なる離散変数を同じ方程式で使用することはできません。つまり、同じ方程式内で同じクロックを持つ変数のみを使用する必要があります。方程式。あなたの場合、連続変数(時間)と離散変数vがあります。したがって、離散変数vの動作に影響を与える遷移ステートメント(modelicaコードの変換中に方程式になる)に時間を使用することはできません必要なことを行うための 1 つの解決策は、モデル内のすべての変数に対してクロックを定義し、ロジックを構築することです (複数のサンプリング時間が必要な場合は、superSample などの特別な演算子を使用する必要があります)。

    model StateMachine3
  Real i(start = 0,fixed=true);
  inner Real id(start = 2);
  Real td(start = 0,fixed=true);

  State1 state1;

  model State1
    outer output Real id;
  equation 
    id = 2;
  end State1;

  model State2
    outer output Real id;
  equation 
    id = - 1;
  end State2;
  State2 state2;
equation 
  td = sample(time, Clock(1, 10));
  when Clock(1, 10) then
    i =  previous(i) + id;
  end when;
  initialState(state1) ;
  transition(
    state1,
    state2,td > 10,
    immediate=false,
    reset=false,
    priority=1,synchronize=false);
end StateMachine3;
于 2013-03-11T15:53:48.153 に答える