システムとモデリング

SysML, Matlab/Simulink,他モデリング全般について。たまにプロジェクトマネジメント。

Open Modelicaで状態機械をシミュレーションする。その2

今日は再びOpen Modelicaで状態機械のシミュレーションをしてみます。 Open Modelicaで状態機械をシミュレーションするには設定が必要で、それについては過去の記事で解説しています。

otepipi.hatenablog.com

サンプルコード

今回使わせてもらうサンプルコードは下記PDFにありましたものです。

https://openmodelica.org/images/docs/openmodelica2015/OpenModelica2015-talk14-OMStateMachines_Bernhard%20Thiele.pdf

model Simple_NoAnnotations "Simple state machine"
inner Integer i(start =0);
block State1
outer output Integer i;
output Integer j(start =10);
equation
i = previous(i) + 2;
j = previous(j) - 1;
end State1;
State1 state1;
block State2
outer output Integer i;
equation
i = previous(i) - 1;
end State2;
State2 state2;
equation
transition(state1 ,state2 ,i > 10, immediate =false ,
reset=true , synchronize =false ,priority =1);
transition(state2 ,state1 ,i < 1, immediate =false ,
reset=true , synchronize =false , priority =1);
initialState(state1);
end Simple_NoAnnotations ;

これは状態機械図で次のようになります(PDFより)。

f:id:Otepipi:20180803053005p:plain

今回のコードをOpen Modelicaに流し込んだ場合、問題なくシミュレーションすることができ、次のようなグラフになります。

f:id:Otepipi:20180803053143p:plain

コードの勉強

ここからは今回のコードの中身を考えていきたいと思います。

previous()は指定した変数の1Clock(離散時間を扱う)前の値になります。今回はClock=1秒となっているようです。これを変更するにはClock()を弄ればできそうです。

blockはそのまま状態機械のブロックを扱う部分です。

transitionは状態機械のブロックからブロックへの移動を扱います。immediate = falseは"weak transition"と言われるもので、ブロック内でアクションを行った後に移動することを指しています。immediate = trueは"strong transition"で、ブロック内でのアクションを実行する前に移動してしまいます。

priorityは複数のtransition条件がかぶった場合の優先順位で、値が低いtransitionが実行されます。

resetsynchronizeは下記のように説明されてはいますがまだ理解できていません。

If reset = true, the states of the target state are reinitialized, i.e. state machines are restarted in initial state and state variables are reset to their start values. If synchronize=true, any transition is disabled until all state machines of the from-state have reached final states, i.e. states without outgoing transitions.

今日はここまでにします。