システムとモデリング

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

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

Otepipiです。Open Modelicaを使って状態機械(State Machine)をシミュレーションしてみました。

シミュレーションしたのは下記のような状態機械図になります。これはModelica3.3のドキュメントにあるものです。

https://www.modelica.org/documents/ModelicaSpec33Revision1.pdf

 

f:id:Otepipi:20180728190059p:plain

これをコードにすると下記のようになります。これも上記ドキュメントのまんま引用です。

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で実行すると下記のようなエラーになってしまいます。

f:id:Otepipi:20180728192208p:plain

Failed to elaborate expression: initialState(stateX).

 

解決方法を調べてみたところ下記のような書き込みを見つけました。

f:id:Otepipi:20180728192641p:plain

I have been trying with the simple state machine example with the latest build version. But the Modelca 3.3 builtin functions like previous, clock etc, are not flattening. It gives the error "Failed to elaborate expression: previous(i)." when I try to instantiate. is there any external dependencies for this feature or do I need to add any special compiler flags? Or is this synchronous extensions not yet supported? 

The simple state machine code 

Code:

 

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); 
transition(state2,state1,i < 1,immediate=false); 
initialState(state1); 
end Simple_NoAnnotations; 

Edited by: milanvk - Aug-24-16 14:33:45

 

Re: Simulation hierarchical state machines Modelica 3.3

 

You need to activate OMC Flags: +std=3.3 in OMEdit via Tools->Options->Simulation as these things are only available in Modelica Specification 3.3.

 これを見て自分も見よう見まねで設定を変更してみました。

ツール→オプション→シミュレーションにあるOMCフラグに+std=3.3を設定します。

するとシミュレーションは問題なく成功し、下記のように状態機械のシミュレーションができました。

f:id:Otepipi:20180728194659p:plain

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