JKI State Machine

LabVIEWのState Machineのデザインパターンを使っていて、次のようなことで困ったことはないでしょうか?

  • 状態A、B、CとA’、C’がある場合、A→B→CとA’→B→C’のように状態遷移をさせたい。

言葉にすると分かりにくいですが、状態Bまでどんな経路で来たかによって、Bのあとの状態遷移が変わるというケースです。ある地点で合流するけど、そこまでどうやって来たかによってそこからどう進むかが変わる感じです。…分かりにくいかもですね。上記の場合、状態BにAから来たのかA’から来たのかによって次の状態がCかC’で変わります。これを通常のState Machineで作ることはできなくはないですが、通常のState Machineは現在の状態(そこの処理結果)だけから次の状態を決める発想なので(だと私は思っているので)、過去の履歴はあまり考慮されていないと考えています。物理でいう保存量みたいなイメージを私は持っています。

とはいっても、実際のアプリケーションでは状態Bと同じ状態B’を作るのはメモリの無駄遣いな感じがしますし、並列処理をやるほど大げさでもない…ということは往々にしてあると思います。そういったときにうまい方法はあるのでしょうか?そういったときにJKI State Machineが役に立つかもしれません。…まあ、これが唯一の解決方法ではないですが。

JKI State Machineとは?

JKI State Machineとは、JKI社が作成したState MachineのようなLabVIEWのデザイン、または、アドオンです。

JKI – LabVIEW Software Consulting Company serving San Francisco Bay Area

JKIはJKI State MachineよりJKI DragonやVIパッケージマネージャー(VIPM)の印象のほうが強いかもしれません。JKI State MachineはサードパーティのJKI製のアドオンなので、使用する場合はVIPMからインストールする必要があります。

JKI State Machine Toolkit for LabVIEW – Download – VIPM by JKI

上記のリンクやVIPMで検索することでインストールできます。

通常のState Machineと比較した場合のJKI State Machineの特徴は次のような感じになります。…知らんけど。

  • Whileループ+ケースストラクチャの構造は通常のものと同じ。
  • 複数ケースで使いまわすパラメーターはクラスタ+シフトレジスタで使いまわすのも通常のものと同じ。
  • 状態の指定や遷移は文字列で行う。文字列の指定の仕方に作法がある。文字列にデータ的なものも入れられる。
  • キュー的な機能がある。ただし、実態は文字列を解読していて、キューは使っていない。
  • 専用の右クリックメニューがある。

キュー的なことができるので、状態遷移する経路を処理開始時に指定したり、処理中に経路変更や処理終了など柔軟に対応できます。

ブロックダイアグラムの確認

JKI State MachineはState Machineの派生と言えるので、サンプルコードを作るよりテンプレートを見たほうが手っ取り早いと思います。そのようなテンプレートがすでに関数パレットに用意されています。関数パレット → JKI Toolkits → JKI State MachineからJKI State Machineを選ぶと、ブロックダイアグラムにテンプレートを置くことができます。

image
関数パレット+ヘルプ
image
JKI State Machine

…正直なところ、ここに全部書いてあることがすべてだと思います。ここに従ってVIを作ってください。正直、JKI State Machineを使ったことないし。…では、不親切ですね。

JKI State MachineではState Queueという表現をしていますが、キューは使っていません。複数行からなる文字列の各行がState+データに対応しており、その行の集まりを最初の行から処理するので、キューと表現していると思われます。状態遷移を指示する場合は必要な場合は行を追加し、最初の行から取り出すので先入れ先出しになっています。いずれにしても、文字列をキューに見立てているので、この文字列には文法があります。文法はこんな感じです。

State Syntax:
StateCategory: State >> Argument
Line Terminator: Line feed

…「状態のカテゴリー: 状態名 >> パラメーター」という感じで、改行(LF、\n)で区切る感じです。パラメーター(Argument)部分は不要ならなくてもいいです。これだけだと私はよく分からなかったので、実際の例を見ます。

image

