Open Modelicaで状態機械をシミュレーションする。
Otepipiです。Open Modelicaを使って状態機械(State Machine)をシミュレーションしてみました。
シミュレーションしたのは下記のような状態機械図になります。これはModelica3.3のドキュメントにあるものです。
https://www.modelica.org/documents/ModelicaSpec33Revision1.pdf
これをコードにすると下記のようになります。これも上記ドキュメントのまんま引用です。
block HierarchicalAndParallelStateMachine
inner Integer v(start=0);
State1 state1;
State2 state2;
equation
initialState(state1);
transition(state1,state2,activeState(state1.stateD) and activeState(state1.stateY), immediate=false);
transition(state2,state1,v >= 20, immediate=false);
public
block State1
inner Integer count(start=0);
inner outer output Integer v;
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;
block StateC
outer output Integer count;
equation
count = previous(count) + 1;
end StateC;
StateC stateC;
block StateD
end StateD;
StateD stateD;
equation
initialState(stateA);
transition(stateA, stateB, v >= 6, immediate=false);
transition(stateB, stateC, v == 0, immediate=false);
transition(stateC, stateA, true, immediate=false, priority=2);
transition(stateC, stateD, count >= 2, immediate=false);
public
block StateX
outer input Integer v;
Integer i(start=0);
Integer w; // = v;
equation
i = previous(i) + 1;
w = v;
end StateX;
StateX stateX;
block StateY
Integer j(start=0);
equation
j = previous(j) + 1;
end StateY;
StateY stateY;
equation
initialState(stateX);
transition(stateX, stateY, stateX.i > 20, immediate=false, reset=false);
end State1;
block State2
outer output Integer v;
equation
v = previous(v) + 5;
end State2;
end HierarchicalAndParallelStateMachine;
これをOpenModelicaで実行すると下記のようなエラーになってしまいます。
Failed to elaborate expression: initialState(stateX).
解決方法を調べてみたところ下記のような書き込みを見つけました。
Code:
Edited by: milanvk - Aug-24-16 14:33:45
Re: Simulation hierarchical state machines Modelica 3.3
Aug-24-16 14:35:20
これを見て自分も見よう見まねで設定を変更してみました。
ツール→オプション→シミュレーションにあるOMCフラグに+std=3.3を設定します。
するとシミュレーションは問題なく成功し、下記のように状態機械のシミュレーションができました。
今日はここまでにします。