Activate でステートマシンをモデル化してみた
Activate でステートマシンをモデル化してみた
Activate 2022 でステートマシン(状態機械)機能が搭載されました。正確には、ステートマシンをモデル化するのに便利な専用ライブラリであるASM(Activate State Machine)ライブラリが正式に導入されたということになります。
ASMについては2022年4月にAltair Knowledge Baseに投稿された「Activateステートマシンモデルについて(インストール方法・使い方・応用例)」
https://community.altair.com/community/?id=kb_article_view&sysparm_article=KB0117632
でもその使い方が紹介されていますが、ここではUMLやSysMLやSimulinkやAltair Embedなどでも導入されている従来のステートマシンモデルと比較参照しながらActivateのステートマシンモデルの特徴や基本的なモデル化方法を紹介します。
ASMのインストール方法
Activate 2022では新規ライブラリの管理を自動化するためのツールであるExtension Managerが搭載されており、ASMはそれを通して以下のように簡単にインストールが可能です。
メニューからFile > Extension Managerを選択
表示されたExtension Managerウィンドウ内のスイッチをオンに切り替えます。
それにより、ライブラリウィンドウにASMライブラリが表示され、以下のように使用が可能になります。
ちなみに、以下のようにExtension Managerウィンドウ内のDetailsをクリックして表示されるウィンドウ内のview documentationをクリックするとASMについて詳しく説明したUser’s Manual(英語)が表示されます。
ステートマシンとは?
SysMLの教科書である ”システムズモデリング言語SysML”(西村秀和監訳)によると、ステートマシンとは「イベントによって引き起こされる状態聞の遷移に関するエンティティの振る舞いを表す」と定義されています。例えば産業機械を考えると、ある動作モード(これを “状態” もしくは “ステート” と呼びます)にある時、何らかの条件を満足した場合に別の動作モードに移ることになります。この動作モード間の移動を “遷移” と呼び、遷移を起こす条件を遷移条件と呼んでいます。遷移条件は通常は論理式もしくは論理変数(イベント)で表現します。
このステートマシンをグラフィカルにダイヤグラムで表したのが状態遷移図です。例えば、SysMLで表現される状態遷移図のイメージは以下のようになります(”システムズモデリング言語SysML”から引用)。これは車両運転状態とそれらの遷移を示しています。
上図中の矢印は遷移を表しており、その矢印に付属しているのが遷移条件です。また、角丸の長方形で表現されているのがステート(状態)で中に書かれている名称がステート名です。ステートが上下に分かれている場合は、上がステート名で、下がそのステート内で行われる動作です。なお、黒丸で始まる遷移は初期(もしくは、ディフォルト)遷移と呼ばれ、矢印の先のステートが最初に実行されるステートになります。
状態遷移図はシステムの種々の状態間の遷移条件を表現したものであるため、SimulinkやActivateやEmbedのブロックダイアグラムのように、状態間で何らかの情報やデータがやり取りされることを表現しているわけではありません。あくまで状態や動作モードの移り変わりを表現しているため、ブロックダイアグラムで表現しようとするとダイアグラムが非常に複雑になる場合があります。
簡単なステートマシンの例
以下に、上で紹介したAltair Knowledge Baseの記事である「Activateステートマシンモデルについて(インストール方法・使い方・応用例)」で使われている簡単なサーモスタットモデルを用いてActivateでのステートマシンの表現方法を紹介します。
使用するステートマシンモデルを以下に示します。
ステートは二つあり、”OFF” ではヒーターがオフになっていて熱が供給されていない状態を表しており、もうひとつの ”ON” ではヒーターから熱が供給されている状態です。最初はOFFが起動しますが(この時、OFFは “アクティブ” であり、ONは “非アクティブ” でであると言います)、室内温度が17℃以下になるとステートがOFFからONに遷移します(すなわち、今度はステートONがアクティブになります)。次にこの状態の時に室内温度が25℃以上になると、再度遷移しステートがONからOFFに戻ります。
このステートマシンを例えばAltair Embedのステートマシン機能を用いて状態遷移図を描くと以下のようになります(添付モデル:Heater_Embed.scm)。
ちなみに、Embedの状態遷移図はSimulink等の状態遷移図とよく似ているため、Simulink等においても以下の議論はほぼ通用すると考えていただいて構いません。
上図内の[Temp <= 17]や[Temp >= 25]の論理式は遷移条件を表しており、室内温度を表す変数Tempが17以下になるとOFFからONへ遷移し、25以上になるとONからOFFに遷移することを示しています。Embedではこの論理式をC言語で記述しますが、SimulinkではCまたはMATLAB言語で記述します。
ステート枠内下側に記述されているのはそのステートがアクティブになった時(Entryキーワード)もしくは、アクティブになっている状態が続いている時(DOキーワード)に実行されるコマンドです(ステートアクションと呼びます)。この問題ではOFFがアクティブになった時は状態を表す変数であるstateに1を代入しており、ONでは同様にstateに2を代入しています。
ちなみに、上図でステートONの枠が太線になっているのはONがアクティブになっていることを示しています。ステートマシンでは基本的にはアクティブになっているステートは1つだけに限定されます。これは、ステートは “排他的” であると表現されています。この性質は非常に重要です。
このステートマシンモデルに12℃から32℃の間で正弦波的に変化する室内温度を与えた時の結果を以下に示します。
ここで、結果グラフ中の青い線が変数stateの変化結果であり、赤い線は入力である室内温度です。ちなみに、上図中のHeaterブロックを開くと先述した状態遷移図が表示されます。
Activateでのステートマシンの表現
先述のように、状態遷移図では状態の移り変わりが表現されていますが、Activateには元々これをモデル化するための機能であるアクティベーション機能が装備されています。そのため、Activateではステートマシンはこのアクティベーション機能を用いてモデル化しています。
以下にまずはASMを用いてActivateでモデル化したサーモスタットのステートマシンモデルを示します(添付モデル:Heater_Activate.scm)。
マスクスーパーブロックであるStateBlockブロックおよびがOFFとONの二つのステートをモデル化しています。Embedでは角丸の長方形でステートを表現していましたが、Activateでは楕円で表現します。この二つのステートを結んでいる赤い矢印(リンク)が遷移を表しています。Embedでは遷移に曲線を用い、かつ、ステートの上下左右のどの面にでも接地できますが、Activateのアクティベーション機能ではリンクは折れ線、接続場所は、入力は上面、出力は下面と規定されているためこのような形状での接続になります。
StateActivationブロックはアクティブなステートブロックがその時点で1つであることを監視するためのブロックです。先述したように、ステートは排他的であり、複数のステートがアクティブになることは基本的にはできません。StateActivationブロックを挿入することにより自動的にこれを監視してくれます。
EventInputブロックおよびは1階層上からのアクティベーション信号を受け取ります。 はディフォルト遷移を意味し、はStateActivationブロックを有効化します。
StateBlockブロックは先述のようにマスクされたスーパーブロックですが、例えばONブロックの内部構造は以下のようになっています。
上図の左側の部分がステートが実行する作業(ステートアクション:Embedモデルの場合はステート枠の下側で定義されています)を表しており、右側の部分が遷移条件を表現しています。Embedでは両方ともCのステートメントで表現していましたが、Activateではブロックダイアグラムで表現しているためC言語を習得する必要はありません。
左側のIntializeブロックはステートOFFからのアクティベーション信号で起動し、下に接続されているブロックダイアグラムを実行します。その実行終了後、(内部的に)右側のActionブロックに信号を送り遷移条件を実行します。
なお、StateBlockはその内部にまた複数のStateBlockを含むことができるため、ステートが階層構造になるようなモデルを作成することも可能です(デモモデルのTrafficLigh.scmを参照)。
次に、上で既に説明したStateBlockの階層の一つ上の階層を説明します。すなわち、下図の左下側の階層2のモデルです。
この階層では今まで説明した階層3のモデルを1つのStateMachineスーパーブロックにカプセル化しています。このことにより、例えば、以下のようにStateMachineブロックを複数設置することによりステートマシンの並列化が容易に行えることになります(デモモデル:elevator.scm参照)。
また、この階層を作ることにより、ステートマシンを独立させてステートのアクティブ化を管理することができ、Activateの他のブロックダイアグラムとの接続も行いやすくなります。
先述したEmbedモデルと同様に、正弦波変化する室温をこのステートマシンに与えると(上図の階層1モデル)、以下のような結果になり、Embedと結果が一致することが分かります。
ASMライブラリ
ASMライブラリはステートマシンをモデル化するためのブロックが含まれているライブラリです。このライブラリに含まれているブロックは全て、既存の機能であるアクティベーション機能とブロックダイアグラムを用いて作成されています。すなわち、他のライブラリのように新たにゼロからコーディングされたブロックではありません。そのため、既存のアクティベーション機能との整合性が良く、新たな使用方法をそれほど習得する必要なく使うことができるというメリットがある一方、通常のアクティベーション関連ブロックが持つ規定(例えば、リンクは折れ線しか許されない、ブロックの上下面しか接続には使えない等)に縛られることにより従来の状態遷移図とは異なった外観になるというデメリットもあります。
前述した簡易モデルで既にいくつかのASMライブラリのブロックを紹介しましたが、ここではそれら以外の主なブロックを簡単に紹介します。
上図がASMライブラリに含まれているブロックの全てですが、その中のTop_SM_Diagramブロックは状態遷移図の最上層に置き、ステートマシン以外との接続を行うためのマスクスーパーブロックです。このブロックはテンプレートとして使うように設計されており、ディフォルトでは以下のように2つのStateMachineブロックを含んでいます。このStateMachineブロックは通常のスーパーブロックであり(つまり、AMSライブラリは含まれていません)、各ブロックが複数のStateBlockブロックと1つのStateaActivatetionブロックを含みます。要するに、ひとつのStateMachineブロックが独立した状態遷移図を構成することになります。
前述のように、ステートは基本的には排他的であり同時にアクティブになるのは1つだけですが、同時に2つ以上のステートをアクティブ化したい場合(ステートの “パラレル化” と呼びます)、上図のように複数のStateMachineブロックを並列に配置するようにします。
上図のようにStateMachineスーパーブロックにはActivatedSetSignalブロックとActivatedGetSignalブロックがディフォルトで2つずつ装備されています(必要に応じて増減することが可能です)。これはStateMachineブロック内とデータをやり取りするためです。StateMachineブロックは状態遷移図としての体裁をとるためにアクティベーション信号以外のポートを設けることを避けるように勧められています。このため、直接リンクを結ぶのではなくSetSignal/GetSignalブロックを用います。また、SetSignal/GetSignalではなくActivatedSetSignal/ActivatedGetSignalを用いているのはステートのアクティブ化を制御するためです。
最後にEnitialEventExtractは、Top_SM_Diagramブロックに入ってきたアクティベーション信号(基本的には、外側のSampleClockから信号が入ることが多い)をディフォルト遷移と遷移アクション用に分ける役目を持っています。(以上)
参考文献:
- Altair Engineering Inc., “ACTIVATE STATE MACHINE LIBRARY User’s Manual”
- Altair Engineering Inc., ”Activateステートマシンモデルについて(インストール方法・使い方・応用例)”, Altair Knowledge Base(https://community.altair.com/community/?id=kb_article_view&sysparm_article=KB0117632)
- Altair Engineering Inc., “Introduction to altair embed, v2019.1 - Chapter 3: state charts”
- 西村秀和監訳, “システムズモデリング言語 SysM”, 東京電機大学出版局
- The Mathworks Inc., “Stateflow ガイド”