これはJKI State Machineの初期化をするときの状態遷移の指示です。

  1. Data: Initializeに遷移
  2. Initialize Core Dataに遷移
  3. UI: Initializeに遷移
  4. UI: Front Panel Stateに遷移。このときOpenのパラメーターで処理する。

…StateCategoryはなくてもいいみたいですね。2番目の状態遷移にStateCategoryないですし。あとでコードを解読するのに役に立つかもしれないといった程度だと思います。重要なのは改行で状態遷移の順番を決められるところと” >> “でパラメーターを入れられるところですね。パラメーターのある状態の処理はこんな感じです。

image

この場合はArgumentがOpenなどの場合に画面を開いたり、Closeなどなら画面を閉じたりします。自作のケースを追加する場合はこれを参考にするといいと思います。状態遷移の指示をする場合は、「Add State(s) to Queue (JKISM)」をコピーして使うのが楽です。文字列には文法があるので、用意されているサブVIを活用するのが有効です。

追加のショートカットメニュー

JKI State Machineを使っている状態でWhileループやケースストラクチャなどで右クリックをすると、「JKI State Machine Explorer…」などの見慣れないメニューがあることが分かります。

image
JKI State Machineのショートカットメニュー

試しに「Add Dynamic Events」を押すと…

image

…ユーザーイベントに関係するケースが作られました。上のユーザーイベント作成だけでなく、ユーザーイベントの破棄のケースも作られますし、「Macro: Initialize」や「Macro: Exit」ケースからユーザーイベントの作成や破棄のケースに遷移するように自動で状態遷移の文字列を書き換えてくれます。ただ、ユーザーイベントのクラスタはタイプ定義になっていないので、タイプ定義にしたほうがいいかもしれません。ついでにいうと、State Machineで使いまわすデータクラスタもタイプ定義ではないのでこれもタイプ定義にしたほうがいいと思います。

現在表示されている状態名のメニューを選ぶと次のようになります。

image

ここではAdd Dynamic Eventsでユーザーイベントを追加した後なので、Add Dynamic Eventsはなくなっています。Find Callersで現在のケースを呼び出すところを探せるのか~…便利そうだなぁ…

image

なんかエラーが出ました。複数か所から呼び出されているケースで同じことをすると、一瞬だけツリー?が表示されて消えます。私のインストールの仕方に問題があったのかもしれませんし、使っているLabVIEWバージョン(2026 Q3 Community 64bit)に問題があるのかもしれません。これは深追いしないほうがいいですね。深追いしたい人は「JKI SM Helper.llb\Execute JKI SM Helper – Actions.vi」を探し出してコードを修正すればいいんじゃないかな?知らんけど。

状態遷移の文字列で右クリック → Explore Statesを選ぶと、どんなふうに状態遷移するか追えるみたいです。これは便利ですね。

image

「JKI State Machine Explorer…」を選ぶと、次の画面が表示されます。

image

ここから選んだケースにジャンプすることができるようです。これも便利ですね。ケースの複製や名前変更なども右クリックでできるようです。

感想

今回はJKI State Machineの紹介をしました。個人的にはWhileループが1つだけですむようなアプリケーションなら便利だと感じました。ただ、これは日本人(2バイト文字民)特有の問題ですが、状態キュー(という名の文字列)をLabVIEWのシステム文字列で取り扱っているため、状態名を日本語でつけると痛い目に遭うかもしれません。UTF-8対応してくれるとありがたいですが…JKIがアップデートに積極的かどうか、この点に気づくかは謎です。アメリカで文字コードで困ることはあまりないでしょうし。あと、テンプレートにあるクラスタをタイプ定義にするのを忘れないように注意ですね。

じゃあ、JKI State Machineを積極的に使うか?
…Whileループ1つだけですむようなアプリケーションのあまり作らないので、そんなに使う機会はないかもです。最初に挙げた課題も普通のState Machineをベースに状態(という名のアクション)を表す列挙体をスカラーから1D配列にしたり、本物のキューを使ったりすることで履歴を持たせることができますし。

タイトルとURLをコピーしました