今日は再びOpen Modelicaで状態機械のシミュレーションをしてみます。 Open Modelicaで状態機械をシミュレーションするには設定が必要で、それについては過去の記事で解説しています。
サンプルコード
今回使わせてもらうサンプルコードは下記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より)。
今回のコードをOpen Modelicaに流し込んだ場合、問題なくシミュレーションすることができ、次のようなグラフになります。
コードの勉強
ここからは今回のコードの中身を考えていきたいと思います。
previous()
は指定した変数の1Clock(離散時間を扱う)前の値になります。今回はClock=1秒となっているようです。これを変更するにはClock()
を弄ればできそうです。
block
はそのまま状態機械のブロックを扱う部分です。
transition
は状態機械のブロックからブロックへの移動を扱います。immediate = false
は"weak transition"と言われるもので、ブロック内でアクションを行った後に移動することを指しています。immediate = true
は"strong transition"で、ブロック内でのアクションを実行する前に移動してしまいます。
priority
は複数のtransition条件がかぶった場合の優先順位で、値が低いtransitionが実行されます。
reset
とsynchronize
は下記のように説明されてはいますがまだ理解できていません。
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.
今日はここまでにします。